JPA--java操作数据库框架
1.JPA
1.1.什么是JPA
JPA是JPAJPA开发效率高,运行效率低
(2)JDBC开发效率低,运行效率高(更接近底层,代码繁琐)
(3)JPA兼容各种数据库(方便移植)
(4)JPA有内置缓存(性能在一定程度上有所优化)
(5)JPA直接面向持久对象操作
(6)JPA不能干涉SQL的生成
1.4.ORM概念
Object Relational Mapping, 对象关系映射
ORM 就是通过将Java对象映射到数据库表,通过操作Java对象,就可以完成对数据表的操作
2.JPA程序搭建
2.1.创建一个普通Maven项目
2.2.在pom.xml中配置需要的jar包
2.3.引入persisten.xml文件
2.4.配置persisten.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
<!--
持久化单元,可以有多个
RESOURCE_LOCAL:本地的事物
JTA:分布式系统要使用的事物
-->
<persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL">
<properties>
<!--四个连接数据库的属性-->
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3307/jpa"/>
<property name="hibernate.connection.username" value="root"/>
<property name="hibernate.connection.password" value="zy214214~"/>
<!--方言属性:要操作的数据库,根据不同的方言拼接不同的SQL-->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<!--可选属性-->
<!--自动生成表
create-drop:删 → 建 → 执行CRUD → 删
create:删 → 建 → 执行CRUD
update:没有表则建表 有表则在原来表的基础上修改表结构(只加不减,不该类型)
validate:验证(只验证domain中已有的数据)
none:什么都不做
-->
<property name="hibernate.hbm2ddl.auto" value="create"/>
<!--是否在控制台显示sql-->
<property name="hibernate.show_sql" value="true"/>
<!--格式化sql:sql在控制台显示的格式-->
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
2.5.domain配置
/**
* @Entity 表示由一个jpa管理的持久对象,对应数据库中的一张表
* @Table 设置表名
*/
@Entity
@Table(name = "t_employee")
public class Employee {
/**
* @Id 表示主键
* @GeneratedValue 表示主键自动递增
*/
@Id
@GeneratedValue
private Long id;
private String name;
private String password;
// getter/setter略
}
3.CRUD
3.1.基本操作流程
(1)获取EntityManagerFactory实体化管理工厂对象(传入持久化单元名)
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("jpa");
(2)通过EntityManagerFactory对象获取实体管理对象
EntityManager entityManager = entityManagerFactory.createEntityManager();
(3)增删改需要提交事务
// 执行CRUD
// 提交事务
entityManager.getTransaction().commit();
// 事物提交失败,回滚
entityManager.getTransaction().rollback();
(4)关闭资源(实体管理对象)
// 关闭实体管理对象
entityManager.close();
3.2.新增
// 执行新增操作
entityManager.persist(employee);
3.3.删除
// 如果数据库有数据
if (employee != null) {
// 执行删除操作
entityManager.remove(employee);
}
3.4.查找单条数据
// 执行查询操作
return entityManager.find(Employee.class, id);
3.5.查找所有数据
// 执行查询操作
// 需要写一个jpql语句
// 简写1
// String jpql = "select o from Employee o";
// 简写2
// String jpql = "from Employee";
// (推荐写法)
String jpql = "select x from cn.meco.jpa.domain.Employee x";
// 获取query对象
Query query = entityManager.createQuery(jpql);
// 获取List集合
return query.getResultList();
3.6.修改
employeeDao.update(employee);
// 执行修改操作
entityManager.merge(employee);
4.重要API
4.1.Persisten
- 解析相应的核心配置文件
- 创建EntityManagerFactory对象
4.2.EntityManagerFactory
线程安全对象,重量级对象
一个应用程序对应一个EntityManagerFactory:一个数据库(1:1:1)
(1)数据库配置信息它里面有一个连接池(本身就重,创建与销毁太费时间)
(2)二级缓存(查询缓存,...)
(3)预定义的JPQL语句(JPQL,SQL)
(3)所有实体及关系
4.3 EntityManager
(1)轻量级对象
(2)线程不安全
(3)提供CRUD
(4)内置一级缓存
一级缓存命中:同一个EntityManagerFactory,同一个EntityManager,同一个OID
4.4. EntityTransaction
- EntityManager只有这一个事务
- 如果多个系统/多个数据库 使用JTA
5.映射细节
5.1 .@Column
// 在表中列名为pid
private Long id;
5.2.@Lob
大文本,可以装很多数据
5.3.@Transient
临时属性(JPA不会管理这个属性)
5.4.@Temporal时间设置
年月日,时分秒
年月日
时分秒