当前位置 > it书童 > java > 正文

封装 Jpa 工具类以及实现增删改查

java it书童 2020-11-19 09:03:58 0赞 0踩 163阅读 0评论

为解决实体管理器工厂的浪费资源和耗时问题,可将其封装为一个工具类

工具类封装

public class JpaUtils {

    private static EntityManagerFactory factory;

    static {
        factory = Persistence.createEntityManagerFactory("myJpa");
    }

    public static EntityManager getEntityManager() {
        return factory.createEntityManager();
    }
}

代码解析:

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

第一次访问getEntityManager方法:经过静态代码块创建一个factory对象,再调用方法创建一个EntityManager对象

第二次方法getEntityManager方法:直接通过一个已经创建好的factory对象,创建EntityManager对

增删改查

@Test
public void testSave() {
    // 创建实体管理类
    EntityManager em = JpaUtils.getEntityManager();
    // 获取事务对象
    EntityTransaction tx = em.getTransaction();
    // 开启事务
    tx.begin();
    Customer c = new Customer();
    c.setCustName("贝吉塔");
    // 保存操作
    em.persist(c);
    // 提交事务
    tx.commit();
    // 释放资源
    em.close();
}

/**
 * 根据 id 查询数据
 * find: 立即加载,调用方法时就执行 sql 语句
 */
@Test
public void testFind() {
    EntityManager entityManager = JpaUtils.getEntityManager();
    EntityTransaction tx = entityManager.getTransaction();
    tx.begin();
    Customer customer = entityManager.find(Customer.class, 1L);
    System.out.println(customer);
    tx.commit();
    entityManager.close();
}

/**
 * 根据 id 查询数据
 * getReference: 延迟加载(懒加载)
 *      得到一个动态代理对象,什么时候用,什么时候再查询
 *      这种方式效率更高
 */
@Test
public void testReference() {
    EntityManager entityManager = JpaUtils.getEntityManager();
    EntityTransaction tx = entityManager.getTransaction();
    tx.begin();
    Customer customer = entityManager.getReference(Customer.class, 3L);
    System.out.println(customer);
    tx.commit();
    entityManager.close();
}

/**
 * 删除数据
 */
@Test
public void testRemove() {
    EntityManager entityManager = JpaUtils.getEntityManager();
    EntityTransaction tx = entityManager.getTransaction();
    tx.begin();
    Customer customer = entityManager.find(Customer.class, 2L);
    entityManager.remove(customer);
    tx.commit();
    entityManager.close();
}


/**
 * 更新数据
 */
@Test
public void testUpdate() {
    EntityManager entityManager = JpaUtils.getEntityManager();
    EntityTransaction tx = entityManager.getTransaction();
    tx.begin();
    Customer customer = entityManager.find(Customer.class, 4L);
    customer.setCustName("傲娇塔");
    entityManager.merge(customer);
    tx.commit();
    entityManager.close();
}

源码 javaDemo 373e4f1

关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
转载须注明出处:https://www.itshutong.com/articles/828