Spring Data JPA(二)—— JPA工具类

2020-04-01

一、JPA操作步骤

  1. 加载配置文件创建实体管理器工厂

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(持久化单元名称);

  2. 根据实体管理器工厂,创建实体管理器

    EntityManager entityManager = factory.createEntityManager();

    • 内部维护了很多的内容
      • 维护了数据库信息
      • 维护了缓存信息
      • 维护了所有的实体管理器对象
      • 在创建EntityManagerFactory的过程中会根据配置创建数据库表
    • EntityManagerFactory的创建过程比较浪费资源
    • 线程安全的对象
      • 多个线程访问同一个EntityManagerFactory不会有线程安全问题

    如何解决EntityManagerFactory的创建过程中浪费资源(耗时)的问题?

    思路:创建一个公共的EntityManagerFactory对象

    静态代码块的形式创建EntityManagerFactory对象

  3. 创建事务对象,开启事务

    EntityTransaction tx = entityManager.getTransaction();//获取事务对象

    tx.begin();//开启事务
    tx.commit();//提交事务
    tx.rollback();//回滚
    
    entityManager.persist(Object entity);//保存
    entityManager.merge(Object entity);//更新
    entityManager.remove(Object entity);//删除
    entityManager.find();//查询
    entityManager.getRefrence();//查询
    
  4. 增删改查操作

  5. 提交事务

  6. 释放资源

    entityManager.close();
    factory.close();
    

二、JpaUtils工具类

package com.cherishvii.utils;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 * 解决实体管理器工厂的浪费资源和耗时问题
 * 通过静态代码块的形式,当程序第一次访问此工具类时,创建一个公共的实体管理器工厂对象
 * <p>
 * 第一次访问getEntityManager方法,经过静态代码块创建一个factory对象,再调用方法创建一个EntityManager对象
 * 第二次访问getEntityManager方法,直接通过一个已经创建好的factory对象,创建EntityManager对象
 *
 * @author CHERISHVII
 * @author www.cherishvii.com
 * @version V1.0
 * @date 2020/4/1 10:26
 */
public class JpaUtils {

    private static EntityManagerFactory factory;

    static {
        //1.加载配置文件,创建EntityManagerFactory
        factory = Persistence.createEntityManagerFactory("myJpa");
    }

    /**
     * 获取EntityManager对象
     *
     * @return EntityManager
     */
    public static EntityManager getEntityManager() {
        return factory.createEntityManager();
    }
}

三、根据id查询客户

  1. 通过工具类获取EntityManager
  2. 开启事务
  3. 查询客户
  4. 提交事务
  5. 释放资源
/**
 * 使用find方法查询:
 * 1.查询的对象就是当前客户对象本身
 * 2.在调用find方法的时候,就会发送sql语句查询数据库
 */
public void testFind() {
    EntityManager entityManager = JpaUtils.getEntityManager();
    EntityTransaction tx = entityManager.getTransaction();
    tx.begin();
    /**
     * find:根据id查询数据
     *      class:查询数据的结果需要包装的实体类类型的字节码
     *      id:查询的主键值
     */
    Customer customer = entityManager.find(Customer.class,2l);
    System.out.println(customer);
    tx.commit();
    entityManager.close();
}
/**
 * 使用getReference方法:
 * 1.获取的对象时一个动态代理对象
 * 2.调用getReference方法不会立即发送sql语句查询数据库
 *      当调用查询结果对象的时候,才会发送查询的sql语句。
 */
public void testReference() {
    EntityManager entityManager = JpaUtils.getEntityManager();
    EntityTransaction tx = entityManager.getTransaction();
    tx.begin();
    /**
     * getReference:根据id查询数据
     *      class:查询数据的结果需要包装的实体类类型的字节码
     *      id:查询的主键值
     */
    Customer customer = entityManager.getReference(Customer.class,2l);
    System.out.println(customer);
    tx.commit();
    entityManager.close();
}

即:find方法为立即加载,getReference方法为延迟加载。

四、删除客户

  1. 通过工具类获取EntityManager
  2. 开启事务
  3. 删除客户
    1. 根据id查询客户
    2. 调用remove删除客户
  4. 提交事务
  5. 释放资源
public void testRemove(){
    EntityManager entityManager = JpaUtils.getEntityManager();
    EntityTransaction tx = entityManager.getTransaction();
    tx.begin();
    Customer customer = entityManager.getReference(Customer.class,2l);
    if(customer!=null) {
        entityManager.remove(customer);
    }
    tx.commit();
    entityManager.close();
}

五、更新客户

  1. 通过工具类获取EntityManager
  2. 开启事务
  3. 更新客户
    1. 根据id查询客户
    2. 调用merge更新客户
  4. 提交事务
  5. 释放资源
public void testUpdate(){
    EntityManager entityManager = JpaUtils.getEntityManager();
    EntityTransaction tx = entityManager.getTransaction();
    tx.begin();
    Customer customer = entityManager.getReference(Customer.class,3l);
    if(customer!=null){
        customer.setCustPhone("10086");
        entityManager.merge(customer);
    }
    tx.commit();
    entityManager.close();
}

标题:Spring Data JPA(二)—— JPA工具类
作者:CherishVII
地址:https://cherishvii.com/articles/2020/04/01/1585713648474.html

评论
发表评论