🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
`JpaUtils.java`代码 ~~~ package net.youworker.utils; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; /** * 解决实体管理器工厂的浪费资源和耗时问题 * 通过静态代码块的形式,当程序第一次访问此工具类时, * 创建一个公共的实体管理器工厂对象 * * 第一次访问getEntityManager()方法: 经过静态代码块创建一个factory对象,再调用方法创建一个EntityManager对象 * 第二次访问getEntityManager()方法: 直接通过一个已经创建好的factory对象,创建EntityManager对象 * * @author: hcf * @qq: 46914685 * @email: 46914685@qq.com * @date: 2020-01-06 11:49 */ public class JpaUtils { private static EntityManagerFactory factory; static { //1.加载配置文件,创建entityManagerFactory factory = Persistence.createEntityManagerFactory("myJPA"); } /** * 获取EntityManager对象 */ public static EntityManager getEntityManager() { return factory.createEntityManager(); } } ~~~ ***** 测试代码 ` JpaTest.java` ~~~ package net.youworker; import net.youworker.domain.Customer; import net.youworker.utils.JpaUtils; import org.junit.Test; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; /** * @author: hcf * @qq: 46914685 * @email: 46914685@qq.com * @date: 2020-01-06 1:13 */ public class JpaTest { /** * 测试jpa的保存 * 案例:保存一个客户到数据库中 * jpa的操作步骤: * 1.加载配置文件创建工工厂(实体管理类工厂)对象 * 2.通过实体管理类工厂获取实体管理器 * 3.获取事务对象,开启事务 * 4.完成增删改查操作 * 5.提交事务或回滚事务 * 6.释放资源 */ @Test public void testSave() { //// 1.加载配置文件创建工工厂(实体管理类工厂)对象 // EntityManagerFactory factory = Persistence.createEntityManagerFactory("myJPA"); //// 2.通过实体管理类工厂获取实体管理器 // EntityManager entityManager = factory.createEntityManager(); EntityManager entityManager = JpaUtils.getEntityManager(); // 3.获取事务对象,开启事务 EntityTransaction transaction = entityManager.getTransaction(); //开启事务 transaction.begin(); // 4.完成增删改查操作: 保存一个客户到数据库中 Customer customer = new Customer(); customer.setCustName("有蜗壳1"); customer.setCustIndustry("教育2"); customer.setCustAddress("南宁"); customer.setCustLevel("dsds"); customer.setCustSource("sdswe"); customer.setCustPhone("18777162107"); //保存 entityManager.persist(customer); //保存操作 // 5.提交事务或回滚事务 transaction.commit(); // 6.释放资源 entityManager.close(); // factory.close(); } /** * 根据id查询客户 * 使用find方法查询 * 1.查询的对象就是当前对象本身 * 2.在调用find方法的时候,就会发送sql语句查询 * * 立即加载 */ @Test public void testFind(){ //1.通过工具类获取entityManager EntityManager entityManager = JpaUtils.getEntityManager(); //2.开启事务 EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); //3.增删改查 /** * find 根据id查询数据 * class: 查询数据的结果需要包装的实体类类型的字节码 * id: 查询的主键的取值 */ Customer customer = entityManager.find(Customer.class,7L); //4.提交事务 transaction.commit(); //5释放资源 entityManager.close(); System.out.println(customer); } /** * 根据id查询客户 * * getReference方法 * 1.获取的对象是一个动态代理对象 * 2.调用getReference方法不会立即发送sql语句查询数据库 * 当调用查询对象的时候,才会发送查询的sql语句:什么时候用, * 什么时候发送sql语句查询数据库 * * 延迟加载(懒加载) * 得到的是一个动态代理对象 * 什么时候用,什么时候才会执行sql */ @Test public void testReference(){ //1.通过工具类获取entityManager EntityManager entityManager = JpaUtils.getEntityManager(); //2.开启事务 EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); //3.增删改查 /** * getReference 根据id查询数据 * class: 查询数据的结果需要包装的实体类类型的字节码 * id: 查询的主键的取值 */ Customer customer = entityManager.getReference(Customer.class,7L); System.out.println(customer); //4.提交事务 transaction.commit(); //5释放资源 entityManager.close(); } /** * 根据主键删除 */ @Test public void testRemove(){ //1.通过工具类获取entityManager EntityManager entityManager = JpaUtils.getEntityManager(); //2.开启事务 EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); //3.增删改查 /** * getReference 根据id查询数据 * class: 查询数据的结果需要包装的实体类类型的字节码 * id: 查询的主键的取值 */ Customer customer = entityManager.getReference(Customer.class,7L); entityManager.remove(customer); //4.提交事务 transaction.commit(); //5释放资源 entityManager.close(); } /** * 根据主键更新 */ @Test public void merge(){ //1.通过工具类获取entityManager EntityManager entityManager = JpaUtils.getEntityManager(); //2.开启事务 EntityTransaction transaction = entityManager.getTransaction(); transaction.begin(); //3.增删改查 /** * getReference 根据id查询数据 * class: 查询数据的结果需要包装的实体类类型的字节码 * id: 查询的主键的取值 */ Customer customer = entityManager.getReference(Customer.class,6L); customer.setCustIndustry("本科"); customer.setCustName("钱六"); entityManager.merge(customer); //4.提交事务 transaction.commit(); //5释放资源 entityManager.close(); } } ~~~