Java基础-JPA

1. 概述

JPA 是 Java Persistence API 的简称,中文名 Java 持久层 API,是 JDK 5.0 注解或 XML 描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

2. 常用 API

2.1. Persistence 类

Persistence 类主要是用于读取配置文件,获得实体管理工厂。常用方法如下所示:

  1. public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName)
  • 获得实体管理工厂。参数 String persistenceUnitName:配置文件中的 persistenceUnitName

示例:

  1. EntityManagerFactory emf = Persistence.createEntityManagerFactory("crm");

2.2. EntityManagerFactory 接口

用于管理数据库的连接,获得操作对象实体管理类 EntityManagerEntityManagerFactory 是一个线程安全的对象,并且其创建极其浪费资源,所以编程的时候要保持它是单例的。常用方法如下所示:

  1. public EntityManager createEntityManager();
  • 获取操作对象实体管理类

示例:

  1. EntityManagerFactory emf = Persistence.createEntityManagerFactory("crm");
  2. EntityManager entityManager = emf.createEntityManager();

2.3. EntityManager 接口

在 JPA 规范中,EntityManager 实体管理类是操作数据库的重要 API,它是线程不安全的,需要保持线程独有。常用方法如下所示:

  1. public EntityTransaction getTransaction();
  • 获取事务对象,但没有开启事务
  1. public void persist(Object entity);
  • 插入数据
  1. public void remove(Object entity);
  • 根据对象的主键id删除数据。注意:使用JPA删除数据也必须使用持久化对象,即要先查询数据,再删除
public <T> T merge(T entity);
  • 如果数据库没有记录就保存,如果有记录就更新,重要的判断是 OID 是否相同,OID(Object ID)就是在配置文件配置为 <id> 属性。
public <T> T find(Class<T> entityClass, Object primaryKey);
  • 用于通过OID,获得一条记录,有延迟。相当于get()
public <T> T getReference(Class<T> entityClass, Object primaryKey);
  • 用于通过OID,获得一条记录,无延迟。相当于load()
public Query createQuery(String qlString);
  • 获取 JPQL 操作对象,参数是操作 HQL 语句,用于删除和更新
public <T> TypedQuery<T> createQuery(String qlString, Class<T> resultClass);
  • 获取 JPQL 操作对象,用于查询操作

2.4. EntityTransaction 接口

2.4.1. 获取 EntityTransaction 实例

用于管理事务(开始,提交,回滚)。获取事务(没有开启事务):

EntityManagerFactory emf = Persistence.createEntityManagerFactory("crm");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();

2.4.2. 常用方法

public void begin();
  • 开启事务
public void commit();
  • 提交事务
public void rollback();
  • 回滚事务

2.5. TypedQuery 接口

TypedQuery 接口继承 Query 接口。用于操作 JPQL 的查询的。JPQL 和 HQL 一样。为什么 JPA 的标准,查询需要指定类型,目的就是为了让返回的数据没有没有警告

2.5.1. 获取 TypedQuery 实例

EntityManager em = xxx;
TypedQuery<Xxx> query = em.createQuery("xxx", Xxx.class);

2.5.2. 常用方法

int executeUpdate();
  • 执行查询操作(好像不用)。此方法继承于 Query 接口
TypedQuery<X> setParameter(int position, Object value);
  • 设置 ? 参数的值。

    • int position:是 ? 占位符后面指定的下标
    • Object value:占位符的值
TypedQuery<X> setParameter(String name, Object value);
  • 设置命名参数的值。

    • String name:命名参数的名字,不带 :
    • Object value:命名参数的值
TypedQuery<X> setFirstResult(int startPosition);
  • 设置分页查询的起始数

    • int startPosition:查询语句 limit 的起始数
TypedQuery<X> setMaxResults(int maxResult);
  • 设置分页查询的数量

    • int maxResult:分页查询每页大小
List<X> getResultList();
  • 返回查询的结果List集合(查询所有的数据)
X getSingleResult();
  • 返回查询的结果是一条数据,常用聚合函数 count(),相当于 uniqueResult()

2.6. Query 接口

用于操作SQL的查询接口,执行没有返回数据的JPQL(增删改),用于删除和更新

2.6.1. 获取 Query 实例

EntityManager em = xxx;
Query query = em.createQuery("xxx");

2.6.2. 常用方法

int executeUpdate();
  • 执行删除和修改的操作
Query setParameter(int position, Object value);
  • 设置 ? 参数的值。

    • int position:是 ? 占位符后面指定的下标
    • Object value:占位符的值
Query setParameter(String name, Object value);
  • 设置命名参数的值。

    • String name:命名参数的名字,不带 :
    • Object value:命名参数的值

2.7. CriteriaBuilder 接口

用户使用标准查询接口 Criteria 查询接口