JPA : Java Persistence API
通过Java Annotation 或 xml,描述 Java对象 - 数据库表 之间的映射关系,并将Java对象持久化到数据库中。
前面两篇Hibernate的介绍文章中,分别介绍了xml和Annotation两种方式,描述映射关系。
JPA技术:
(1) ORM映射元数据
对象与数据库表之间的映射关系。
(2) API
操作Java实体对象,执行CRUD操作,避免JDBC和SQL。
(3) 查询语言 JPQL
面向对象的查询语言,而不是面向数据库,避免SQL。
JPQL : Java Persistence Query Language
类似SQL,是面向对象的,而不是面向数据库表。object-oriented, not table-oriented.
javax.persistence.Query
以前篇文章中的Event为例:
(1) select e from Event e
entityManager.createQuery("select e from Event e", Event.class).getResultList();
返回值为 : List<Event> es
同 : select e from Event AS e
同 : SELECT OBJECT(e) FROM Event AS e
(2) where
SELECT e FROM Event e where e.id=1
SELECT e FROM Event e where e.title LIKE 'hello world%' : %匹配任意字符串
SELECT e FROM Event e where e.title LIKE 'hello world_' : _匹配任意字符,单个
(3) 其他
AND, NOT, OR, is (not) empty, is (not) null, IN
示例代码:
package org.hibernate.tutorial.em;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
public class EMHibernateTest {
private EntityManagerFactory emFactory;
public EMHibernateTest() {
init();
}
private void init() {
emFactory = Persistence
.createEntityManagerFactory("org.hibernate.tutorial.em");
}
public void close() {
emFactory.close();
}
public void create() {
EntityManager em = emFactory.createEntityManager();
em.getTransaction().begin();
em.persist(new Event("hello world1", new Date()));
em.persist(new Event("hello 2", new Date()));
em.persist(new Event("hello world3L", new Date()));
em.getTransaction().commit();
em.close();
}
public void read() {
EntityManager em = emFactory.createEntityManager();
em.getTransaction().begin();
// List<Event> es = em.createQuery("from Event", Event.class).getResultList(); // JPQL
// List<Event> es = em.createQuery("SELECT e FROM Event e", Event.class).getResultList();
// List<Event> es = em.createQuery("SELECT e FROM Event AS e", Event.class).getResultList();
// List<Event> es = em.createQuery("SELECT OBJECT(e) FROM Event AS e", Event.class).getResultList();
// List<Event> es = em.createQuery("SELECT e FROM Event e where e.id=1", Event.class).getResultList();
// List<Event> es = em.createQuery("SELECT e FROM Event e where e.title LIKE 'hello world%'", Event.class).getResultList(); // % 任意字符串
// List<Event> es = em.createQuery("SELECT e FROM Event e where e.title LIKE 'hello world_'", Event.class).getResultList(); // % 任意字符
List<Event> es = em.createQuery("SELECT e FROM Event e where e.title is not empty", Event.class).getResultList(); // % 任意字符
Iterator<Event> it = es.iterator();
while (it.hasNext()) {
Event e = it.next();
System.out.println(e);
}
em.getTransaction().commit();
em.close();
}
public void update() {
EntityManager em = emFactory.createEntityManager();
em.getTransaction().begin();
Query query = em.createQuery("UPDATE Event e SET e.title = :title WHERE e.id = :id");
query.setParameter("title", "updated title");
query.setParameter("id", 2L);
query.executeUpdate();
em.getTransaction().commit();
em.close();
}
public void delete() {
EntityManager em = emFactory.createEntityManager();
em.getTransaction().begin();
Query query = em.createQuery("DELETE FROM Event e WHERE id = ?1");
query.setParameter(1, 1L);
query.executeUpdate();
em.getTransaction().commit();
em.close();
}
public static void main(String[] args) {
EMHibernateTest em = new EMHibernateTest();
em.create();
em.read();
em.update();
em.delete();
em.close();
}
}
META-INF/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_2_0.xsd"
version="2.0">
<persistence-unit name="org.hibernate.tutorial.em">
<description>
Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide
</description>
<class>org.hibernate.tutorial.em.Event</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://127.0.0.1:3306/hibernate" />
<property name="javax.persistence.jdbc.user" value="root" />
<property name="javax.persistence.jdbc.password" value="root" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
项目目录结构为: