1.什么是JPA
jpa全称(Java Persistence API)既java持久化API,Java EE 5.0 平台标准的 ORM 规范,使得应用程序以统一的方式访问持久层。
那么也就是说JPA其实是一组orm规范,并不是orm框架,像我们平时用过的hibernate,其实就是符合jpa规范的一个orm框架。有点像JDBC
,与JDBC驱动
,的关系。目前Hibernate 3.2+、TopLink 10.1+ 以及 OpenJPA 都提供了 JPA 的实现。
画一张图来更形象的说明他们的关系如下图所示::
下面来记录一下JPA的入门程序。这里使用的jpa实现是hibernate
(1)准备工作建立maven工程,导入所需的maven
依赖
<!--导入相关依赖-->
<dependencies>
<!--引入hibernate依赖-->
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.6.Final</version>
</dependency>
<!--引入jpa依赖-->
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.0.Final</version>
</dependency>
<!--引入hibernate-jpa-->
<!-- https://mvnrepository.com/artifact/org.hibernate.javax.persistence/hibernate-jpa-2.1-api -->
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
<!--数据库驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<!--测试相关包-->
<!--测试包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
在资源路径下建立一个META-INF
文件夹,加入配置文件persistence.xml
.其配置如下
<?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="jpa" transaction-type="RESOURCE_LOCAL">
<!--
配置使用什么 ORM 产品来作为 JPA 的实现
1. 实际上配置的是 javax.persistence.spi.PersistenceProvider 接口的实现类
2. 若 JPA 项目中只有一个 JPA 的实现产品, 则也可以不配置该节点.
-->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<!--添加持久化类-->
<class>com.kuake.Student</class>
<!--配置数据库信息-->
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql:///jpa"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.password" value="root"/>
<!-- 配置 JPA 实现产品的基本属性. 配置 hibernate 的基本属性 -->
<!--格式化sql-->
<property name="hibernate.format_sql" value="true"/>
<!--在控制台打印sql-->
<property name="hibernate.show_sql" value="true"/>
<!--自动建表-->
<property name="hibernate.hbm2ddl.auto" value="update"/>
</properties>
</persistence-unit>
</persistence>
(2)编写持久化的类
@Table(name = "jsp_student")//建表名称
public class Student {
private Integer id;
private String name;
private Integer age;
private String email;
@Id //主键
@GeneratedValue(strategy = GenerationType.AUTO)//主键生成策略
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
//列的名字
@Column(name = "username")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
@Entity
表示这是一个实体类与数据库对应@Table()
指定表名@Column
指定对应属性在数据库的列名,(如果不设置,默认就是该字段名)
(3)编写测试类
public class DemoTest {
@Test
public void test(){
//创建EntityManagerFactory
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa");
//创建EntityManager对象
EntityManager entityManager = entityManagerFactory.createEntityManager();
// 获得并且开启事物
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
//持久化操作
Student student = new Student();
student.setAge(12);
student.setEmail("123@qq.com");
student.setName("jack");
entityManager.persist(student);
//提交事务
transaction.commit();
//关闭EntityManager对象
entityManager.close();
//关闭EntityManagerFactory
entityManagerFactory.close();
}
}
输出:
*加粗样式
观察一下控制台,发现执行了一条创建表语句,跟插入数据语句
然后查看数据库:
表创建成功,数据也成功插入了,表名就是我们@Table()
所设置的表面。然后除去我们@Column(name = "username")
标注的列名外,默认值都是我们持久类的字段名。
总结一下:
- jpa是一种规范,不是一种框架,如hibernate就是基于jpa规范的一种实现
jap的hellowold步骤:
1.创建 EntityManagerFactory
2.获得 EntityManager对象
3.获得并且开启事务
4.持久化操作
5.提交事务
6.关闭EntityManager对象
7.关闭EntityManagerFactory