为何不选 Hibernate,非要 MyBatis?

329 天前
 dc2002007

###一直不能理解 Hibernate 这么优秀的 orm 思想框架,为什么这么多项目还选择了在 xml 里写 sql 的 MyBatis ,求解惑?

当然我首先是不能接受在 xml 里写 sql 这种行为的!
orm 不够优秀吗?
15094 次点击
所在节点    Java
130 条回复
zzzmh
329 天前
SQL 学好了啥都能写,既是啥需求都能一条 SQL 写明白,也是不管后端啥语言都需要写 SQL 以后可以换语言。hibernate 学得好只能写 hibernate 。mybatis plus 想写 SQL 的可以写 SQL ,懒得写 SQL 的可以点出来,实在需要折中可以 @select
ASpiral
329 天前
之前用 JPA 遇到个坑,JpaRepository.save/saveAll 会先判断 id 是否存在,存在则 update ,不存在则 insert ,导致 insert 多条数据会发生多次查询,效率比直接 insert 低,网上查了下 JPA 好像没有直接 insert 多条数据的方法?
KOMA1NIUJUNSHENG
329 天前
用了 mybatis plus 之后基本没写过 sql 了。
Geraltt
329 天前
这不就是茴香豆的写法吗 和面向对象思想有什么关系
heeeeeem
329 天前
@leohuangsulei:JPA 方法名就是查询的真的无法接受
查询方法名这块,我觉得恰恰相反,JPA 规范的查询名比 Mybatis 自己命名查询名好用多了,JPA 一看方法名就知道这个方法的功能,Mybatis 可能出现货不对板的情况。
heider
329 天前
@zhangxh1023 MybatisX
qq135449773
329 天前
因为 ORM 是把双刃剑,虽然给你带来了灵活,hibernate 那种 ORM 对性能损耗太大了,基本市面上所有语言生态对应的 ORM 都会有这种问题。

并且 ORM 也不是在 99%的时间都是那么的灵活,涉及到一些复杂的查询,该写 sql 可能还要写 sql 。

当然这两个框架我个人觉得没有谁对谁错,无非只是一些迭代速度和性能牺牲上的取舍而已,毕竟都用 Java 了,这种取舍应该早就已经在考虑之内了。

并且我还想提示 lz 一点,MyBatis3 是有 mapper annotation 的,也就是说可以直接在 Java 里面写 sql 而不用非得创建个 xml 。

https://mybatis.org/mybatis-3/java-api.html#mapper-annotations

当然在现在国内这种“你升任你升,我用 Java8”的大环境来讲,提这个也没用,因为 text block 我没记错的话应该是 jdk15 才有的东西,jdk8 下做这个还不如去写 xml 。
xuanbg
329 天前
请恕我眼拙,spring 这一套就没有什么面向对象的味道在里面,完全就是面向过程的思路。

而且,我没有觉得面向对象要比面向过程高明多少。面向对象的特点就是将逻辑和数据统一起来封装成一个对象,而不是面向过程,数据需要用表的方式单独进行管理。
limaofeng
329 天前
@leohuangsulei "JPA 方法名就是查询的真的无法接受" 我用的不是这种方式。
```
List<Employee> employees = this.employeeDao.findAll(PropertyFilter.newFilter().equal("links.type", dingtalk).equal("links.linkId", id));
```
自己封装了一个查询对象,最终转换为 Specification 查询。
koloonps
329 天前
jdk15 才支持多行字符串,没有多行字符串支持在 Java 中写 sql 不如在 xml 中写 sql
ZGame
329 天前
C# Linq Ef 表示, 都是垃圾。 H 底层的 queryDsl 都只是抄了 Linq 的一点皮毛...
iamshang
329 天前
喜欢 hibernate 来北美吧,没有公司用 MyBatis😂
koloonps
329 天前
@zhangxh1023 用插件生成,有个插件叫 MyBatisCodeHelperPro 可以尝试下
twofox
329 天前
看到 append 有点绷不住了

综合评论来看,我总结一下 OP:OP 应该没写过复杂逻辑的业务以及没有快速交付项目的经验,导致简单 curd 用 jpa 比 mybaitis 舒服,故为彰显标新立异,刻意贬低其他技术栈的优点,这个也是项目经验过少等多方面造成的问题,jpa 是主流,但 mybaits 在国内更加主流这是毋庸置疑的。OP 需要一个被社会毒打的过程,复杂的业务可能是这个毒打过程中的重要节点.
cheng6563
329 天前
用 hibernate 也不见得面向对象了啊,你会把支付的业务代码写到 order pojo 里吗?
zackzergzeng
329 天前
个人觉得 orm 就是心智模型更易理解,而且不用太关注 sql 本身,但是扩展性和性能不太好,国内环境很难忽略性能(很多地方动不动就百万数据之类的),mybatis 再更广范围内更吃得开更适用
还有一点,不是框架优秀就一定流行的,更是配业务广泛才是王道
28Sv0ngQfIE7Yloe
329 天前
@twofox #72

如何才能像你一样优秀
twofox
329 天前
@Morii 还是 OP 优秀,本以为他是想探讨技术优劣。结果上来就说用 mybatis 的不会面向对象,把我给整笑了
dode
329 天前
觉得在 MyBatis 注解里写多行字符串 sql 挺好的
zacard
329 天前
其实没有非要用 mybatis ,还是要看业务场景。Hibernate 与 MyBatis 的选择是经典的模型优先 vs 数据优先的问题(或者称之为 jpa first vs db first )、范式 vs 反范式的较量

个人经验看,toC 的情况 mybatis 会好一点,对延迟敏感,我们需要谨慎设计调优数据表的 schema ;而 toB 、一些内部项目、流量不大的项目完全可以用 jpa 快速开发

至于 jpa 太重,黑盒,性能差之类的问题是因为 jpa 提供了足够的便利让我们专注在模型设计而非数据 crud 上,本是一把双刃剑。如果仔细看过 jpa/Hibernate 官网文档,你可以设计出性能不差、完全不用写 sql 的 jpa 模型

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1011737

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX