前言:公司最近在重构之前的项目,由于之前的技术过于老套,所以想用点新技术,这边我和另外一名同事被安排来做这件事,由于项目经理要求使用SpringDataJpa,所以这边把我弄的东西记录一下,方便以后查阅。
1.SpringDataJpa的简单介绍。
http://spring.io/projects/spring-data-jpa 是SpringDataJpa的官网地址。
从官网的介绍,我们可以大致总结一下SpringDataJpa的功能以及设计初衷:
- Spring Data JPA是更大的Spring Data系列的一部分,可以轻松实现基于JPA的存储库。此模块处理对基于JPA的数据访问层的增强支持。它使构建使用数据访问技术的Spring驱动应用程序变得更加容易。
- Spring Data JPA旨在通过减少实际需要的工作量来显着改善数据访问层的实现。作为开发人员,您编写存储库接口,包括自定义查找器方法,Spring将自动提供实现。
- 基于Spring和JPA构建存储库的复杂支持
- 支持Querydsl谓词,从而支持类型安全的JPA查询
- 透明审核域类
- 分页支持,动态查询执行,集成自定义数据访问代码的能力
@Query
在引导时验证带注释的查询- 支持基于XML的实体映射
- 基于JavaConfig的存储库配置介绍
@EnableJpaRepositories
。
PS:SpringData是Spring的一个子项目,设计的初衷是为数据访问提供熟悉且一致的基于Spring的编程模型,同时仍保留底层数据存储的特殊特性,它使得使用数据访问技术,关系数据库和非关系数据库,map-reduce框架和基于云的数据服务变得容易。
http://spring.io/projects/spring-data 是SpringData官网地址,如果需要了解更多,可以去官网了解。
2.基于SpringBoot环境下的SpringDataJpa介绍
因为我们使用到的环境是SpringBoot,所以在这一节主要介绍的是SpringDataJpa在SpringBoot环境下的使用。如果需要用传统的方式去搭建框架并使用SpringDataJpa的话,可以去百度查阅相关资料,我们这里不做相关讨论。
2.1:实体类中常用注解的介绍
我们在SpringDataJpa官网下载的Demo代码结构如上图所示。
版本要求:
JDK1.8或更高版本
Gradle4+或Maven 3.2+
Customer.java文件如上图所示,以下对所涉及到的注解做一个简单说明。
@Entity:标识这个实体类是一个JPA实例
@Id:表示这个变量为主键Id
@GeneratedValue:设置主键的生成策略,默认就是自动生成
另外我们可以看见GenerationType是一个枚举类型,他还有其他3种生成策略:
AUTO:表示实体标识由JPA容器自动生成,这也是Strategy属性的默认值
IDENTITY:JPA容器将使用数据库的自增长字段为新增加的实体对象赋唯一值,作为实体的标识,前提是需要数据库提供对自增长字段的支持。
SEQUENCE:表示使用数据库的序列号为新增加的实体对象赋唯一值,作为实体的标识,前提是数据库提供对序列号的支持。
TABLE:表示使用数据库中指定表的某个字段记录实体对象的标识,通过该字段的增长为新增加的实体对象赋值,作为实体的标识。
总结:其实我们在开发过程中使用最多的主键生成策略就是AUTO,自动生成策略,其他的可以了解一下。
这边官方的Demo里面涉及到的注解有点少,我把实际开发中可能会用到的注解再进行一个补充。
@Table(name=”自定义的表名”):首先该注解的作用域是类,表示把该注解的类映射到数据库中的表中。
@Column:标识把该字段映射到数据库中的某一列。作用在字段上。
可选项:
name:表示映射到具体某一列,name用于标识该列的名称
nullable:是否为空
unique:是否唯一
columnDefinition:自定义该字段的类型和长度
length:自定义长度
@Transient:表示该属性并非一个到数据库表字段的映射,ORM框架将忽略该属性。
@Temporal:当我们使用到java.util包中的时间日期类型,则需要@Temporal注释来说明转化成java.util包中的类型。其中包含三种转化类型分别是: java.sql.Date日期型,精确到年月日,例如“2008-08-08” java.sql.Time时间型,精确到时分秒,例如“20:00:00” java.sql.Timestamp时间戳,精确到纳秒,例如“2008-08-08 20:00:00.000000001”
2.2JPA中Repository接口介绍
SpringDataJpa的强大之处就在于它的Repository接口的强大,我们只需要继承它的接口,然后按照它的规范编写我们自定义查询的方法名,Spring Data JPA在您运行应用程序时动态创建实现。
首先我们需要清楚的是Repository是SpringDataJpa的一个核心接口,它不提供任何方法,开发人员需要在自己定义的接口中声明需要的方法。
我们可以看到Repository接口是一个泛型接口:
T:标识实体类
ID:主键类型
Repository接口的层级关系如下图所示:
CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法
PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法
JpaRepository: 继承 PagingAndSortingRepository,实现一组 JPA 规范相关的方法
当我们自定义的Repository接口继承了Repository接口后,我们就可以自定义一些查询方法 。
然后在业务层和控制层就可以进行相应的业务开发了。