世上有千万条路,但是最重要的是找到自己适合的,世间有千万件事,只有做过,才能真正知道自己喜不喜欢,《像狗一样奔跑》里有一句话,对未知的道路失去勇气,才是青春真正的坟墓,人生总是要做一些没做过的事,不然谈何热爱,这一篇博客是我的第一百篇博客,从某种意义上讲,他意义重大,学习是一个输入输出的过程,写博客对与知识的学习帮助很大,他能帮助我真正的去理解技术点,也能帮助我对知识技术栈的系统总结,未来我还会坚持下去,不为什么,只是因为有了热爱。
这次说一说,Spring data Jpa
这个框架作为Spring体系的一部分,越来越被人熟知,市场上比较多的是使用Mybatis,但是Spring Data jpa也是有比较多的优点。
先说说他是什么,我们之前使用过一些数据库查询的框架Hibernate,和Spring data Jpa是有一些关联的,但是很多人包括我之前对他们之间关联的理解都是存在问题的
Hibernate是使用了Jpa规范的框架,注意这里的Jpa并不是Spring Data Jpa而是一种规范,Jpa这种规范主要是为了进行一个统一,否则不同的框架使用不同的规范那就乱了套了,Spring Data Jpa也是使用了Jpa这个规范,他和Heibernate的区别就是他在Jpa规范的基础上又做了一层抽象,而Hibernate是没有的,但是网上很多人说的都是Spring data Jpa是基于Hibernate的,我觉得造成这样的理解问题,很大原因是他的确和Hbernate很像,orm映射,hql语句等,而且也有人说jpa是Hibernate提供的,但我想既然是一个通用的规范,应该不仅仅是Hibernate提供。
那为什么选择他,首先SpringDataJpa,写查询就很方便,通过方法名就可以,实现上是通过接口的方式,下面说说他的几个接口
public interface Repository<T, ID extends Serializable> {
}
这是一个核心接口,他什么也不干,但是,他并不是表面上的什么也不干,这是一种抽象思想的编码方式,是一个标记 标记类以及id类型,另外在Spring动态代理的时候发现是他的子类那就是数据库操作的。
然后我可以通过idea的navigate->type Hierachy查看他的层次结构图,看看他有哪些实现,这一步十分重要,因为学习框架的原理离不开源码的阅读,而源码的学习也是有方法的,之前学习spring源码就是因为对结构的不明朗导致学习进步较慢,所以还是需要一些技巧。
我们发现他有几个子类,而他的子类也是有意思,一个套一个CrudRestitory,然后PagingAndSortingResitory,然后JpaRestitory,这些个子类每一个都有自己能做的事,他们是继承关系。
CrudRestitory,类如起名,增删查改,然后PagingAndSortingResitory在基础上加分页排序,JpaRestitory在前面基础上加批量。
那他们是怎么实现的呢,我一直有这个疑问,在网上的博客大都没有解释,于是我看了《Spring data Jpa从入门到精通》这本书,书写的很详细,他们有一个实现类
public class SimpleJpaRepository<T, ID extends Serializable> implements JpaRepository<T, ID>, JpaSpecificationExecutor<T> {
private final JpaEntityInformation<T, ?> entityInformation;
private final EntityManager em;
private final PersistenceProvider provider;
private CrudMethodMetadata crudMethodMetadata;
就是他,然后我们看到EntityManager 类,这个类就是springDataJpa用来管理session的,就像Mybatis的SqlSessionFactory,这一点先收到这。
现在开始聊一聊,他的数据保存,我们会发现spring的jpa实现的保存有两个方法,一个是sava 一个saveAndFlush,那为什么会有两个方法呢
官网给的资料,一个即时生效,一个即时可能不生效saveAndFlush,spring的jpa提交数据库是用save并不是一下子提交的,而是先加载到内存,然后再提交,这样也是相当与出现一个中间层,而且加载到内存一起提交也可以减少对数据库的压力,而且还会进行优化,比如insert delete update的顺序调整,但是这个可能存在问题,比如在一个事务里面,后面的查询依赖前面的更新操作,那如果不能及时的提交给数据库,就会导致查询有问题。所以在这种情况下还是要使用saveAndFlush,其实Jpa的知识还是不少,今天就先写到这,后续会持续的更新。