JPA介绍
JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。
JPA和Hibernate的关系
1.JPA 是规范:JPA 本质上就是一种 ORM 规范
2.Hibernate 是实现:Hibernate 除了作为 ORM 框架之外,它也是一种 JPA 实现
ORM映射文件之前使用的是配置方式,这里可以通过JPA规范,把ORM映射使用注解来替代。
Hibernate的注解方式(HibernateJPA)
JPA 的供应商
1.Hibernate
2.OpenJPA
3.TopLink
JPA特点:
1.标准化:
2.简单易用
3.媲美JDBC
4.支持面向对象
开发流程:
第一步:创建Web项目,导入依赖
必须创建Web项目
同时放入jpa模板文件
image.png第二步:配置JPA核心配置文件
创建JPA的核心配置文件
核心配置persistence.xml(名称是固定的), 在这个文件中配置持久化单元
1.JPA 规范要求目录结构:在META-INF中
2.需要指定 JPA 使用哪个持久化的框架以及配置该框架的基本属性
a)需要指定跟哪个数据库进行交互;
b)指定方言等扩展属性
image.png
image.png
配置文件:
代码:
<?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="java1803" transaction-type="RESOURCE_LOCAL">
<!-- 指定JPA的实现厂商 -->
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<!-- 注册实体 -->
<class>com.qf.pojo.JavaPhone</class>
<!-- 配置HibernatePersistenceProvider对应的属性 -->
<properties>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"></property>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/qqhr?characterEncoding=utf-8"></property>
<property name="hibernate.connection.username" value="root"></property>
<property name="hibernate.connection.password" value=""></property>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL55Dialect"></property>
<property name="hibernate.show_sql" value="true"></property>
<property name="hibernate.format_sql" value="true"></property>
<!-- 生成表 -->
<property name="hibernate.hbm2ddl.auto" value="update"></property>
</properties>
</persistence-unit>
</persistence>
注意<class>节点位置:
image.png
第三步:创建实体类和映射的注解
创建实体类, 使用 annotation 来描述实体类跟数据库表之间的映射关系.
JPA 基本注解:
1.@Entity 标注用于实体类声明语句之前,指出该Java 类为实体类,将映射到指定的数据库表。
2.@Table 映射表格
a)常和@Entity配合使用。
b)Name可选,表示表的名称,默认表名和实体名一致。
3.@Id 映射生成主键:通常置于属性声明语句之前,也可置于属性的getter方法之前。必须有,定义了映射到数据库表的主键属性
4.@GeneratedValue 用于标注主键的生成策略,通过 strategy 属性指定。
(strategy=GenerationType.AUTO)主键策略:
a)IDENTITY:采用数据库 ID自增长的方式来自增主键字段
b)AUTO: JPA自动选择合适的策略,是默认选项;
c)SEQUENCE:通过序列产生主键
- @Column 映射表格列 (可选):常用属性是 name,用于设置映射数据库表的列名。
表和类的关联
image.png
@Entity //声明当前类为hibernate映射到数据库中的实体类
@Table(name="qf_user") //声明在数据库中自动生成的表名
行和对象的关联
OID,在主键
image.png
@Id //声明此列为主键
字段和属性的关联
image.png
代码:
@Entity
@Table(name = "my_computer")
public class MyComputer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long comId;//主键策略
@Column(name = "com_name")
private String comName;// 属性映射
@Column(name = "com_desc")
private String comDesc;
public Long getComId() {
return comId;
}
public void setComId(Long comId) {
this.comId = comId;
}
public String getComName() {
return comName;
}
public void setComName(String comName) {
this.comName = comName;
}
public String getComDesc() {
return comDesc;
}
public void setComDesc(String comDesc) {
this.comDesc = comDesc;
}
}
注册实体别忘记:
image.png
第四步:开发DAO测试
初始化表测试:
public void initTable(){
//加载配置,得到工厂
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myjpa");
entityManagerFactory.close();
}
观察控制台的输出如下所示:
create table my_computer (
comId bigint not null auto_increment,
com_desc varchar(255),
com_name varchar(255),
primary key (comId)
) engine=InnoDB
是核心配置文件中的持久化单元名称
image.png
添加测试:
public void addCom(){
//第一步:加载配置,得到工厂
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myjpa");
//第二步:得到实体管理对象
EntityManager entityManager = entityManagerFactory.createEntityManager();
//第三步:开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
//第四步:操作数据
MyComputer pojo = new MyComputer();
pojo.setComName("联想");
pojo.setComDesc("支持国产");
entityManager.persist(pojo);
//第五步:提交事务
transaction.commit();
//第六步:关闭链接
entityManager.close();
entityManagerFactory.close();
}
完成CRUD(persist, find, merge, remove)
public class MyComputerDAO {
public void initTable(){
//加载配置,得到工厂
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myjpa");
entityManagerFactory.close();
}
public void addCom(){
//第一步:加载配置,得到工厂
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("myjpa");
//第二步:得到实体管理对象
EntityManager entityManager = entityManagerFactory.createEntityManager();
//第三步:开启事务
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
//第四步:操作数据
MyComputer pojo = new MyComputer();
pojo.setComName("联想");
pojo.setComDesc("支持国产");
entityManager.persist(pojo);
//第五步:提交事务
transaction.commit();
//第六步:关闭链接
entityManager.close();
entityManagerFactory.close();
}
public void findById(Long cid){
EntityManager entityManager = JPAUtils.getEntityManager();
MyComputer myComputer = entityManager.find(MyComputer.class, cid);
System.out.println(myComputer.getComName()+"\t"+myComputer.getComDesc());
entityManager.close();
}
public void updateCom(){
EntityManager entityManager = JPAUtils.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
MyComputer myComputer = entityManager.find(MyComputer.class, 1L);
myComputer.setComDesc("中国梦");
entityManager.merge(myComputer);
transaction.commit();
entityManager.close();
}
public void del(){
EntityManager entityManager = JPAUtils.getEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
MyComputer myComputer = entityManager.find(MyComputer.class, 1L);
entityManager.remove(myComputer);
transaction.commit();
entityManager.close();
}
public static void main(String[] args) {
MyComputerDAO dao = new MyComputerDAO();
// dao.initTable();
// dao.addCom();
// dao.findById(1L);
// dao.updateCom();
dao.del();
}
}
可以将上面重复的代码抽象成单例的工具类
注意:删除必须在同样一个实体管理对象中才可以,一个entityManager查,一个新entityManager删除会失败。
测试:
image.png image.png
跨Session不在同样一个事务中。
bug:
image.png
网友评论