JPA全称为Java Persistence API ,是目前比较流行的一种ORM技术之一,所以他拥有ORM技术的各种特点,当然他还有自己的一些优势:
1 标准化
JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问 API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。
2 对容器级特性的支持
JPA 框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。
3 简单易用,集成方便
JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释;JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。
4 可媲美JDBC的查询能力
JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
5 支持面向对象的高级特性
JPA中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。
Person.java:
JpaTest.java:
1 标准化
JPA 是 JCP 组织发布的 Java EE 标准之一,因此任何声称符合 JPA 标准的框架都遵循同样的架构,提供相同的访问 API,这保证了基于JPA开发的企业应用能够经过少量的修改就能够在不同的JPA框架下运行。
2 对容器级特性的支持
JPA 框架中支持大数据集、事务、并发等容器级事务,这使得 JPA 超越了简单持久化框架的局限,在企业应用发挥更大的作用。
3 简单易用,集成方便
JPA的主要目标之一就是提供更加简单的编程模型:在JPA框架下创建实体和创建Java 类一样简单,没有任何的约束和限制,只需要使用 javax.persistence.Entity进行注释;JPA的框架和接口也都非常简单,没有太多特别的规则和设计模式的要求,开发者可以很容易的掌握。JPA基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成。
4 可媲美JDBC的查询能力
JPA的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。JPA定义了独特的JPQL(Java Persistence Query Language),JPQL是EJB QL的一种扩展,它是针对实体的一种查询语言,操作对象是实体,而不是关系数据库的表,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
5 支持面向对象的高级特性
JPA中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。
具体例子:
完成工程后工程结构如下图:
persistence.xml配置如下:
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_version=1">
<persistence-unit name="db1jpa" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.connection.driver_class" value="***" />
<property name="hibernate.connection.username" value="***" />
<property name="hibernate.connection.password" value="***" />
<property name="hibernate.connection.url" value="***" />
<property name="hibernate.max_fetch_depth" value="3" />
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>
Person.java:
package com.hmk.bean;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Person {
private int id;
private String name;
@Id @GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(length=12)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
JpaTest.java:
package junit.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.junit.BeforeClass;
import org.junit.Test;
import com.hmk.bean.Person;
public class JpaTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test public void createTable(){
//可以验证生成表是否正确
EntityManagerFactory factory = Persistence.createEntityManagerFactory("db1jpa");
factory.close();
}
@Test public void save(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("db1jpa");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = new Person(); //person为new状态
person.setName("zhang san");
em.persist(person); //持久化实体
em.getTransaction().commit();
em.close();
factory.close();
}
//new 、托管、脱管、删除
@Test public void update(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("db1jpa");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
person.setName("hmk"); //person为托管状态
em.getTransaction().commit();
em.close();
factory.close();
}
@Test public void update2(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("db1jpa");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
em.clear(); //把实体管理器中的所有实体变为脱管状态
person.setName("hmk2");
em.merge(person); //把脱管状态变为托管状态,merge可以自动选择insert or update 数据
em.getTransaction().commit();
em.close();
factory.close();
}
@Test public void remove(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("db1jpa");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Person person = em.find(Person.class, 1);
em.remove(person); //删除实体
em.getTransaction().commit();
em.close();
factory.close();
}
@Test public void find(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("db1jpa");
EntityManager em = factory.createEntityManager();
Person person = em.find(Person.class, 2); //类似于hibernate的get方法,没找到数据时,返回null
System.out.println(person.getName());
em.close();
factory.close();
}
@Test public void find2(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("db1jpa");
EntityManager em = factory.createEntityManager();
Person person = em.getReference(Person.class, 2); //类似于hibernate的load方法,延迟加载.没相应数据时会出现异常
System.out.println(person.getName()); //真正调用时才查找数据
em.close();
factory.close();
}
}