我就是不看好jpa

42次阅读

共计 1807 个字符,预计需要花费 5 分钟才能阅读完成。

知乎看到问题《SpringBoot 开发使用 Mybatis 还是 Spring Data JPA??》,顺手一答,讨论激烈。我实在搞不懂 spring data jpa 为啥选了 hibernate 作为它的实现,是“Gavin King”的裙带关系么?
DAO 层搞来搞去,从 jdbc 到 hibernate,从 toplink 到 jdo,到现在 MyBatis 胜出,是有原因的。

目前,一些狗屁培训公司,还有一些网络课程,包括一些洋课程,为了做项目简单,很多会使用 jpa。但到了公司发现根本就不是这样,这就是理论和现实的区别。

顶着被骂的风险,我整理发出来。这可不是争论 php 好还是 java 好性质了。

忠告:精力有限,一定要先学 MyBatis 啊。jpa 那一套,表面简单而已。

以下是原始回答

如果你经历过多个公司的产品迭代,尤其是复杂项目,你就会发现 Spring Data JPA 这种东西是多么的不讨好。说实话,Mybatis的功能有时候都嫌多,有些纯粹是画蛇添足。

jpa虽然是规范,但和 hibernate 这种 ORM 是长得比较像的(不说一些特殊场景的用法)。

Spring Data JPA 是个玩具,只适合一些简单的映射关系。也不得不提一下被人吹捧的querydsl,感觉有些自作聪明的讨巧。实在不想为了一个简单的 DAO 层,要学一些费力不讨好的东西。

List<Person> persons = queryFactory.selectFrom(person)
  .where(person.children.size().eq(JPAExpressions.select(parent.children.size().max())
  .from(parent)))
  .fetch();

看看上面的查询语句,完全不如普通 SQL 表达的清晰。要是紧急排查个问题,妈蛋 …

jpa 虽然有很多好处,比如和底层的 SQL 无关。但我觉得 Spring Data JPA 有以下坏处:

1、屏蔽了 SQL 的优雅,发明了一种自己的查询方式。这种查询方式并不能够覆盖所有的 SQL 场景。

2、增加了代码的复杂度,需要花更多的时间来理解 DAO

3、DAO 操作变的特别的分散,分散到多个 java 文件中,或者注解中(虽然也支持 XML)。如果进行一些扫描,或者优化,重构成本大

4、不支持复杂的 SQL,DBA 流程不好切入

Mybatis 虽然也有一些问题,但你更像是在写确切的 SQL。它比 Spring Data JPA 更加轻量级。

你只要在其他地方调试好了 SQL,只需要写到配置文件里,起个名字就可以用了,少了很多烧脑的转换过程。

Mybatis 完全能够应对工业级的复杂 SQL,甚至存储过程(不推荐)。个人认为 Mybatis 依然是搞复杂了,它其中还加了一些类似 if else 的编程语言特性。

你的公司如果有 DBA,是不允许你乱用 SQL 的。用 Mybatis 更能切入到公司的流程上。

所以我认为:玩具项目或者快速开发,使用 Spring Boot JPA。反之,Mybatis 是首选。

一些有用的评论

你说的 if else 是指的 SQL 拼接吧,这可是 MyBatis 的重要功能之一,学起来一点儿也不复杂好吗?


最近也在研究持久层,可以充分利用这个 jpa 这个玩具,两者结合是不错的选择,jpa 基本的单表操作,mybatis 做复杂查询,开发效率高,降低 sql 维护成本,也为优化留下空间,当然这需要对 spring-data-jpa 做一些扩展


查询直接 sql,其他的还是 orm 方便


mybatis 主要是原生 sql,对于其他没学习过 jpa 的开发人员而言降低了学习维护门槛,而且说真的 jpa 写了个锅你去追其实还是挺头疼的 …

mybatis-plus 整合之后基本 curd 不用纠结了,很多对对象操作然后直接 save 就好。复杂场景、联表就直接用原生 sql 就好,至于性能问题可以用 sqlAdvice 优化下。


jdbc template+ 代码生成器,更简单更高效


jpa 这玩意,写一个简单的数据库操作,就比如说单表的操作,很好用。如果是多表,那就算了吧


spring boot 推荐 jpa,知道为什么吗


native=true 想用原生查询也没人拦着你啊


你好像不是很懂 hibernate 和 jpa…


不知道你是否清楚 jpa,hibernate,spring data jpa,还有 querydsl 之间的关系。


总有一天你会知道数据库优先和程序优先的区别


jpa 还有一个好处,那就是帅锅啊

END

来,越年轻越狂妄的家伙们,来喷我啊。

正文完
 0