jpa01

JPA

 

Java Persistence API, 即Java 持久化API

JPA规范本质上就是一种ORM规范,提供了一些编程的API接口,但具体实现则由服务厂商来提供实现。   

 

 

 

 

入门案例

1.创建maven ,导入坐标

2.配置jpa的核心配置文件,创建在META-INFO目录下,persistence.xml

3.编写客户实体类

4.配置实体类和表

5.保存

 

pom.xml

 1   <properties>
 2         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 3         <project.hibernate.version>5.0.7.Final</project.hibernate.version>
 4     </properties>
 5 
 6     <dependencies>
 7         <!-- junit -->
 8         <dependency>
 9             <groupId>junit</groupId>
10             <artifactId>junit</artifactId>
11             <version>4.12</version>
12             <scope>test</scope>
13         </dependency>
14 
15         <!-- hibernate对jpa的支持包 -->
16         <dependency>
17             <groupId>org.hibernate</groupId>
18             <artifactId>hibernate-entitymanager</artifactId>
19             <version>${project.hibernate.version}</version>
20         </dependency>
21 
22         <!-- c3p0 -->
23         <dependency>
24             <groupId>org.hibernate</groupId>
25             <artifactId>hibernate-c3p0</artifactId>
26             <version>${project.hibernate.version}</version>
27         </dependency>
28 
29         <!-- log日志 -->
30         <dependency>
31             <groupId>log4j</groupId>
32             <artifactId>log4j</artifactId>
33             <version>1.2.17</version>
34         </dependency>
35 
36         <!-- Mysql and MariaDB -->
37         <dependency>
38             <groupId>mysql</groupId>
39             <artifactId>mysql-connector-java</artifactId>
40             <version>5.1.6</version>
41         </dependency>

 

persistence.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
 3 
 4 <!--需要配置persistence-unit节点
 5         持久化单元,name 持久化单元名称
 6         transaction-type:事务管理方式
 7             JTA:分布式事务管理
 8             RESOURCE_lOCAL 本地事务管理
 9 -->
10  <persistence-unit name="myJpa" transaction-type="RESOURCE_LOCAL">
11     <!-- -jpa实现方式-->
12     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
13 
14     <!-- 数据库信息-->
15     <properties>
16         <property name="javax.persistence.jdbc.user" value="root"/>
17         <property name="javax.persistence.jdbc.password" value="root"/>
18         <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
19         <property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/>
20 
21         <!--配置jpa实现方的(hibernate)的配置信息
22         显示sql false |true
23         create :程序运行时创建数据库,表,有表,先删除
24         update : 程序运行时,如果有表,不会创建表
25         none :不会创建表
26         -->
27         <property name="hibernate.show_sql" value="true"/>
28         <property name="hibernate.hbm2ddl.auto" value="update"/>
29     </properties>
30     <!--可选配置,配置jpa实现方的配置信息-->
31  </persistence-unit>
32 </persistence>

 

创建domain实体类,jpa注解配置映射关系

实体类和表的映射关系
实体类的属性和表的字段映射关系


@Entity:声明实体类
@Table:声明实体类和表的映射关系   name="表名"
@Id 声明主键

@Column 属性和表字段的映射关系 name="字段名"
@GeneratedValue:配置主键生成策略   @GeneratedValue(strategy = GenerationType.IDENTITY)

GenerationType.IDENTITY :自增,mysql ,底层数据库必须支持自动增长(底层数据库支持的自动增长方式,对id自增)
GenerationType.SEQUENCE : 序列,oracle ,底层数据库必须支持序列
GenerationType.TABLE : jpa提供的一种机制,通过一张数据库表的形式帮助我们完成主键自增
GenerationType.AUTO : 由程序自动的帮助我们选择主键生成策略

 

 

Persistence对象主要作用是用于获取EntityManagerFactory对象的 。通过调用该类的createEntityManagerFactory静态方法,根据配置文件中持久化单元名称创建EntityManagerFactory。

 

EntiryManagerFactory

EntityManagerFactory 接口主要用来创建 EntityManager 实例,是一个线程安全的对象,并且EntityManagerFactory 的创建极其浪费资源,创建时只需要做到一个工程只存在一个EntityManagerFactory 即可

 

EntityManager

EntityManager是完成持久化操作的核心对象。实体类作为普通 java对象,只有在调用 EntityManager将其持久化后才会变成持久化对象。EntityManager对象在一组实体类与底层数据源之间进行 O/R 映射的管理

通过调用EntityManager的方法完成获取事务,以及持久化数据库的操作

getTransaction : 获取事务对象

persist : 保存操作

merge : 更新操作

remove : 删除操作

find/getReference : 根据id查询

 

EntityTransaction

EntityTransaction是完成事务操作的核心对象

begin:开启事务

commit:提交事务

rollback:回滚事务

 

 

解决实体管理器工厂的浪费资源和耗时问题

通过静态代码块的形式,当程序第一次访问此工具类时,创建一个公共的实体管理器工厂对象

 1 public class JpaUtils {
 2 
 3     private static EntityManagerFactory factory;
 4 
 5     static  {
 6         //1.加载配置文件,创建entityManagerFactory
 7         factory = Persistence.createEntityManagerFactory("myJpa");
 8     }
 9     /**
10      * 获取EntityManager对象
11      */
12     public static EntityManager getEntityManager() {
13        return factory.createEntityManager();
14     }
15 }

 

save

 1     /**
 2      * 测试jpa的保存
 3      * jpa的操作步骤
 4          * 1.加载配置文件创建工厂
 5          * 2.通过实体管理类创建实体管理器
 6          * 3.获取事务对象开启事务
 7          * 4.完成增删改查操作
 8          * 5.提交事务
 9          * 6.释放资源
10      */
11 
12     @Test
13     public void testSave(){
14 //        EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa");
15 //        EntityManager em = factory.createEntityManager();
16 
17         EntityManager em = JpaUtils.getEntityManager();
18 
19         EntityTransaction tx = em.getTransaction();
20         tx.begin();
21         Customer customer = new Customer();
22         customer.setCustName("金立手机");
23         customer.setCustIndustry("金立");
24         em.persist(customer);
25         //提交事务
26         tx.commit();
27         em.close();
28  //    factory.close();
29     }

Test

 1     /**
 2      * 根据id查询客户
 3      * 通过工具类获取entityManager
 4          开启事务
 5          增删改差
 6          提交事务
 7          释放资源
 8      */
 9 
10     @Test
11     public void testFind(){
12         EntityManager entityManager = JpaUtils.getEntityManager();
13         EntityTransaction tx = entityManager.getTransaction();
14         tx.begin();
15 
16         Customer customer = entityManager.find(Customer.class,1l);
17         System.out.println(customer);
18 
19 //     entityManager.remove(customer)
20 
21 //        customer.setCustName("zhangsan");
22 //        entityManager.merge(customer);
23 
24         tx.commit();
25         entityManager.close();
26     }

fing与getReference

find立即查找

getReference 延迟加载,得到的时一个动态代理对象,不会立即发送sql语句

 

 

jpql

Java Persistence Query Language,其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性。

sql 查询的是表和表中的字段

jpql 查询的是实体类和类中的属性

 

findall

 1     /**
 2      * 查询全部
 3      *   jpql:from com.jpa.domain.Customer
 4      *              类的全限定名
 5      *   sql:select * from cst_customer
 6      *
 7      *   1.获取entiryManager对象
 8      *   2.开启事务
 9      *   3.查询全部
10      *   4.提交事务
11      *   5.释放资源
12      */
13     @Test
14     public void testFindAll(){
15         EntityManager em = JpaUtils.getEntityManager();
16         EntityTransaction tx = em.getTransaction();
17         tx.begin();
18         String jpal = "from com.jpa.domain.Customer";
19         Query query = em.createQuery(jpal);
20 
21         List list  = query.getResultList();
22 
23         for (Object obj :list){
24             System.out.println(obj);
25         }
26         tx.commit();
27         em.close();
28     }

条件查询

/**
* 1.创建query查询对象
* 2.对参数进行赋值
* 3.查询,并得到返回结果
*/

排序查询

1  String jpal = "from Customer order by custId desc";
2         Query query = em.createQuery(jpal);
3 
4         List list  = query.getResultList();
5 
6         for (Object obj :list){
7             System.out.println(obj);
8         }

分页查询

 1         String jpal = " from Customer";
 2         Query query = em.createQuery(jpal);
 3         
 4         //起始索引
 5         query.setFirstResult(0);
 6         //每页查询条数
 7         query.setMaxResults(1);
 8 
 9         List list = query.getResultList();
10         for (Object obj :list){
11             System.out.println(obj);
12         }

条件查询

1       // sql   select * from cst_customer where cust_name like ?
2       String jpal = " from Customer where custName like ? ";
3          Query query = em.createQuery(jpal);
4          query.setParameter(1,"金立%");

 

 

 

 

 

 

 

 

 

 

 

 

     

posted @ 2019-08-31 14:58  曲阳阳  阅读(158)  评论(0编辑  收藏  举报