为何不选 Hibernate,非要 MyBatis?

2024-01-26 11:15:02 +08:00
 dc2002007

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

当然我首先是不能接受在 xml 里写 sql 这种行为的!
orm 不够优秀吗?
18791 次点击
所在节点    Java
130 条回复
zzzmh
2024-01-26 14:24:26 +08:00
SQL 学好了啥都能写,既是啥需求都能一条 SQL 写明白,也是不管后端啥语言都需要写 SQL 以后可以换语言。hibernate 学得好只能写 hibernate 。mybatis plus 想写 SQL 的可以写 SQL ,懒得写 SQL 的可以点出来,实在需要折中可以 @select
ASpiral
2024-01-26 14:26:28 +08:00
之前用 JPA 遇到个坑,JpaRepository.save/saveAll 会先判断 id 是否存在,存在则 update ,不存在则 insert ,导致 insert 多条数据会发生多次查询,效率比直接 insert 低,网上查了下 JPA 好像没有直接 insert 多条数据的方法?
KOMA1NIUJUNSHENG
2024-01-26 14:32:34 +08:00
用了 mybatis plus 之后基本没写过 sql 了。
Geraltt
2024-01-26 14:37:26 +08:00
这不就是茴香豆的写法吗 和面向对象思想有什么关系
heeeeeem
2024-01-26 14:38:46 +08:00
@leohuangsulei:JPA 方法名就是查询的真的无法接受
查询方法名这块,我觉得恰恰相反,JPA 规范的查询名比 Mybatis 自己命名查询名好用多了,JPA 一看方法名就知道这个方法的功能,Mybatis 可能出现货不对板的情况。
heider
2024-01-26 14:41:36 +08:00
@zhangxh1023 MybatisX
qq135449773
2024-01-26 14:45:55 +08:00
因为 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
2024-01-26 14:52:45 +08:00
请恕我眼拙,spring 这一套就没有什么面向对象的味道在里面,完全就是面向过程的思路。

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

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

如何才能像你一样优秀
twofox
2024-01-26 15:30:23 +08:00
@Morii 还是 OP 优秀,本以为他是想探讨技术优劣。结果上来就说用 mybatis 的不会面向对象,把我给整笑了
dode
2024-01-26 15:34:38 +08:00
觉得在 MyBatis 注解里写多行字符串 sql 挺好的
zacard
2024-01-26 15:42:45 +08:00
其实没有非要用 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