一、概述
JPA (Java Persistence API) Java持久化API。是一套Java官方制定的ORM 方案。
什么是ORM?
ORM(Object Relational Mapping)对象关系映射,在操作数据库之前,先把数据表与实体类关联起来。然后通过实体类的对象操作(增删改查)数据库表;所以说,ORM是一种实现使用对象操作数据库的设计思想。
市场主流的JPA框架:
Hibernate (JBoos)
EclipseTop(Eclipse社区)
OpenJPA (Apache基金会)
Hibernate是众多实现者之中,性能最好的
二、入门示例
任何框架的学习都应该从其配置流程开始学习
【1】、JPA配置流程图
1. 我们需要一个总配置文件persistence.xml存储框架需要的信息 (注意,文件名不要写错,而且必须放在classpath/META-INF文件夹里面)
2. 我们需要一个Persistence持久类对象来读取总配置文件,创建实体管理工厂对象
3. 我们需要实体管理工厂获得数据库的操作对象实体管理对象EntityManager。
4. 我们通过EntityManager操作数据库之前,必须要先配置表与实体类的映射关系,从而实现使用对象操作数据库
【2】配置步骤说明
第一步:导入包 (不管什么框架,首先要做的事情)
第二步:创建一个总配置文件
第三步:创建一个JPAUtils获得操作对象EntityManager
第四步:创建一个实体类,并且配置好映射注解
第五步:在总配置文件加载实体类
第六步:测试代码(需求:插入数据到用户表)
1、创建Maven项目(导入Hibernate的JPA规范包)
POM.xml配置内容
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.zj</groupId>
<artifactId>jpa-demo01-start</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- hibernate框架 实现 JPA 依赖 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.6.Final</version>
</dependency>
<!--jdbc驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
</dependencies>
</project>
2、创建一个总配置文件
注:文件必须放在classpath:/META-INF/persistence.xml
说明:Eclipse已经支持了JPA框架,所有不需要配置xsd文件,直接使用
具体配置信息如下:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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 ">
<persistence-unit name="mysql-jpa">
<!-- 四要素 org.hibernate.cfg.Environment-->
<properties>
<!-- 如果使用Hibernate实现的JPA,使用的就是Hibernate的环境参数 -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="root" />
<!--可选配置-->
<!--控制台打印sql语句-->
<property name="hibernate.show_sql" value="true" />
<!-- 格式化输出SQL -->
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
3、封装JPAUtils工具类
创建一个工具类JPAUtils,获得操作对象(EntityManager)
package cn.zj.jpa.util;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class JPAUtils {
//同一个应用中,应该保证只有一个实例工厂。
public static EntityManagerFactory emf = createEntityManagerFactory();
//1.获得实体管理工厂
private static EntityManagerFactory createEntityManagerFactory(){
EntityManagerFactory emf = Persistence.createEntityManagerFactory("mysql-jpa");
return emf;
}
//2.获得实体管理类对象
public static EntityManager getEntityManger(){
EntityManager entityManager = emf.createEntityManager();
return entityManager;
}
}
4、创建映射实体类
创建一个映射的实体类,将JPA的映射注解写在实体类里面
package cn.zj.jpa.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
//1.指定实体类与表名的关系
//@Entity注解,指定该实体类是一个基于JPA规范的实体类
@Entity
//@Table注解,指定当前实体类关联的表
@Table(name="tb_student")
public class Student {
//@Id注解:声明属性为一个OID属性
@Id
//@GeneratedValue注解,指定主键生成策略
@GeneratedValue(strategy=GenerationType.IDENTITY)
//@Column注解,设置属性与数据库字段的关系,如果属性名和表的字段名相同,可以不设置
@Column(name="stu_id")
private Long stuId;//BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '学生编号',
@Column(name="stu_name")
private String stuName;//VARCHAR(50) NULL DEFAULT NULL COMMENT '学生名字',
@Column(name="stu_age")
private Integer stuAge;//INT(11) NULL DEFAULT NULL COMMENT '学生年龄',
@Column(name="stu_password")
private String stuPassword;//VARCHAR(50) NULL DEFAULT NULL COMMENT '登录密码',
public Student() {
super();
}
//补全get、set方法
}
5、在总配置文件中加载映射实体类
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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 ">
<persistence-unit name="mysql-jpa">
<!-- 加载实体类
基于hibernate框架的JPA已经实现了自动载入映射实体类 ,所以不配置也是可以的。建议还是加上配置。如果不写容易忽略加载的实体类有哪些
-->
<class>cn.zj.jpa.entity.Student</class>
<!-- 四要素 org.hibernate.cfg.Environment-->
<properties>
<!-- 如果使用Hibernate实现的JPA,使用的就是Hibernate的环境参数 -->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jpa" />
<property name="hibernate.connection.username" value="root" />
<property name="hibernate.connection.password" value="zj" />
<!--可选配置-->
<!--控制台打印sql语句-->
<property name="hibernate.show_sql" value="true" />
<!-- 格式化输出SQL -->
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
6、操作实体类保存数据
创建一个StudentDAOTest类,测试保存一个学生
package cn.zj.jpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import org.junit.Test;
import cn.zj.jpa.entity.Student;
import cn.zj.jpa.util.JPAUtils;
public class StudentDAOTest {
@Test
public void persist(){
//1.获得实体管理类
EntityManager manager = JPAUtils.getEntityManger();
//2、获取事物管理器
EntityTransaction transaction = manager.getTransaction();
transaction.begin();
//3、创建实体对象
Student s=new Student();
s.setStuName("张三");
s.setStuAge(18);
s.setStuPassword("zj");
//4、保存到数据库
manager.persist(s);
//5、提交事物
transaction.commit();
//6、关闭资源
manager.close();
}
}
通过操作实体对象保存数据成功