由Spring Data JPA和JPA 所想到的

由Spring Data JPA和JPA 所想到的

1.Spring Data JPA和JPA的区别和联系

这两个概念之前就接触过,因为也就使用过Hibernate和Mybatis,所以对这两个概念也没有深入看过,查了很多资料,网上关于这方面的内容质量不高(毕竟现在写博客的门槛低得很😂),还是雷丰阳大神的图片总结的比较好:

JPA是Sun公司出品的一套规范,和jdbc一样,都是使用了面向接口的思想,jdbc规范可以对各个数据库进行统一管理,只需要提供相应的数据库驱动即可,那么JPA也一样,是orm框架的一个规范。Hibernate作为龙头老大,通说他的作者就是JPA概念的提出者,同样实现了JPA规范,而且是JPA的默认实现,所以一些情况下说是使用JPA,其实用的就是Hibernate。

Spring Data JPA是Spring Data的一个子模块,先看一下Spring官网中对于Spring的overview:

Spring Data’s mission is to provide a familiar and consistent, Spring-based programming model for data access while still retaining the special traits of the underlying data store.

It makes it easy to use data access technologies, relational and non-relational databases, map-reduce frameworks, and cloud-based data services. This is an umbrella project which contains many subprojects that are specific to a given database. The projects are developed by working together with many of the companies and developers that are behind these exciting technologies.

Spring Data是对所有基于Spring实现的项目的数据访问的一个封装,是一个非常大的概念,overview:

Spring Data JPA, part of the larger Spring Data family, makes it easy to easily implement JPA based repositories. This module deals with enhanced support for JPA based data access layers. It makes it easier to build Spring-powered applications that use data access technologies.

Implementing a data access layer of an application has been cumbersome for quite a while. Too much boilerplate code has to be written to execute simple queries as well as perform pagination, and auditing. Spring Data JPA aims to significantly improve the implementation of data access layers by reducing the effort to the amount that’s actually needed. As a developer you write your repository interfaces, including custom finder methods, and Spring will provide the implementation automatically.

数据访问不仅可以是关系型数据库,还可以是Nosql,甚至map-reduce。而Spring Data JPA只是其中访问关系型数据库的一个子模块,由最上面的关系图可以看出,Spring Data JPA是对JPA的再一次封装,再一次的简化了操作,之前使用各种orm框架的时候需要在dao层写相应的逻辑,但是使用Spring Data JPA简化之后,只需要声明相应的接口并继承Repository接口即可,但是必须要按照人家的规定命名,例如:

image-20200519091916171

Spring Data JPA底层默认实现也是Hibernate

2.mybatis和JPA的比较

mybatis虽然是一个orm框架,但是他并没有实现JPA规范,是半自动的,而他和JPA之间的比较,实际上就是mybatis和hibernate之间的比较,在网上查了一些资料,一些比较都比较极端,我的想法是既然存在就有存在的道理,hibernate最大的特点就是开发者完全不需要关心sql语句的编写,框架自动完成了实体类和数据库表之间的映射,实现了以面向对象的方式来操作数据库,开发速度比较快,mybatis最大的特点就是他的半自动,他虽然完成了对jdbc的封装,但是将sql语句的实现交给开发者来实现,这样做牺牲了一些自动化特性,而且对开发者sql语句的编写能力也是有一定的要求,总之,降低自动化程度就可以换取相应的自由度,你看人家jdbc,虽然每一步都自己实现麻烦了一些,但是每一步都很自由。

看了一下使用趋势,mybatis在国内的使用非常普遍,而整个世界的情况确实几乎清一色的Hibernate,具体原因我有两个猜想:首先就是可能我们的龙头互联网企业最先使用了mybatis,然后其他的中小公司就进行了跟风,例如mysql(也不能这样说,毕竟mysql不像Oracle那样收费😂),其次就是由于我们国内的网民基数比较大,相应的对于一个产品的访问量也比较多,这是其他国家所不能比拟了,一个抖音的用户量都比美帝全部人口多了,所以hibernate自动生成的sql语句可能存在一些性能瓶颈,需要将sql语句单独拿出来进行优化、索引维护什么的。

虽然说mybatis可以自定义sql,但是还是存在一个问题:万一底层更换数据怎么办?要知道每个数据库厂商的语法可是不一样的,那么这时候使用JPA的优势就出来了,可以使用修改相应的配置,例如修改Hibernate配置文件中的方言,即可转型。所以我的一个小总结就是没有最好的,只有最合适的,具体用哪个还是要根据具体的需求场景来判断,而我目前的博客项目就要选用Mybatis,因为这是一个练手项目,使用Spring Data JPA未免太过自动化了,而且也没有变动数据库的需求

具体Spring Data JPA的使用方法,参考博客:Spring Data JPA 基本使用

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://hadoo666.top/archives/由springdatajpa和jpa所想到的md