JPA概述
JPA(Java Persistence API)的简称,用于持久化的API。
JAVAEE5.0平台标准的ORM的规范使得应用程序以统一的方式访问持久层。
JPA和Hibernate的关系
JPA是Hibernate的一个抽象,就像JDBC和JDBC驱动的关系一样。
PA是规范:JPA本质上是一种ORM规范,不是ORM框架,因为JPA并未提供实现,它只是制定了一些规范,提供了一些编程的API接口,但具体实现则由各ORM厂商提供实现。
Hibernate是实现:Hibernate除了做为一个ORM框架之外,它也是一种JPA实现。从功能上来说,Hibernate是JPA的一个子集。
JPA的优势
标准化: 提供相同的 API,这保证了基于JPA 开发的企业应用能够经过少量的修改就能够在不同的 JPA 框架下运行。
简单易用,集成方便: JPA 的主要目标之一就是提供更加简单的编程模型,在 JPA 框架下创建实体和创建 Java 类一样简单,只需要使用 javax.persistence.Entity 进行注释;JPA 的框架和接口也都非常简单,
可媲美JDBC的查询能力: JPA的查询语言是面向对象的,JPA定义了独特的JPQL,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。
支持面向对象的高级特性:JPA 中能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,最大限度的使用面向对象的模型
JPA的组成
ORM 映射元数据:JPA 支持 XML 和 JDK 5.0 注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。
JPA 的 API:用来操作实体对象,执行CRUD操作,框架在后台完成所有的事情,开发者从繁琐的 JDBC和 SQL代码中解脱出来。
查询语言(JPQL):这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序和具体的 SQL 紧密耦合。
JPA环境配置:
首先我们使用Eclipse来创建一个JPA的项目(我们这里通过Hibernate来实现JPA所以准备好HibernateJar包):
配置好EclipseLink和hibernate的jar包,然后增加数据库连接
项目生成后src下META-INF里面会生成一个persistence.xml,这个文件放着这里面与命名都是规范不需要更改
我们首先来创建个实体类作为测试。Student.java类
package com.miya.jpa.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQuery; import javax.persistence.Table; @Table(name="tal_student") @Entitypublic class Student { public Student() { super(); } public Student(String name, String pass, Integer age, String phone, String address) { super(); this.name = name; this.pass = pass; this.age = age; this.phone = phone; this.address = address; } @Id @GeneratedValue(strategy=GenerationType.AUTO) private Integer id; private String name; private String pass; private Integer age; private String phone; private String address; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", pass=" + pass + ", age=" + age + ", phone=" + phone + ", address=" + address + "]"; } }
@Table注解:指定数据表名
@Entity注解:声明持久化类,加上了这个注解必须要有主键所以我这里将ID做为主键使用@Id生命。
@GeneratedValu()注解中配置策略。
然后我们来配置一下persistence.xml文件
<persistence-unit name="JpaDemo1" transaction-type="RESOURCE_LOCAL"> <!-- 指定ORM实现类 --> <provider>org.hibernate.ejb.HibernatePersistence</provider> <!-- 添加持久化类 --> <class>com.miya.jpa.entity.Student</class> <properties> <!-- 配置数据库连接 --> <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpa" /> <property name="javax.persistence.jdbc.user" value="root" /> <property name="javax.persistence.jdbc.password" value="root" /> <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> <!-- Hibernate配置信息 --> <property name="hibernate.hbm2ddl.auto" value="update" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> </properties> </persistence-unit>
persistence-unit标签上属性
name :用于定义持久化单元的名字,必填项,
transaction-type:直接JAP的事务策略,RESOURCE_LOCAL(默认值),数据库级别的事物。只能针对一种数据库。不支持分布式事务。如果需要分布式事务的支持使用JTA
provider标签:
指定ORM框架的 javax.persistence.spi.PersistenceProvider 接口的实现类。若项目中只有一个实现可省略
main方法:
public static void main(String[] args) { // 创建工厂 EntityManagerFactory factory = Persistence.createEntityManagerFactory("JpaDemo1"); // 创建与数据库之间的回话 EntityManager manager = factory.createEntityManager(); // 获取事务 EntityTransaction transaction = manager.getTransaction(); // 开启事务 transaction.begin(); Student student = new Student("张三丰", "123123", 22, "12312312312", "中国-未知"); manager.persist(student); // 提交事务 transaction.commit(); // 关闭资源 manager.close(); factory.close(); }