1 JPA概述
1.1 JPA是什么?
- JPA:Java Persistence API,用于持久化对象的API。
- Java EE 5.0 平台标准的ORM规范,可以使得应用程序以统一的方式访问数据库。
1.2 JPA和Hibernate的关系
- JPA是Hibernate的一个抽象(就像JDBC和JDBC驱动一样)。
- JPA是规范:JPA本质上就是一种ORM规范,不是ORM框架,因为JPA并没有提供ORM的实现,它只是制定了一些规范,提供了一些编程的API接口,但具体的实现由ORM框架厂商提供实现。
- Hibernate是实现:Hibernate除了作为ORM框架之外,它也是JPA规范的一种实现。
1.3 JPA的供应商
- JPA的目标之一是制定一个可以由很多供应商实现的API,目前HIbernate 3.2+、TopLink 10.1+以及OpenJPA都提供了对JPA的实现。
- Hibernate:
- JPA的始作俑者就是Hibernate的作者。
- Hibernate从3.2开始兼容JPA。
- OpenJPA:
- TopLink:
1.4 JPA的优势
- ①标准化:提供相同的API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。
- ②简单易用,集成方便:JPA的主要目标之一就是提供更加简单的编程模型,在JPA框架下创建实体和创建Java类一样简单,只需要使用javax.persistence.Entity注解标注即可,而且JPA的框架和接口也非常简单。
- ③可媲美JDBC的查询能力:JPA的查询语言是面向对象的,JPA定义了独特的JPQL,而且能够支持批量更新和修改、Join、Group by、having等通常只有SQL才能够提供的高级查询特性,甚至还能够支持子查询。
- ④支持面向对象的高级特性:JPA中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,最大限度的使用面对对象的模型。
1.5 JPA包括 3 方面的技术
- ①ORM 映射元数据:JPA支持XML和JDK5.0 注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架会据此将实体对象持久化到数据库表之中。
- ②JPA的API:用来操作实体对象,执行CRUD操作,框架在后台完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
- ③查询语言(JPQL):这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序和具体的SQL的紧密耦合。
2 JPA的HelloWorld
2.1 准备环境
2.2 HelloWorld
2.2.1 persistence.xml
- 此配置文件相当于Hibernate的hibernate.cfg.xml文件,但是在JPA规范中,规定了此文件的位置是在类路径下的META-INF下,如下图所示
- 当然,Eclipse和IDEA都支持JPA项目模板的创建。
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<persistence-unit name="NewPersistenceUnit">
<!--
配置使用什么 ORM 产品来作为 JPA 的实现
1. 实际上配置的是 javax.persistence.spi.PersistenceProvider 接口的实现类
2. 若 JPA 项目中只有一个 JPA 的实现产品, 则也可以不配置该节点.
-->
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.xuweiwei.bean.Customer</class>
<properties>
<!-- 配置连接数据库的基本信息 -->
<property name="hibernate.connection.url" value="jdbc:mysql://127.0.0.1:3306/jpa"/>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="root"/>
<!-- 配置Hibernate的基本属性 -->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
2.2.2 创建Customer.java类
package com.xuweiwei.bean;
import javax.persistence.*;
/**
* @author 许威威
* @description:
* @motto 代码虐我千百遍,我视代码如初恋
* @created date :2018-05-10
* @modified by:
*/
@Entity
@Table(name="customer")
public class Customer {
private Long id;
private String lastName;
private String email;
private int age;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(name = "last_name")
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.2.3 测试
package com.xuweiwei.bean;
import org.junit.Test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
/**
* @author 许威威
* @description:
* @motto 代码虐我千百遍,我视代码如初恋
* @created date :2018-05-10
* @modified by:
*/
public class MainTest {
@Test
public void test(){
/**
* 创建EntityManagerFactory 就如同Hibernate创建SessionFactory一样
*/
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("NewPersistenceUnit");
/**
* 创建EntityManager就如同Hibernate创建Session一样
*/
EntityManager entityManager = entityManagerFactory.createEntityManager();
/**
* 创建EntityTransaction就如果Hibernate创建Transaction
*/
EntityTransaction transaction = entityManager.getTransaction();
/**
* 事务开启,和Hibernate如出一辙
*/
transaction.begin();
/**
* 执行持久化操作
*/
Customer customer = new Customer();
customer.setLastName("许威威");
customer.setAge(26);
customer.setEmail("[email protected]");
entityManager.persist(customer);
/**
* 提交事务,和Hibernate如出一辙
*/
transaction.commit();
/**
* 关闭entityManager和Hibernate关闭session一样
*/
entityManager.close();
/**
* 关闭entityManagerFactory和Hibernate关闭SessionFactory一样
*/
entityManagerFactory.close();
}
}
3 JPA的基本注解