###一直不能理解 Hibernate 这么优秀的 orm 思想框架,为什么这么多项目还选择了在 xml 里写 sql 的 MyBatis ,求解惑?
1 aLazarus 2024-01-26 11:18:16 +08:00 那你怎么看待在 java 中写 hql 呢 |
2 pigeon2049 2024-01-26 11:18:50 +08:00 方便基于 velocity 生成代码 如果你用过 ruoyi 之类的框架,实际上大多数情况你只需要数据库里建好表,页面上导入 自动生成实体 bean/mapper/service/serviceimpl/mapper.xml/controller/前端 vue 代码 |
![]() | 3 murmur 2024-01-26 11:19:09 +08:00 因为简单的 curd ,hibernate 都不需要了,拖拉拽自动生成,等写复杂报表,权限,表联合的时候就得手写 sql 了 |
4 JerryYuan 2024-01-26 11:19:21 +08:00 via Android ![]() 大概是 hibernate 不能方便的跨几个表联查/用 sql 的骚操作? PS:可能只是我不知道怎么搞 |
![]() | 5 Goooooos 2024-01-26 11:20:24 +08:00 为什么别人喜欢还要告诉你原因? |
8 zzzkkk 2024-01-26 11:24:35 +08:00 web 开发的本质就是 sql 增删改查 hibernate 之流等于脱裤子放屁 |
![]() | 9 potatowish 2024-01-26 11:29:16 +08:00 via iPhone ![]() 现在用 MyBatis 的都是用 MyBatisPlus 吧,既能不写一行 SQL (单表),又支持手写 SQL (联表、动态 SQL ),直接用原生 MyBatis 的都是上古项目了 |
![]() | 10 gejun123456 2024-01-26 11:29:32 +08:00 hibernate 学习曲线高,没点经验容易出问题,mybatis 简单直接,稍微学习就会了出错概率小点,缺点是关联关系的时候需要手动操作的地方多点,可以试试 idea MybatisCodeHelperPro 插件,xml 写 sql 都有代码提示,写起来方便很多。 |
11 yooomu 2024-01-26 11:33:24 +08:00 ![]() 因为在多人合作的大型项目中,每个人水平不一。Hibernate 过重,黑箱过多,能完全掌握的人并不多,一旦出现问题难以定位。而原生 sql 简单,是个后端就会写,方便优化。用面向对象的方式操作数据库确实很爽,但是大型项目需要保证下限,再爽也没用,况且 mybatis plus 操作单表也不用写 sql |
13 yooomu 2024-01-26 11:35:45 +08:00 @yooomu 配合现代 IDE 加持,xml 中写 sql 也没什么不好,智能提示,语法检查一应俱全。在一堆项目都是 java8 ,不支持多行字符串的情况下,你难道想在 java 代码中写 sql 吗 |
![]() | 15 issakchill 2024-01-26 11:37:05 +08:00 完全赞成 11 楼说法 jpa 那套不钻研一下 写出来的太多坑了 |
![]() | 16 sunwei0325 2024-01-26 11:43:13 +08:00 除非你新开项目, 能说服其他成员, 否则老项目你也不敢动这个啊 |
17 Bingchunmoli 2024-01-26 11:51:20 +08:00 via Android 不会 ssh 只会 ssm ,所以用 mybatis |
18 goodblue 2024-01-26 11:59:12 +08:00 因为在某个阶段,大家都在追求效率,满足扩张业务,堆人也更好堆 |
![]() | 19 MIUIOS 2024-01-26 12:00:21 +08:00 现在除了老项目,新项目应该会首选 mybaitsplus 吧? 建议楼主体验一下 plus 版本就知道多爽了 纯 mybaits 确实痛苦,但我感觉这种痛苦只是存在简单的项目 换个思路想,为什么非要在他们两者去选? 简单的项目 Hibernate , 复杂的项目我绝对 mybatis ,不过现在我都用 plus , 等于两者一起用了 |
![]() | 20 version 2024-01-26 12:03:44 +08:00 单表 JPA 那套确实没问题.也就适合国外单一需求 国内大融合需求..啥功能都要..基本拍版就改..不写 sql.很难存活. |
![]() | 21 weijancc 2024-01-26 12:10:30 +08:00 建议你实际项目用过 hibernate 再来说话, 如果用过, 一定会不可避免的出现需要在代码内写 HQL 或者 SQL 的情况, 和 xml 对比起来, 在代码内写这些 QL 实在是恶心 |
![]() | 22 09an6YfX8rNvIG92 2024-01-26 12:16:51 +08:00 via Android ORM 学习成本比较高, 想用好 ORM 需要对面向对象编程有一定的理解,而使用 mybatis 只要会 sql 就好,在这个 35 岁就面临就业问题的社会,前者自然要被淘汰的 再加上初期大厂的带头作用,国内计算机教育的脱节,mybatis 流行也就不奇怪了 |
![]() | 23 09an6YfX8rNvIG92 2024-01-26 12:20:20 +08:00 via Android @weijancc 我反倒觉得在代码里写 jpql 很舒服,因为 idea 的检测比在 xml 的 sql 完善得多 |
![]() | 24 BiChengfei 2024-01-26 12:21:50 +08:00 spring data jpa + Mybatis ,复杂查询用 mybatis 写,其他用 jpa ,爽的飞起 mybatis plus 完全没有 jpa 好用,稍微使用以下就能感觉到 听说现在国外 jpa 的使用占比很高,国内过去十年,行业人数快速膨胀,培训班很少有教 ORM ,旧项目很多使用的 Mybatis ,为了保持公司技术栈统一,众多原因,Mybatis 占比一直居高不下 但随着行业沉淀,从业人员水平提升,JPA 占比会慢慢提升,Mybatis 终将推出历史舞台 |
![]() | 25 Nosub 2024-01-26 12:22:09 +08:00 via iPhone ![]() 不用思考,hibernate 成本太高,一般人掌握不了,你要一个面向过程的程序员去写面向对象的代码,就算用 Java 也可以写出 c 的既视感。 |
26 maigebaoer 2024-01-26 12:26:08 +08:00 via Android @Nosub 我这是用 php 和 go 写 c 风格代码 |
27 githmb 2024-01-26 12:28:26 +08:00 ![]() 我不是不能接受在 xml 里写 sql 这种行为 我根本不想碰 xml 这种脑瘫东西! |
![]() | 29 xiaowowo 2024-01-26 12:34:04 +08:00 因为 hibernate 是一个类似鸡肋的东西,设计比较复杂。功能又不是那么强大。 |
30 bthulu 2024-01-26 12:35:06 +08:00 mybatis 培训班半天成型, hibernate 至少三天, 是你你选哪个? |
![]() | 31 dabai0806 2024-01-26 12:48:21 +08:00 ![]() 简单 sql 没必要, 复杂 sql 弄不了 |
32 nothingistrue 2024-01-26 12:58:25 +08:00 ![]() Hibernate 与其说是 Object Relation Mapping ,不如是是 Object Model using Relation Model as Technical Implementation 。Hibernate 必须搭配脱离数据库的对象模型才能用好,如果你还是面向数据库关系数据模型来用,那用起来是非常难用得。 让 Hibernate 被 MyBatis 替代的,正好是让 Hibernate 被大力推广的 SSH 分层架构。这个鸟架构首先是用错了被 EJB 的重量级给搞应激了,完全取消有会话 Bean 从而导致了数据跟程序的分离,进而导致 Java Web 开发从面向对象开发,变成了虽然用着面向对象语言,但搞得还是面向函数,甚至直接面向 SQL 的开发。SSH 实际上用错了 Hibernate ,Hibernate 压根就不适合这种面向函数的开发模式,自然就被替换掉了,当时就算没有 ibatis 也会有其他的替代。至于 MyBatis ,只不过是 ibatis 的封装衍生而已。 @potatowish #8 MyBatisPlus 并不是 MyBatis 的衍生,它是模仿的 Spring Data Jpa ,只不过前者用 MyBatis 当技术实现,后者用 Jpa ( Hibernate ) 当技术实现。 |
![]() | 33 Kaiv2 2024-01-26 12:58:59 +08:00 能列一下 Hibernate 对比 MyBatis 优秀的地方吗? 我使用 MyBatis 感觉是简单轻量高性能。 Hibernate 笨重性能相对较低,复杂查询还是得用 SQL |
34 yty2012g 2024-01-26 13:17:18 +08:00 Spring Data JPA ( Hibernate )、MyBatis ( iBatis )都写过,最近在玩 JOOQ ,觉得写起来好爽啊 |
35 wswlaz 2024-01-26 13:20:52 +08:00 个人项目我选 springdata jpa , 公司项目用 mybatis |
![]() | 36 ramoudev 2024-01-26 13:26:35 +08:00 mybatis 还是挺重的,mybatisplus 仅仅是一个反射升级版,jpa 是思想 |
![]() | 38 murmur 2024-01-26 13:35:18 +08:00 而且 xml 可以换行,你 json 支持换行么,yml 支持换行么,大段数据不让换行会死人的 |
39 THESDZ 2024-01-26 13:35:30 +08:00 短平快,更适合国内弯道超车的思想理念. |
40 limaofeng 2024-01-26 13:39:49 +08:00 用 hibernate 必须要 hql 吗? 我就觉得 jpa 比 mybatis 方便。普通查询之类更本用不上 sql , 统计要写 sql 的时候也没 hql 啥事。如果还把 hibernate = 代码里面写 hql ,就是不了解 hibernate |
41 zhangxh1023 2024-01-26 13:40:51 +08:00 我也觉得,写 xml 好难受, 好奇大家都是怎么写 xml 开头的那些 "<?xml version="1.0" encoding="UTF-8" ?>" 的,编辑器会自动生成吗 |
![]() | 42 wanguorui123 2024-01-26 13:44:56 +08:00 因为 MyBatis + Plus 可以放飞自我随心所欲,Hibernate 需要较强的工程管理思想才能玩转。 |
![]() | 43 twofox 2024-01-26 13:53:18 +08:00 用 jpa 的时候,发现我搞不定复杂的报表 sql ,写 hql 或者 sql ,jpa 映射的也挺恶心,相比之下 mybatis 的 xml 我写起来更加顺手 所以主要项目还是 mybatis-plus 小的项目会用 jpa ,因为可以自动建表,配合 h2 做个小工具舒服 |
![]() | 44 leohuangsulei 2024-01-26 13:55:59 +08:00 ![]() @limaofeng JPA 方法名就是查询的真的无法接受 |
![]() | 45 mohulai 2024-01-26 14:09:04 +08:00 我穿越了?我怎么感觉几个月前看过标题相同的帖子,连附言都一样,但没有“35 岁可能是这个代谢过程的重要节点”这段话 |
![]() | 46 Umenezumi 2024-01-26 14:09:04 +08:00 ![]() >>> 国内 java 程序员普遍对面对对象思想理解不深刻,导致 orm 思想很难灵活运用 又被 OP 打标签了,国内程序员好惨 |
![]() | 47 la2la 2024-01-26 14:09:27 +08:00 茴香豆的茴字有几种写法? |
![]() | 48 murmur 2024-01-26 14:12:18 +08:00 @zhangxh1023 为什么要写,不都是复制别人写的改改,spring 一开始就有 spring side 这样的第三方脚手架,不需要重头写 xml 配置 |
![]() | 49 fuhanfeng 2024-01-26 14:12:34 +08:00 国内的业务需求又紧又奇葩,写 Java 的人水平参差不齐。 用 Mybatis Plus 简单的可以用 lamda 直接查询/更新,复杂的又支持 xml 写 SQL 。 |
50 x66 2024-01-26 14:12:51 +08:00 >>> 国内 java 程序员普遍对面对对象思想理解不深刻,导致 orm 思想很难灵活运用 又被打标签了,我反而觉得是国内的 PM 水平太低,总是设计一些奇葩需求,复杂到使用 hibernate 不太方便 |
51 tairan2006 2024-01-26 14:13:05 +08:00 装起来了,先把楼主 block 了再说 |
![]() | 52 WuwuGin 2024-01-26 14:13:14 +08:00 积重难返+简中能找到的教程绝大部分是 MyBatis ,搜到哪个用哪个 |
53 Jinnrry 2024-01-26 14:13:15 +08:00 via Android ![]() 8 9 年前想学这玩意的,当时我记得官网写着一句话,大意是“让不懂数据库的人也会操作数据库”。我当时就纳闷了,谁他妈编程不学数据库啊?然后稍微学习了一下,确实不懂数据库也能操作,但是你得学习他的那一套东西,他自己又造了很多概念,方法。但是学他那些东西为什么不直接学数据库呢? |
![]() | 54 burymme11 2024-01-26 14:13:42 +08:00 以前我选 Hibernate 。现在我选 Mybatis-plus 。 |
![]() | 55 dc2002007 OP @tairan2006 别别,我的目标很简单,一个金币而已 |
56 Bingchunmoli 2024-01-26 14:19:22 +08:00 via Android @zhangxh1023 全是生成的。。 |
![]() | 57 txzh007 2024-01-26 14:20:52 +08:00 用不用是我说的算吗? |
![]() | 58 cubecube 2024-01-26 14:23:13 +08:00 hibernate 太重了。隐藏了太多的东西,宁愿手写 sql 都不用这玩意儿 |
59 PVXLL 2024-01-26 14:23:24 +08:00 因为培训班只教了 MyBatis ,自己又不愿意学习 Hibernate 或者水平差根本学不会,中文文档都是老旧文档,英文文档又看不懂 |
60 NoNewWorld 2024-01-26 14:24:25 +08:00 现在都用 mybatis plus 的 lambda query 了,基本很少写 xml 了, 一般是那种复杂的多表查询才需要写 sql 。两种方式都方便,不挺好的? |
![]() | 61 zzzmh 2024-01-26 14:24:26 +08:00 SQL 学好了啥都能写,既是啥需求都能一条 SQL 写明白,也是不管后端啥语言都需要写 SQL 以后可以换语言。hibernate 学得好只能写 hibernate 。mybatis plus 想写 SQL 的可以写 SQL ,懒得写 SQL 的可以点出来,实在需要折中可以 @select 。 |
![]() | 62 ASpiral 2024-01-26 14:26:28 +08:00 之前用 JPA 遇到个坑,JpaRepository.save/saveAll 会先判断 id 是否存在,存在则 update ,不存在则 insert ,导致 insert 多条数据会发生多次查询,效率比直接 insert 低,网上查了下 JPA 好像没有直接 insert 多条数据的方法? |
![]() | 63 KOMA1NIUJUNSHENG 2024-01-26 14:32:34 +08:00 用了 mybatis plus 之后基本没写过 sql 了。 |
![]() | 64 Geraltt 2024-01-26 14:37:26 +08:00 |
![]() | 65 heeeeeem 2024-01-26 14:38:46 +08:00 @leohuangsulei:JPA 方法名就是查询的真的无法接受 查询方法名这块,我觉得恰恰相反,JPA 规范的查询名比 Mybatis 自己命名查询名好用多了,JPA 一看方法名就知道这个方法的功能,Mybatis 可能出现货不对板的情况。 |
![]() | 66 heider 2024-01-26 14:41:36 +08:00 @zhangxh1023 MybatisX |
67 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 。 |
![]() | 68 xuanbg 2024-01-26 14:52:45 +08:00 请恕我眼拙,spring 这一套就没有什么面向对象的味道在里面,完全就是面向过程的思路。 而且,我没有觉得面向对象要比面向过程高明多少。面向对象的特点就是将逻辑和数据统一起来封装成一个对象,而不是面向过程,数据需要用表的方式单独进行管理。 |
69 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 查询。 |
70 koloonps 2024-01-26 15:09:01 +08:00 ![]() jdk15 才支持多行字符串,没有多行字符串支持在 Java 中写 sql 不如在 xml 中写 sql |
71 ZGame 2024-01-26 15:11:20 +08:00 C# Linq Ef 表示, 都是垃圾。 H 底层的 queryDsl 都只是抄了 Linq 的一点皮毛... |
72 iamshang 2024-01-26 15:13:03 +08:00 via Android 喜欢 hibernate 来北美吧,没有公司用 MyBatis |
73 koloonps 2024-01-26 15:13:18 +08:00 @zhangxh1023 用插件生成,有个插件叫 MyBatisCodeHelperPro 可以尝试下 |
![]() | 74 twofox 2024-01-26 15:18:24 +08:00 ![]() 看到 append 有点绷不住了 综合评论来看,我总结一下 OP:OP 应该没写过复杂逻辑的业务以及没有快速交付项目的经验,导致简单 curd 用 jpa 比 mybaitis 舒服,故为彰显标新立异,刻意贬低其他技术栈的优点,这个也是项目经验过少等多方面造成的问题,jpa 是主流,但 mybaits 在国内更加主流这是毋庸置疑的。OP 需要一个被社会毒打的过程,复杂的业务可能是这个毒打过程中的重要节点. |
![]() | 75 cheng6563 2024-01-26 15:18:56 +08:00 用 hibernate 也不见得面向对象了啊,你会把支付的业务代码写到 order pojo 里吗? |
76 zackzergzeng 2024-01-26 15:24:15 +08:00 个人觉得 orm 就是心智模型更易理解,而且不用太关注 sql 本身,但是扩展性和性能不太好,国内环境很难忽略性能(很多地方动不动就百万数据之类的),mybatis 再更广范围内更吃得开更适用 还有一点,不是框架优秀就一定流行的,更是配业务广泛才是王道 |
77 28Sv0ngQfIE7Yloe 2024-01-26 15:24:24 +08:00 |
79 dode 2024-01-26 15:34:38 +08:00 觉得在 MyBatis 注解里写多行字符串 sql 挺好的 |
80 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 模型 |
![]() | 81 OTZ 2024-01-26 15:43:18 +08:00 Hibernate 相较于 MyBatis 上手成本高点。国内互联网行业发展快,需要新手速成,立即投入一线搬砖。因此当然是越容易上手的技术越受欢迎。 |
82 jkc626 2024-01-26 15:46:38 +08:00 总结下部分人的话:我用某框架,别人不用,是因为别人水平差学不会。 对此想借用 linus 说的一句话:talk is cheap. show me the code. 要炫技请上 GitHub |
![]() | 83 Sprdance 2024-01-26 15:52:08 +08:00 个人理解是 MyBatis 比较符合 DDD 直觉:Java 代码写原始数据接口定义,XML 写实现。并且 MyBatis 对 Java 对象和数据库对象的相互转换比较友好 (也有可能是我 MyBatis 写多了……) |
![]() | 84 wdlth 2024-01-26 15:55:35 +08:00 如果用 pgSQL 、Hive 或者要写窗口函数那些,一般都是直接复制查询工具的 SQL ,不需要再次去写查询代码。 |
![]() | 85 ShadowPower 2024-01-26 15:55:42 +08:00 Hibernate 不如 MyBatis 灵活、高性能、轻量。 公司的内部框架已经把 MyBatis 的用法封装得跟 Hibernate 一样了。 用起来感觉几乎完全一样(只是长得不一样),绝大多数业务代码一行 SQL 都不需要写,还简化了一些通用业务逻辑。 例如完全无感的多语言设计,只需要给实体类和实体类属性加注解就可以了。会自动根据当前用户设置来更改 SQL 语句。 其他的例子,例如给实体类加个流水号编码注解实现创建数据时自动生成符合规则的流水号。有前后缀、用户标识、日期时间、自增序列等等信息。 还有很多很多。 基于 MyBatis 做这种定制比较简单,容易理解。而 Hibernate 就很复杂了。 |
![]() | 86 GBdG6clg2Jy17ua5 2024-01-26 16:02:46 +08:00 综合 op 的综合总结评论来看,op 就是没看评论自己总结了一下。 |
![]() | 87 wetalk 2024-01-26 16:05:42 +08:00 @zhangxh1023 根据表模型逆向自动生成,没几个人从头开始写 xml |
![]() | 89 leohuangsulei 2024-01-26 16:20:29 +08:00 @heeeeeem 简单查询都无所谓,你复杂一点方法名太长了,有些不规范的还带下划线 看的难受 |
![]() | 90 romisanic 2024-01-26 16:24:11 +08:00 综合 OP 的 append 来看,OP 的 append 把自己特点总结了一下,并想当然的扣到了整个国内研发的头上。 |
![]() | 92 waterlaw 2024-01-26 16:55:29 +08:00 via Android mybatis 灵活性更高一点,hibernate 封装性更好 |
![]() | 93 wupher 2024-01-26 16:58:26 +08:00 都有用过,但新项目一般使用 JPA / Hibernate ,相对日常出活更快。 |
94 TGhoull 2024-01-26 17:10:35 +08:00 我觉得好多人都没说到点上,不是不选 Hibernate ,而是在国内你根本没得选,因为大部分项目用的基本都是 Mybatis, 后续如果有新项目肯定还是选择自己熟悉的 ORM 框架,你如果观察国外社区讨论关于 ORM 选择,肯定是 Hibernate 占有率大大高于 Mybatis ,因为国外的项目大部份都是使用 JPA 那一套,有时候优缺点并不是首先考虑的点,最契合自己团队的才是好的 |
![]() | 95 changdy 2024-01-26 17:12:41 +08:00 ![]() 我决定往 op 身上开个炮 .. 你用 JPA / Hibernate 了解过数据库的那些技术 和 trick ? 会用临时变量, 虚拟列 ,强制索引 , STRAIGHT_JOIN 吗? cte 会玩吗? 当你决定思路定格在 orm 上时 ... 你就是真的一个 crud boy 了 |
![]() | 96 jaycelhz 2024-01-26 17:15:20 +08:00 我感觉从开始学 java 就开始隔几天看到这种问题,过几个月我也再发一遍, 水经验的好问题 |
![]() | 97 carytseng 2024-01-26 17:27:55 +08:00 做多几个复杂报表功能,可能就不会有啥疑问了 |
98 blackmirror 2024-01-26 17:44:59 +08:00 其实问题在于甲方需求经常乱改。。。。。 |
![]() | 99 09an6YfX8rNvIG92 2024-01-26 18:02:23 +08:00 @ASpiral 有的,自己写 jpql |
![]() | 100 ZeroDu 2024-01-26 18:11:13 +08:00 用 Mybatis Plus 现在基本很少写 xml ,联查甚至还有 mybatis plus join ;真的很少写 xml 了 |