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,"金立%");
完