引入
一方面,现在大多数公司使用微服务,微服务将项目拆分开了,很少用到联查。另一方面,虽然现在我们使用的mybatis也很好用,但是配置文件太多,并且会额外生成一个example和一个mapper,还是很复杂。这种情况下就可以使用spring data jpa,因为spring data jpa零配置,他的接口api中也封装了很多方法,并且sql使用也很灵活。
Spring-data-jpa的优点
零配置,使用简单。
Spring-data-jpa是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展,大大降低了持久层的工作量。我们只需要定义接口并集成springdatajpa中所提供的接口就可以了,不需要编写接口实现类。
1、简化了我们的持久层开发工作,可以让我们持久层不用去书写具体实现代码,直接写一个继承Repository接口的Dao层接口,然后开启JPA的注解扫描就可以进行持久层开发了(开启注解后,会自动扫描所有继承了Repository接口的子接口或者子实现,并自动将它交给Spring去进行管理,可以说是很好的与Spring整合)。
2、SpringDataJPA提供了一些常用的ACID抽象方法,我们可以直接拿来使用,此外,还提供了属性表达式、命名查询、Query注解等方式供我们使用。
3、SptingDataJPA简化了分页的业务处理,他的Repository接口实现了
PagingAndSortingRepository接口,我们要做的只是将相关数据封装到接口
PagingAndSortingRepository中的findAll()方法中,它自动给我们返回Page对象,我们可以针对返回的Page对象根据我们的需求自动解析并封装成我们想要的JSON数据。
JPA、Hiberate、Spring-data-jpa三者之间的关系
JPA是ORM规范,jpa是对Hibernate、TopLink的封装(mybatis是半自动的orm框架,spring data jpa不对其封装),这样的好处是开发者可以面向JPA规范进行持久层的开发,而底层的实现(Hibernate对数据库进行操作)则是可以切换的。Spring Data Jpa则是在JPA之上添加另一层抽象(Repository层的实现),极大地简化持久层开发及ORM框架切换的成本。
知识点
JPA自带的几种主键生成策略
1、TABLE:JPA提供的一种机制,通过一张数据库表的形式帮助我们完成主键自增。
生成主键时,不在借助数据库,而是JPA程序来做,维护一张表,表中有主键的值。也就是说,当生成策略为TABLE时,会生成两张表,一张是用户表,一张为存放主键的表,存放的为下一个主键的值。
2、SEQUENCE:根据底层数据库的序列化来生成主键,条件是数据库支持序列(如oracle)。这个值要与generator一起使用,generator指定生成主键使用的生成器。
3、IDENTITY:主键由数据库自动生成(主要是支持自动增长的数据库,如mysql)
4、AUTO:主键由程序帮助选择,也是GenerationType的默认值。
TABLE和AUTO只要理解就可以了,mysql的话用IDENTITY,orcale用SEQUENCE。
Spring data jpa的常用注解
1、@Entity 声明一个实体类。
2、@Table 指定这个类对应数据库中的表名。如果这个类名的命名方式符合数据库的命名方式,可以省略这个注解。如FlowType类名对应表名flow_type。
3、@Id 指定这个字段为表的主键
4、@GeneratedValue(strategy=GenerationType.IDENTITY) 指定主键的生成方式,一般主键为自增的话,就采用GenerationType.IDENTITY的生成方式。
5、@Column() 声明实体类属性名对应的表字段名称。有很多参数,name表示对应数据表中的字段名。insertable 表示插入式是否更新。updateable,表示update的时候是否更新;columnDefinition表示字段类型,当使用jpa自动生成表的时候比较有用。
6、@MappedSuperclass 表示一个这是一个父类,不会被当成一个实体类。在这里定义一些表中的通用字段。然后其他实体类继承这个类就可以了,避免写重复代码。
Spring Data JPA提供的接口类(Spring Data JPA的核心API)
1、Repository:最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,且能让组件扫描的时候自动识别。Repository<T, ID>使用泛型定义的实体类类型和主健类型。2、CrudRepository :是Repository的子接口,提供CRUD的功能,有哪些接口看API,默认是很简单的CRUD操作。
3、PagingAndSortingRepository:是CrudRepository的子接口,添加分页和排序的功能。
4、JpaRepository:是PagingAndSortingRepository的子接口,增加了一些实用的功能,比如:批量操作等。对父接口中的方法,对返回值做适配处理。如果有分页操作,一般继承这个类。
5、JpaSpecificationExecutor:没有继承任何接口,用来完成条件查询。
Specification:是Spring Data JPA提供的一个查询规范,要做复杂的查询,只需围绕这个规范来设置查询条件即可。
创建JPA接口类
创建一个接口,需要继承spring data jpa提供的接口类。
public interface SpringdataJpaRepository extends JpaRepository<TbUser,Integer>{
}
第一个参数为实体类,第二个参数为实体类的主键ID。
Spring-boot整合Spring-data-jpa 依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--引入pageHelper分页插件 PageInfo -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--导入静态资源webjars-->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.4.1</version>
</dependency>
<!--引入bootstrap-->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>4.3.1</version>
</dependency>
<!--mysql的驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector