JPA
ORM思想及JPA规范
ORM思想
JDBC对数据库的操作
实体类
public class User {
private Integer userId;
private String userName;
private String address;
}
数据库表
CREATE TABLE t_user(
id INT AUTO_INCREMENT,
username VARCHAR,
address VARCHAR
)
JDBC操作步骤
-
准备语句
String sql = "insert into t_user(username, address) values(?, ?)";
-
获取连接
Connection con = DriverManger.getConnection(username, password, url);
-
创建statment
PreparedStatment pst = con.PreparedStatment(sql);
-
对占位符进行赋值
pst.setString(1, user.getUserName);
pst.setString(2, user.getAddress);
-
发送查询
pst.executeUpdate();
JDBC操作繁杂,如果实体类和数据库的表,实体类的属性和表的字段之间建立关系的话,sql的拼接就可以自动完成了。
ORM思想
实体类和数据库的表、实体类的属性和表的字段之间建立关系就实现了ORM思想
ORM思想:操作实体类就相当于操作数据表
Hibernate框架
实现了ORM思想的框架比较多,比较有代表性的有Mybatis,Hibernate
Hibernate是一个开源的关系映射框架,他对JDBC进行了非常轻量级的对象封装,将POJO与数据库表建立映射关系,是一个全自动的ORM框架。它可以自动生成SQL语句,自动执行。
JPA规范
出现顺序:ORM思想->Hibernate框架->JPA规范
JPA规范内部是由接口和抽象类组成的,其思想跟JDBC规范是一样的
JPA基本使用
环境搭建
Maven坐标
lombok
log4j
mysqlDriver
junit
hibernate
c3p0 数据库连接池
JPA核心配置文件
配置到类路径的META-INF文件夹下,命名为persistence.xml,约束模板可以在idea中找到
客户实体类&映射关系
@Entity
@Table(name = "cst_customer")
public class Customer {
@Id // 声明主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 主键生成策略
@olumn(name = "cst_id")
private Long custId;
@olumn(name = "cst_address")
private String custAddress;
@olumn(name = "cst_industry")
private String custIndustry;
@olumn(name = "cst_level")
private String custLevel;
@olumn(name = "cst_name")
private String custName;
@olumn(name = "cst_phone")
private String custPhone;
@olumn(name = "cst_source")
private String custSource;
//getter&setter
}
CRUD基本操作
使用的JPA规范,底层实现是Hibernate
setCustIndustry
保存:persist
更新:merge
删除:remove
查找:find/getRefrence
立即加载vs延迟加载
JPQL的使用
JPA提供的插叙语句,跟sql语句很相似,只不过JPQL是面向对象的,它查询的是对象及对象的属性
sql:查询的是表和表中的字段
jpql:查询的是实体类和实体类中的属性
查询全部:
sql:SELECT * FROM cst_customer
jpql:from com.yaohl0911.customer
分页查询:
统计查询:
条件查询:
排序查询:
Spring Data JPA
Spring Data JPA概述
Spring对JPA规范的封装
Spring Data JPA入门操作
环境搭建
maven坐标
spring配置
实体类&映射关系
@Entity
@Table(name = "cst_customer")
public class Customer {
@Id // 声明主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 主键生成策略
@olumn(name = "cst_id")
private Long custId;
@olumn(name = "cst_address")
private String custAddress;
@olumn(name = "cst_industry")
private String custIndustry;
@olumn(name = "cst_level")
private String custLevel;
@olumn(name = "cst_name")
private String custName;
@olumn(name = "cst_phone")
private String custPhone;
@olumn(name = "cst_source")
private String custSource;
//getter&setter
}
DAO层接口
只需要编写接口,不需要实现
需要继承两个接口:JpaRepository,JpaSpecificationExecutor(是不是过时了?),且提供对应的泛型
findOne/getOne
getOne需要加上事务的支持@Transactional
findOne用em.find实现,立即加载
getOne用em.getRefance实现,延迟加载(返回动态代理对象,什么时候用什么时候查询)
save
update
delete
findAll
count
exists
Spring Data JPA运行原理
JdkDynamicAopProxy
SimpleJpaRepository
- 通过jdkDynamicAopProxy的invoke方法创建了一个动态代理对象,即SimpleJpaRepository
- SimpleJpaRepository当中封装了JPA的操作(借助JPA的ap完成数据库的CRUD)
- 通过Hibernate完成数据库的操作(封装了JDBC)
JPQL实现方式
Spring Data JPA复杂查询
借助接口中定义好的方法完成查询