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:
- OpenJPA是Apache组织提供的开源项目。
- TopLink:
- 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 准备环境
- JDK 1.8
- IDEA 2017.3.5
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(); } }
扫描二维码关注公众号,回复:
426338 查看本文章