Spring Data JPA
Spring Data
统一了持久层。
为什么要用Spring Data? 为什么不用JDBC,MyBatis?
如果我要实现一个电商里面的秒杀功能,并发量一般很高,单一的数据存储方案已经不能满足需求了。现在一般是不同的场景会用不同的数据存储方案。
比如我们可以把经常访问的数据也就是热点数据缓存在Redis中,然后可能还有mongoDB,neo4j等,对于开发人员来说要会的东西就更多了,所以我们就希望有一种似乎来统一操作各种不同的数据存储方案。
Spring Data 提供各种模板对象来进行数据存储的操作,总结一下就是:Spring Data致力于为数据访问也就是DAO提供熟悉且一致的基于Spring的编程模板和通用接口。其目的是统一和简化对不同类型持久性存储(关系和NoSQL)的访问。
Spring Data 主要模块
常见的有:
- Spring Data common
- Spring Data JDBC
- Spring Data JPA
- Spring Data MongoDB
- Spring Data Redis
- Spring Data REST
Spring Data 主要特性
- 模板制作
- 对象/数据存储映射
可以通过XML/注解进行对象关系映射,都不用写SQL语句来,直接用类的方法就可以增删改查
JPA
@Entity
@Table(name="TUSER")
public class User {
@Id
private String id;
@Column(name="fn")
private String name;
private Data lastLogin;
@OneToMany
private List<Role> roles;
}
- Repository 支持
Repository 提供了基本的数据访问功能,其几个字接口则扩展了一些功能。它们的继承关系如下:
Respository: 仅仅是一个标识,表明任何继承它的均为仓库接口类
CrudRepository: 继承 Repository, 实现了一组 CRUD 相关的方法
PagingAndSortingRepository: 继承Repository, 实现了一组分页排序相关的方法
JpaRepository: 继承 PagingAndSortingRepository, 实现一组 JPA 规范相关的方法
自定义的Repository 只需继承 XxxxRepository,这样自定义的Repository接口就具备了通用的数据访问控制层的能力
JPA和JDBC的关系
相同处:
- 都和数据库操作有关,JPA是JDBC的升级版
- JDBC和JPA都是一组规范接口
- 都是由SUN官方推出的
不同处:
- JDBC是由各个关系型数据库实现的,JPA是由ORM框架实现的。
- JDBC使用SQL语句和数据库通信的,JPA用面向对象式,通过ORM框架来生成SQL,进行操作,所以也是要生成SQL然后通过JDBC去操作,只不过不用我们自己去做了,是框架做的。
- JPA在JDBC之上的,JPA也要依赖JDBC才能操作数据库
JDBC的问题:
- 得用SQL语句,有学习成本
- 数据库的移植性不高,因为不同数据库的SQL语句会有不同
- Java对象属性和数据库字段的映射麻烦
SUN在JDK1.5提出了JPA
JPA全称 Java Persistence API,是SUN官方提出的一种 ORM规范:Object Relational Mapping
SUN希望开发者能从JDBC和SQL代码中解脱出来,直接面向对象操作,并希望持久化技术能够统一,天下归一,如果你是基于JPA进行持久化你可以随意切换数据库。
Hibernate 与 JPA
Hibernate就是实现了JPA接口的ORM框架
也就是:JPA是一套ORM规范,Hibernate实现了JPA规范
MyBatis:小巧、方便、半自动的ORM框架
MyBatis: 就是jdbc的封装, 在国内更流行,因为国内的业务一般更复杂,很多场景需要自己写SQL才能实现,
Spring Data JPA
Spring Data JPA 是 Spring 提供的一套简化JPA开发的框架,按照约定好的规则进行方法命名去写DAO层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作,同时提供了很多除了CRUD之外的功能,例如分页,排序,复杂查询等。有了接口之后靠JDK的动态代理为接口增强。
也就是说现在的执行流程是:
Java Application --> Spring Data JPA. --> JPA -->JPA的实现(Hibernate) -->JDBC --> 数据库
例子:
SpringBoot创建的项目,JPA实现会自动依赖Hibernate
Spring Data JPA JavaConfig配置
使用Spring Data Repositories
Domain Driven Design
SpringBoot整合JPA
创建SpringBoot项目加入SpringData, SpringWeb, MySql Driver的场景启动器
Spring Data JPA 配置项
SpringBoot有很多自动配置类
自定义操作 JPQL和SQL
可以通过 SpringDataJPA提供的接口实现持久化操作,但是支持是有限的,如果想实现更复杂的持久化操作,需要自定义操作.
@Query
- 查询如果返回单个实体,就用pojo接收,如果是多个需要通过集合
- 参数设置方式
- 索引: ?数字
- 具名: :参数名。结合@Param注解指定参数名字
- 增删改:
- 要加上事务的支持
- 如果是插入只能在hibernate支持下才行