JPA的个人小结

JPA的个人小结

原生Jpa的概念和操作

什么是原生Jpa

JPA的全称是Java Persistence API, 即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成。

JPA通过JDK 5.0注解描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

Jpa 的入门

一,创建Maven 工程导入Pom.xml坐标

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>Jpa-test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.hibernate.version>5.0.7.Final</project.hibernate.version>
    </properties>
    <dependencies>
        <!-- junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <!-- hibernate对jpa的支持包 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>${project.hibernate.version}</version>
        </dependency>

        <!-- c3p0 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>${project.hibernate.version}</version>
        </dependency>

        <!-- log日志 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!-- Mysql and MariaDB -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
    </dependencies>

</project>

二,在META-INF 中创建名为"Persistence.xml"资源配置文件

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <!--配置持久化单元
		name:持久化单元名称
		transaction-type:事务类型
		 	RESOURCE_LOCAL:本地事务管理 我们当前是为本地操作
		 	JTA:分布式事务管理 -->
    <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
        <!--配置JPA规范 服务提供商-->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <!--配置数据库-->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <!-- 数据库地址 -->
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/customer" />
            <!-- 数据库用户名 -->
            <property name="javax.persistence.jdbc.user" value="root" />
            <!-- 数据库密码 -->
            <property name="javax.persistence.jdbc.password" value="1024" />
			<!-- 因为hibernate 提供了JPA的实现也可以配置Hibernate 中属性-->
            <property name="hibernate.show_sql" value="true" /> <!-- 显示sql -->
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="update" /><!--创建生成策略 -->
        </properties>
    </persistence-unit>
</persistence>

log4j配置文件

# Global logging configuration
log4j.rootLogger=DEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapper=TRACE
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

三,配置实体类属性

在实体类中要配置实体类属性和表中对应的属性,这里我以我创建的客户表为例

@Entity

​ 作用:指定当前类是实体类。

@Table

​ 作用:指定实体类和表之间的对应关系。

​ 属性:

​ name:指定数据库表的名称

@Id

​ 作用:指定当前字段是主键。

@GeneratedValue

​ 作用:指定主键的生成方式。。

​ 属性:

strategy :指定主键生成策略。

@Column

​ 作用:指定实体类属性和数据库表之间的对应关系

​ 属性:

name:指定数据库表的列名称。

​ unique:是否唯一

​ nullable:是否可以为空

​ inserttable:是否可以插入

​ updateable:是否可以更新

​ columnDefinition: 定义建表时创建此列的DDL

​ secondaryTable: 从表名。如果此列不建在主表上(默认建在主表),该属性定义该列所在从表的名字搭建开发环境[重点] *这个不清楚

package com.wym.Entity;

import javax.persistence.*;

@Entity
@Table(name = "customer_table")
public class Customer {
    
    
    @Id//声明当前私有主键
    @GeneratedValue(strategy = GenerationType.IDENTITY)//主键生成策略
    @Column(name = "id")
    private Integer id;
    @Column(name = "name")
    private String name;
    @Column(name = "sex")
    private String sex;
    @Column(name = "tell")
    private Integer tell;
    @Column(name = "addr")
    private String addr;
    public Integer getId() {
    
    
        return id;
    }

    public void setId(Integer id) {
    
    
        this.id = id;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public String getSex() {
    
    
        return sex;
    }

    public void setSex(String sex) {
    
    
        this.sex = sex;
    }

    public Integer getTell() {
    
    
        return tell;
    }

    public void setTell(Integer tell) {
    
    
        this.tell = tell;
    }

    public String getAddr() {
    
    
        return addr;
    }

    public void setAddr(String addr) {
    
    
        this.addr = addr;
    }

    @Override
    public String toString() {
    
    
        return "Customer{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", tell=" + tell +
                ", addr='" + addr + '\'' +
                '}';
    }
}

四,配置Jpa 的管理器

     //获取配置文件得到Factory
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
        //创建实体类管理对象
        EntityManager em = factory.createEntityManager();
        //获取事务对象
        EntityTransaction transaction = em.getTransaction();
        //开启事务
        transaction.begin();
        Customer customer=new Customer();
        customer.setName("廖伟");
        customer.setAddr("井冈山");
        em.persist(customer);//添加数据
        //提交事务
        transaction.commit();
        //释放资源
        em.close();
        factory.close();

五,优化Jpa 的创建过程 抽取一个工具类

package com.wym.Entity.Utils;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 * Jpa工具类
 */
public class JpaUtil {
    
    
    // JPA的实体管理器工厂:相当于Hibernate的SessionFactory
    private static EntityManagerFactory factory=null;
    // 使用静态代码块赋值
    static{
    
    
      factory = Persistence.createEntityManagerFactory("myJpa");
    }

    /**
     * 提供一个方法管理对象
     */
    public static EntityManager getFactory(){
    
    
        return  factory.createEntityManager();
    }

}

Jpa的CRUD 操作


    /**
     * EntityManager:提供了crud 的方法
     * getTransaction : 获取事务对象
     * 	persist : 保存操作
     * 	merge : 更新操作
     * 	remove : 删除操作
     * 	find/getReference : 根据id查询
     */

上面我们创建了JpaUtils下面我们使用这个JpaUtils 工具类

一 ,保存操作persist

 @Test
    public  void  testUtil(){
    
    
        EntityManager me = JpaUtil.getFactory();
        EntityTransaction transaction = me.getTransaction();
        transaction.begin();
        try {
    
    
            Customer customer = new Customer();
            customer.setName("wengyanmin");
            customer.setSex("男");
            customer.setAddr("江西");
            customer.setTell(19312312);

            me.persist(customer);//保存
            transaction.commit();
        } catch (Exception e) {
    
    
            e.printStackTrace();
            transaction.rollback();
        }
        me.close();
    }

二,更新数据merge

 @Test
    public void testMerge(){
    
    
        EntityManager me = JpaUtil.getFactory();
        EntityTransaction transaction = me.getTransaction();
        transaction.begin();
        try {
    
    
            //查询前要先查询出对象
            Customer customer = me.find(Customer.class, 1l);
            customer.setAddr("深圳");
            //修改
            me.merge(customer);
            transaction.commit();
        } catch (Exception e) {
    
    
            e.printStackTrace();
            transaction.rollback();
        }
        me.close();
    }

三,删除数据remove

    @Test
    public void testDelete(){
    
    
        EntityManager me = JpaUtil.getFactory();
        EntityTransaction transaction = me.getTransaction();
        transaction.begin();
        try {
    
    
            //查询前要先查询出对象
            Customer customer = me.find(Customer.class, 1l);
            //删除
            me.remove(customer);
            transaction.commit();
        } catch (Exception e) {
    
    
            e.printStackTrace();
            transaction.rollback();
        }
        me.close();
    }

四,查询find 和 getReference

   /**
     * 查询 根据id
     * find :直接获取对象本体
     * getReference:延迟加载
     */
@Test
    public void testFind(){
    
    
        EntityManager me = JpaUtil.getFactory();
        EntityTransaction transaction = me.getTransaction();
        transaction.begin();
        try {
    
    
            //查询前要先查询出对象
            //Customer customer = me.find(Customer.class, 1l);
            Customer c1 = me.find(Customer.class, 1L);
            Customer c2 = me.find(Customer.class, 1L);
            System.out.println(c1==c2);
            //返回true 有缓存
            //getReference:延迟加载
            Customer reference = me.getReference(Customer.class, 1l);
            //删除
            transaction.commit();
        } catch (Exception e) {
    
    
            e.printStackTrace();
            transaction.rollback();
        }
        me.close();
    }

Jpa的复杂查询

jpa提供了一套复杂查询的 方式,就是使用JPQl,下面使用JPQL 来进行复杂的查询,JPQL 的语法是使用实体类中属性来进行语句的书写

一, 查询所有

@Test
    public  void test1(){
    
    
        EntityManager manager = JpaUtil.getFactory();
        EntityTransaction tx = manager.getTransaction();

        tx.begin();
        String jql="from  Customer ";
        Query query = manager.createQuery(jql);
        List resultList = query.getResultList();
        for (Object cus:resultList
             ) {
    
    
            System.out.println(((Customer)cus));
        }
        tx.commit();

        manager.close();
    }

二,分页查询

 @Test
    public  void testLimit(){
    
    
        EntityManager manager = JpaUtil.getFactory();
        EntityTransaction tx = manager.getTransaction();

        tx.begin();
        String jql="from  Customer ";
        Query query = manager.createQuery(jql);
        //起始索引
        query.setFirstResult(1);
        //每页显示条数
        query.setMaxResults(2);

        List resultList = query.getResultList();
        for (Object cus:resultList
        ) {
    
    
            System.out.println(((Customer)cus));
        }
        tx.commit();
        manager.close();
    }

三,条件查询

模糊查询:
 @Test
    public void testFindCondition(){
    
    
        EntityManager manager = JpaUtil.getFactory();
        EntityTransaction tx = manager.getTransaction();

        tx.begin();
        String jql="from Customer where  name like ?";
        Query query = manager.createQuery(jql);
        //站位符
        query.setParameter(1, "weng%");

        //返回对象
        Object singleResult = query.getSingleResult();
        System.out.println(singleResult);
        tx.commit();
        manager.close();
    }
 /**
     * 下面的不写了:
     * 
     * 排序查询:
     *  jql: from Customer order by id desc
     *  统计查询:
     *  jql
     *  select count(id) from Customer
     */

以上是我在学习jpa 后进行的学习小结,希望能帮助到在学习的朋友们

猜你喜欢

转载自blog.csdn.net/weng74/article/details/103991048