概念
JPA(Java Persistence API,Java持久层API),是一个基于ORM(对象关系映射)的标准规范,用来处理程序与数据库之间的关系。JPA最早由EJB3.0专家组开发,是JSR220实现的一部分,它只定义标准规则,不提供具体实现,JPA实现通常被称为:持久化提供者(persistence provider),目前主要的JPA实现有:Hibernate、EclipseLink、OpenJPA等。
现在,JPA不仅可以在Java EE程序中使用,也可以用于SE开发。
内容
Entity
通过ORM框架,开发人员可以直接操作实体对象,进而把数据持久化到数据库中,无需编写SQL语句。每个Entity分别对应数据库表中的一条记录,Entity中的属性对应表中的字段。一个程序中常用的POJO(Plain Ordinary Java Object,普通JavaBean)通过添加@Entity注解便可以包装为持久化管理中的实体类。
@Entity
public class User implements Serializable {
@Id
private int id;
private String name;
//省略了 getter 和 setter 方法。
}
默认情况下,实体名需要和表名一致,如果想使用别名,可以添加@Table(name=”“)注解。根据JPA规范,一个Entity类需要满足以下要求:
- 包含 javax.persistence.Entity 注解(JDK1.5以上)
- 提供无参的默认构造方法,可以被public或proteted修饰。
- 不能声明为final
- 如果实体对象需要通过网络传递,比如通过会话bean远程业务接口传递,需要实现 Serializable 接口
- 可以继承其他类,或者被其他类继承
- 持久化的实例变量必须保证只能通过方法来访问(private或protected声明)
persistence.xml
JPA 规范要求,配置文件必须命名为 persistence.xml,并存在于类路径下的 META-INF 目录中,使用IDE创建JPA工程,会自动生成这些文件。persistence.xml文件定义了JPA配置的一些基本信息,比如:数据库连接的驱动、用户名、密码等。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="jpaTester" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/mybatistest"/>
<property name="javax.persistence.jdbc.user" value=""/>
<property name="javax.persistence.jdbc.password" value=""/>
</properties>
</persistence-unit>
</persistence>
JPQL
Java Persistence query language,基于实体的可移植查询语言,可以被编译为所有主流数据库的SQL,类似于Hibernate 中的HQL。JPQL与原生SQL语句类似,并且完全面向对象,通过类名和属性访问,而不是表名和表字段。一个简单的查询可能如下所示:
//创建一个EntityManager来执行查询,不理解可以先忽略
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaTester");
EntityManager em = emf.createEntityManager();
//User是程序中定义的Entity,而非表名
Query q = em.createQuery("select u from User u");
List<User> userList= q.getResultList();
Criteria
Java Persistence Criteria API,是JPA2.0的新特性。JPQL与SQL语法非常类似,对于熟悉SQL语句的程序员来讲,上手JPQL很容易,但是JPQL同样是基于字符串来申明的,也就意味着它无法在程序编译时检查语法错误,只会在运行时抛出异常。
比如下面这样的情况:
//语法错误,可以通过编译,但是运行时会抛出异常
Query q = em.createQuery("select u from User");
//正确的JPQL查询语句
Query q = em.createQuery("select u from User u");
使用Criteria API可以避免上述问题,同样查询User数据,可以表示为:
//需要先创建EntityManager em
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> u = cb.createQuery(User.class);
Root<User> user = u.from(User.class);
u.select(User);