一、现状描述
目前java 持久层ORM框架应用最广泛的就是JPA和Mybatis。JPA只是一个ORM框架的规范, 对该规范的实现比较完整就是Spring Data JPA(底层基于Hibernate实现),是基于Spring的数据持久层框架,也就是说它只能用在Spring环境内。Mybatis也是一个优秀的数据持久层框架,能比较好的支持ORM实体关系映射、动态SQL等。
笔者在学习这两个框架的过程中,看过不少的帖子,每当有帖子比较这两个框架的优缺点,就引来一场论战。从笔者的角度,为什么国内的开发人员或者开发团队较少使用JPA?为了避免有人抨击我,我特意去做了一下国内某度指数搜索,这个数据骗不了人。

图中蓝色线条为Mybatis搜索量,绿色为JPA搜索量。如果你换一个国外的搜索指数,你会得到一个完全不同的结果。那么这是为什么呢?我们还要从JPA的特点说起:
-
JPA对于单表的或者简单的SQL查询非常友好,甚至可以说非常智能。他为你准备好了大量的拿来即用的持久层操作方法。甚至只要写findByName这样一个接口方法,他就能智能的帮你执行根据名称查找实体类对应的表数据,完全不用写SQL。
-
但是,JPA对于多表关联查询以及动态SQL、自定义SQL等非常不友好。对于JPA来说,一种实现实现方式是QueryDSL,实现的代码是下面这样的。我想问:你希望用这样的代码代替SQL么?
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
JPAQuery<Tuple> jpaQuery = queryFactory.select(QTCity.tCity,QTHotel.tHotel)
.from(QTCity.tCity)
.leftJoin(QTHotel.tHotel)
.on(QTHotel.tHotel.city.longValue().eq(QTCity.tCity.id.longValue()));
//添加查询条件
jpaQuery.where(predicate);
//拿到结果
return jpaQuery.fetch();
另一种方法是使用NativeQuery,我仍然想问:你希望在java代码里面用拼字符串的方式写SQL么?
@Entity
@NamedNativeQueries(value={
@NamedNativeQuery(
name = "studentInfoById",
query = " SELECT * FROM student_info "
" WHERE stu_id = ? ",
resultClass = Student.class
)
})
@Table(name="student_info")
以上的这部分实现还没有考虑到动态SQL的问题,如果考虑到动态SQL,写法会更复杂。所谓的动态SQL就是:根据传入参数条件的不同,构造不同的SQL,很多的比较这两个框架的文章都忽略了动态SQL的问题,这方面Mybatis支持的更好。Mybatis写的动态SQL说到底还是SQL,而不是java代码或者java代码拼字符串。程序员特别排斥几件事:
-
将复杂关联关系的SQL写在java代码里面,拼串书写不方便
-
SQL是最能表达实体关系查询的语言,程序员不希望使用异化SQL语言。
-
程序员不希望学习不通用的东西,显然SQL大家都会
-
JPA虽然将大部分操作封装起来了,也挺好用的,但是SQL调优怎么做?
可以使用Spring-Data-JPA-extra解决JPA的拼串书写和SQL异化的问题。但是根据笔者的使用情况,Spring-Data-JPA-extra是一个个人开发者项目,用于生产还很不成熟,对于多数据源处理、复杂类型处理等还有很多的问题。
二、劣币驱逐良币?

然而,另外有一派观点,你看人家国外的程序员怎么都用JPA?你不去学习新东西,还不让别人用?JPA使用很方便啊,唯一缺点就是复杂关联SQL支持差一点,但是只要你学一下也还可以支持啊,你们这是劣币驱逐良币。如果经过很好的实体关系模型的设计,JPA显然是最优解,程序员写的SQL还真不如JPA根据实体关系生成的SQL。笔者要说,这种观点也是有道理的。但是,笔者要说并不是国内程序员不愿意学习,而是另有原因。
- 首先,笔者长年从事远程工作,与国外程序员接触较多。他们习惯使用JPA的一个原因,真的是因为他们国家的应用规模太小了,比起国内的一个应用动则上百万的用户相比,他们在数据库设计与调优的需求上显然更从容。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。






既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)

总结
以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!
下面给大家分享下我的面试大全资料
- 第一份是我的后端JAVA面试大全

后端JAVA面试大全
- 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
- 第三份是Spring全家桶资料

MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
g-DXx4hLF6-1712031340327)]
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
- 第三份是Spring全家桶资料
[外链图片转存中…(img-5fkhLX1z-1712031340327)]
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理

323

被折叠的 条评论
为什么被折叠?



