SpringDataJpa(一)(上)+https://developer.aliyun.com/article/1556643
2.6 使用JPA完成增删改查操作
在JpaTest.java里面,完成以下函数
2.6.1 保存
package cn.itcast.test; import cn.itcast.domain.Customer; import cn.itcast.utils.JpaUtils; import org.junit.Test; import javax.persistence.EntityManager; import javax.persistence.EntityTransaction; public class JpaTest { /** * 测试jpa的保存 * 案例:保存一个客户到数据库中 * Jpa的操作步骤 * 1.加载配置文件创建工厂(实体管理器工厂)对象 * 2.通过实体管理器工厂获取实体管理器 * 3.获取事务对象,开启事务 * 4.完成增删改查操作 * 5.提交事务(回滚事务) * 6.释放资源 */ @Test public void testSave() { // //1.加载配置文件创建工厂(实体管理器工厂)对象 // EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJpa"); // //2.通过实体管理器工厂获取实体管理器 // EntityManager em = factory.createEntityManager(); EntityManager em = JpaUtils.getEntityManager(); //3.获取事务对象,开启事务 EntityTransaction tx = em.getTransaction(); //获取事务对象 tx.begin();//开启事务 //4.完成增删改查操作:保存一个客户到数据库中 Customer customer = new Customer(); customer.setCustName("传智播客"); customer.setCustIndustry("1教育"); //保存, em.persist(customer); //保存操作 //5.提交事务 tx.commit(); //6.释放资源 em.close(); // factory.close(); } }
2.6.2 修改
@Test public void testUpdate() { //1.通过工具类获取entityManager EntityManager entityManager = JpaUtils.getEntityManager(); //2.开启事务 EntityTransaction tx = entityManager.getTransaction(); tx.begin(); //3.增删改查 -- 更新操作 //i 查询客户 Customer customer = entityManager.find(Customer.class,1l); //ii 更新客户 customer.setCustIndustry("it教育"); entityManager.merge(customer); //4.提交事务 tx.commit(); //5.释放资源 entityManager.close(); }
2.6.3 删除
@Test public void testRemove() { EntityManager entityManager = JpaUtils.getEntityManager(); EntityTransaction tx = entityManager.getTransaction(); tx.begin(); //3.增删改查 -- 删除客户 //i 根据id查询客户 Customer customer = entityManager.find(Customer.class,1l); //ii 调用remove方法完成删除操作 entityManager.remove(customer); tx.commit(); entityManager.close(); }
2.6.4 根据id查询
/** * 查询一个: 使用立即加载的策略 */ @Test public void testGetOne() { // 定义对象 EntityManager em = null; EntityTransaction tx = null; try { em = JPAUtil.getEntityManager(); tx = em.getTransaction(); tx.begin(); // 执行操作 Customer c1 = em.find(Customer.class, 1L); // 提交事务 tx.commit(); System.out.println(c1); // 输出查询对象 } catch (Exception e) { // 回滚事务 tx.rollback(); e.printStackTrace(); } finally { // 释放资源 em.close(); } } // 查询实体的缓存问题 @Test public void testGetOne() { // 定义对象 EntityManager em = null; EntityTransaction tx = null; try { em = JPAUtil.getEntityManager(); tx = em.getTransaction(); tx.begin(); // 执行操作 Customer c1 = em.find(Customer.class, 1L); Customer c2 = em.find(Customer.class, 1L); System.out.println(c1 == c2);// 输出结果是true,EntityManager也有缓存 // 提交事务 tx.commit(); System.out.println(c1); } catch (Exception e) { tx.rollback(); e.printStackTrace(); } finally { em.close(); } } // 延迟加载策略的方法: /** * 查询一个: 使用延迟加载策略 */ @Test public void testLoadOne() { EntityManager em = null; EntityTransaction tx = null; try { em = JPAUtil.getEntityManager(); tx = em.getTransaction(); tx.begin(); // 执行操作 Customer c1 = em.getReference(Customer.class, 1L); tx.commit(); System.out.println(c1); } catch (Exception e) { tx.rollback(); e.printStackTrace(); } finally { em.close(); } }
2.7 JPQL查询
Java Persistence Query Language
基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起。使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。
其特征与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表的属性。
2.7.1 查询全部
延用上述代码,用JpqlTest.java替代JpaTest.java进行查询
JpqlTest.java
package cn.itcast.test; import cn.itcast.domain.Customer; import cn.itcast.utils.JpaUtils; import org.junit.Test; import javax.persistence.EntityManager; import javax.persistence.EntityTransaction; import javax.persistence.Query; import java.util.List; /** * 测试jqpl查询 */ public class JpqlTest { /** * 查询全部 * jqpl:from cn.itcast.domain.Customer * sql:SELECT * FROM cst_customer */ @Test public void testFindAll() { EntityManager em = JpaUtils.getEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); //3.查询全部 String jpql = "from Customer "; Query query = em.createQuery(jpql);//创建Query查询对象,query对象才是执行jqpl的对象 //发送查询,并封装结果集 List list = query.getResultList(); for (Object obj : list) { System.out.print(obj); } tx.commit(); em.close(); } }
2.7.2 分页查询
@Test public void findPaged () { EntityManager em = null; EntityTransaction tx = null; try { em = JPAUtil.getEntityManager(); tx = em.getTransaction(); tx.begin(); //创建query对象 String jpql = "from Customer"; Query query = em.createQuery(jpql); //起始索引 query.setFirstResult(0); //每页显示条数 query.setMaxResults(2); //查询并得到返回结果 List list = query.getResultList(); //得到集合返回类型 for (Object object : list) { System.out.println(object); } tx.commit(); } catch (Exception e) { tx.rollback(); e.printStackTrace(); } finally { em.close(); } }
2.7.3 条件查询
@Test public void findCondition () { EntityManager em = null; EntityTransaction tx = null; try { em = JPAUtil.getEntityManager(); tx = em.getTransaction(); tx.begin(); //创建query对象 String jpql = "from Customer where custName like ? "; Query query = em.createQuery(jpql); //对占位符赋值,从1开始 query.setParameter(1, "传智播客%"); //查询并得到返回结果 Object object = query.getSingleResult(); //得到唯一的结果集对象 System.out.println(object); tx.commit(); } catch (Exception e) { tx.rollback(); e.printStackTrace(); } finally { em.close(); } }
2.8.4 排序查询
//根据客户id倒序查询所有客户 //查询所有客户 @Test public void testOrder() { EntityManager em = null; EntityTransaction tx = null; try { em = JPAUtil.getEntityManager(); tx = em.getTransaction(); tx.begin(); // 创建query对象 String jpql = "from Customer order by custId desc"; Query query = em.createQuery(jpql); // 查询并得到返回结果 List list = query.getResultList(); // 得到集合返回类型 for (Object object : list) { System.out.println(object); } tx.commit(); } catch (Exception e) { tx.rollback(); e.printStackTrace(); } finally { em.close(); } }
2.8.5 统计查询
@Test public void findCount() { EntityManager em = null; EntityTransaction tx = null; try { em = JPAUtil.getEntityManager(); tx = em.getTransaction(); tx.begin(); // 查询全部客户 // 1.创建query对象 String jpql = "select count(custId) from Customer"; Query query = em.createQuery(jpql); // 2.查询并得到返回结果 Object count = query.getSingleResult(); // 得到集合返回类型 System.out.println(count); tx.commit(); } catch (Exception e) { tx.rollback(); e.printStackTrace(); } finally { em.close(); } }