四、入门案例--增删改查
1.jpa的操作步骤
1.加载配置文件创建工厂(实体管理类工厂)对象
2.通过实体管理类工厂获取实体管理类
3.获取事务对象,开启事务
4.完成增删改查
5.提交事务(回滚事务)
6.释放资源
2.基本操作的详细介绍
1.加载配置文件创建实体管理器工厂
EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("myJpa");
根据持久化单元名称创建实体管理器工厂,持久化单元名称就是配置文件中
persistence-unit的name属性
2.根据实体管理器工厂,创建实体管理器
//通过实体管理器工厂获取实体管理器
EntityManager em = myJpa.createEntityManager();
EntityManager内部维护的很多的内容
内部维护了数据库信息,
维护了缓存信息
维护了所有的实体管理器对象
EntityManagerFactory是一个线程安全的对象
3.创建事务对象,开启事务
//3.获取事务对象
EntityTransaction tx = em.getTransaction();
Transaction 对象 : 事务
begin:开启事务
commit:提交事务
rollback:回滚
4.增删改查操作
presist : 保存
merge : 更新
remove : 删除
find/getRefrence : 根据id查询
5.提交事务或者回滚事务
tx.commit();
tx.rollback();
6.释放资源
//先申请的后释放 //先释放实体管理器--EntityManager //后释放实体管理器工厂--EntityManagerFactory
五、代码实战
使用JPA封装好的方法
/** * @Author: Promsing(张有博) * @Date: 2021/10/16 - 8:41 * @Description: jpa的测试类,完成增删改查操作 * @version: 1.0 */ public class JpaTest { /** * 保存操作 * persist(Object) * */ @Test public void testSave(){ //1.加载配置文件创建工厂对象 EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("myJpa"); //2.通过实体管理器工厂获取实体管理器 EntityManager em = myJpa.createEntityManager(); //3.获取事务对象,开启事务 EntityTransaction tx = em.getTransaction(); tx.begin(); //4.完成增删改查操作 Customer customer=new Customer(); customer.setCustName("小小张自由"); customer.setCustAddress("廊坊"); customer.setCustIndustry("教育"); customer.setCustLevel("高级"); customer.setCustPhone("1502800"); customer.setCustSource("邯郸"); //5.保存,提交事务 em.persist(customer); tx.commit(); //7.释放资源 em.close(); myJpa.close(); } /** * 根据id查询 * find(需要封装实体类的字节码文件,主键值) * 立即加载,获取实体对象,立即执行SQL语句,查询数据库 */ @Test public void testFind(){ //1.加载配置文件创建工厂对象 EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("myJpa"); //2.通过实体管理器工厂获取实体管理器 EntityManager em = myJpa.createEntityManager(); //3.获取事务对象,开启事务 EntityTransaction tx = em.getTransaction(); tx.begin(); //4.完成增删改查操作 /** * find(需要封装实体类的字节码文件,主键值) * 立即加载,获取实体对象,立即执行SQL语句,查询数据库 */ Customer customer = em.find(Customer.class, 2L); System.out.println(customer); //5.保存,提交事务 tx.commit(); //7.释放资源 em.close(); myJpa.close(); } /** * 根据id查询 * getReference(需要封装实体类的字节码文件,主键值) * 延迟加载(懒加载),获取动态代理对象,延迟执行SQL语句, * 当使用到代理对象时,查询数据库 */ @Test public void testReference(){ //1.加载配置文件创建工厂对象 EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("myJpa"); //2.通过实体管理器工厂获取实体管理器 EntityManager em = myJpa.createEntityManager(); //3.获取事务对象,开启事务 EntityTransaction tx = em.getTransaction(); tx.begin(); //4.完成增删改查操作 /** * getReference(需要封装实体类的字节码文件,主键值) * 延迟加载,获取动态代理对象,延迟执行SQL语句, * 当使用到代理对象时,查询数据库 */ Customer customer = em.getReference(Customer.class, 2L); System.out.println(customer); //5.保存,提交事务 tx.commit(); //7.释放资源 em.close(); myJpa.close(); } /** * 删除客户的案例 * remove(Object) */ @Test public void testRemove(){ //1.加载配置文件创建工厂对象 EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("myJpa"); //2.通过实体管理器工厂获取实体管理器 EntityManager em = myJpa.createEntityManager(); //3.获取事务对象,开启事务 EntityTransaction tx = em.getTransaction(); tx.begin(); //4.完成增删改查操作 //根据id先查询用户 Customer customer = em.find(Customer.class, 2L); //调用remove方法,完成删除操作 em.remove(customer); //5.保存,提交事务 tx.commit(); //7.释放资源 em.close(); myJpa.close(); } /** * 更新客户的案例 * merge(Object) */ @Test public void testUpdate(){ //1.加载配置文件创建工厂对象 EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("myJpa"); //2.通过实体管理器工厂获取实体管理器 EntityManager em = myJpa.createEntityManager(); //3.获取事务对象,开启事务 EntityTransaction tx = em.getTransaction(); tx.begin(); //4.完成增删改查操作 //根据id先查询用户 Customer customer = em.find(Customer.class, 1L); //调用remove方法,完成删除操作 customer.setCustIndustry("架构师"); em.merge(customer); //5.保存,提交事务 tx.commit(); //7.释放资源 em.close(); myJpa.close(); } }
使用JPQL查询
JPQL(Java持久性查询语言)是一种面向对象的查询语言,用于对持久实体执行数据库操作。 JPQL不使用数据库表,而是使用实体对象模型来操作SQL查询。旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。
其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性。
package com.dynamic.test; import org.junit.Before; import org.junit.Test; import javax.persistence.*; import java.util.List; /** * @Author: Promsing(张有博) * @Date: 2021/10/17 - 9:48 * @Description: JPQL的测试类 * @version: 1.0 */ public class JpqlTest { private EntityManager em; @Before public void testBefore(){ //1.加载配置文件创建工厂对象 EntityManagerFactory myJpa = Persistence.createEntityManagerFactory("myJpa"); //2.通过实体管理器工厂获取实体管理器 em = myJpa.createEntityManager(); } /** * 查询全部 * sql:SELECT * FROM `cst_customer` * jqpl:from com.dynamic.domain.Customer 或者from Customer */ @Test public void testFindAll(){ //将第一第二步封装起来, //在@test执行之前执行Before //3.获取事务对象,开启事务 EntityTransaction tx = em.getTransaction(); tx.begin(); //4.完成增删改查操作 String jqpl="from com.dynamic.domain.Customer"; Query query = em.createQuery(jqpl); //发送查询,并封装结果集 List resultList = query.getResultList(); for (Object o : resultList) { System.out.println(o); System.out.println(); } //5.提交事务 tx.commit(); //7.释放资源 em.close(); // myJpa.close(); } /** * 排序查询,根据id倒叙 * sql:SELECT * FROM `cst_customer` ORDER BY cust_id desc ; * jqpl:from Customer order by custId desc */ @Test public void testOrders(){ //将第一第二步封装起来, //在@test执行之前执行Before //3.获取事务对象,开启事务 EntityTransaction tx = em.getTransaction(); tx.begin(); //4.完成增删改查操作 String jqpl="from Customer order by id desc"; Query query = em.createQuery(jqpl); //发送查询,并封装结果集 List resultList = query.getResultList(); for (Object o : resultList) { System.out.println(o); System.out.println(); } //5.提交事务 tx.commit(); //7.释放资源 em.close(); // myJpa.close(); } /** * 统计查询,使用count * sql:SELECT COUNT(cust_id) FROM `cst_customer`; * jqpl:SELECT COUNT(id) FROM Customer */ @Test public void testCount(){ //将第一第二步封装起来, //在@test执行之前执行Before //3.获取事务对象,开启事务 EntityTransaction tx = em.getTransaction(); tx.begin(); //4.完成增删改查操作 String jqpl="SELECT COUNT(id) FROM Customer"; Query query = em.createQuery(jqpl); //发送查询,并封装结果集 Object singleResult = query.getSingleResult(); System.out.println(singleResult); //5.提交事务 tx.commit(); //7.释放资源 em.close(); // myJpa.close(); } /** * 分页查询 * SQL语句:SELECT * FROM `cst_customer` LIMIT 0,2 * jpql语句:使用Query对象 */ @Test public void testPaged(){ //将第一第二步封装起来, //在@test执行之前执行Before //3.获取事务对象,开启事务 EntityTransaction tx = em.getTransaction(); tx.begin(); //4.完成增删改查操作 String jqpl="from Customer"; Query query = em.createQuery(jqpl); //起始索引 query.setFirstResult(0); //每次查询的长度 query.setMaxResults(2); //发送查询,并封装结果集 List resultList = query.getResultList(); for (Object o : resultList) { System.out.println(o); } //5.提交事务 tx.commit(); //7.释放资源 em.close(); // myJpa.close(); } /** * 条件查询 * SQL语句:SELECT * FROM `cst_customer` where cust_name LIKE '%自由%' * jpql语句:from Customer where custName like ? */ @Test public void testCondition(){ //将第一第二步封装起来, //在@test执行之前执行Before //3.获取事务对象,开启事务 EntityTransaction tx = em.getTransaction(); tx.begin(); //4.完成增删改查操作 String jqpl="from Customer where custName like ?"; Query query = em.createQuery(jqpl); //给占位符赋值,占位符从1开始 query.setParameter(1,"%自由%"); //发送查询,并封装结果集 List resultList = query.getResultList(); for (Object o : resultList) { System.out.println(o); } //5.提交事务 tx.commit(); //7.释放资源 em.close(); // myJpa.close(); } }