全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。
1. 回顾JDBC操作数据库
1.1 ORM思想
ORM思想的引入:操作实体类,就相当于操作数据库表
建立两个映射关系:
实体类和表的映射关系
实体类中属性和表中字段的映射关系
有了这个ORM思想,我们不再重点关注SQL语句
实现了ORM思想的框架:MyBatis,Hibernate
1.2 JPA规范
jpa规范,由SUN公司定义,内部是由接口和抽象类组成,JPA只是规范,虽然它也它体现了ORM的思想,但具体的实现是由一些具体的框架实现的。
1.3 Spring Data JPA
Spring Data JPA是Spring提供的一套对JPA操作更加高级的封装,是在JPA规范下的专门用来进行数据持久化的解决方案。底层默认的是依赖 Hibernate JPA 来实现的。
1.4 Spring Data
Spring Data是Spring 的一个子项目。用于简化数据库访问,支持NoSQL和关系数据库存储。其主要目标是使数据库的访问变得方便快捷。而Spring Data JPA
只是其中的一个。
2. Spring Data JPA
全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而接口是需要实现才能工作的。
2.1 JPA的特点
Spring Data JPA使得那些以JPA接口为规范的应用更加方便, 致力于减少数据访问层(DAO)的开发量。
Spring Data JPA 底层默认的使用的是 Hibernate 来做的 JPA 实现。
其技术特点:我们只需要定义接口并集成 Spring Data JPA 中所提供的接口就可以了。不需要编写接口实现类。
2.2 基本注解
@Entity
1 | 写在类上,用于指明一个类与数据库表相对应。 |
@Table
1 | 写在类上,一般与 连用,用于指定数据表的相关信息。 |
@Id、@GeneratedValue
1 | 写在类中的变量上,用于指定当前变量为主键 Id。一般与 连用。 |
@Column
1 | 写在类的变量上,用于指定当前变量映射到数据表中的列的属性(列名,是否唯一,是否允许为空,是否允许更新等)。 |
@Temporal
1 | 用于将 java.util 下的时间日期类型转换 并存于数据库中(日期、时间、时间戳)。 |
3. Spring Data JPA的使用
3.1 配置环境
在 application.yml
文件中添加我们需要的配置信息
1 | spring: |
3.2 实体类映射
创建映射实体类 DeptEntity
, 这里用来 lombok
插件省去了 get/set
方法,对于 @Column
注解是可以放在 get
方法上的
1 |
|
编写完实体后,然后添加相应的 Dao
层接口,需要继承 JPA
的接口 JpaRepository
, 代码如下:
1 | public interface DeptRepository extends JpaRepository<DeptEntity,Integer> { |
我们的 dao 层是一个接口,没有具体的实现,在继承的接口中已经定义了一些常用的方法供我们使用,后面详细介绍
3.3 查询方法
1) 直接调用接口中的方法
1 |
|
2) jpql的查询方式
jpql : jpa query language (jpq查询语言)
特点:
语法或关键字和sql语句类似
查询的是类和类中的属性需要将JPQL语句配置到接口方法上
1.特有的查询:需要在dao接口上配置方法
2.在新添加的方法上,使用注解的形式配置jpql查询语句
3.注解 : @Query代码实现如下:
在dao接口中自定义方法并添加注解
1 | /** |
3) sql语句查询方式
- 特有的查询:需要在dao接口上配置方法
- 在新添加的方法上,使用注解的形式配置sql查询语句
- 注解 :@Query
1 | value :jpql语句 | sql语句 |
示例 dao接口代码:
1 | /** |
4) 方法名规则查询
是对jpql查询,更加深入一层的封装
我们只需要按照SpringDataJpa提供的方法名称规则定义方法,不需要再配置jpql语句,完成查询
规则:
findBy开头: 代表查询
对象中属性名称(首字母大写)
含义:根据属性名称进行查询
规则:
5) 自定义条件查询
JpaSpecificationExecutor 是一个接口。查询语句都定义在 Specification 中。搭配JpaRepository
可以实现自定义的复杂条件查询。
步骤:
Step1:实现 Specification 接口(定义泛型,为查询的对象类型),重写 toPredicate() 方法。
Step2:定义 CriteriaBuilder 查询条件。
查看JpaSpecificationExecutor
中定义的方法:
1 | public interface JpaSpecificationExecutor<T> { |
查看参数Specification
:
1 | public interface Specification<T> extends Serializable { |
使用:
1 |
|
- 本文作者: zicair
- 本文链接: https://zicair.github.io/2020/08/24/Spring-Data-JPA学习/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!