由于java视频里以前好多都是SSH。但是在实际工作中没见过用hibernate的,基本都用mybatis。
我有一些疑问:
hibernate碰到什么样的业务会变成致命的弱点,都说hibernate效率低,能否举个例子(例如同一个查询用mybatis查询耗时1秒,用hibernate查询耗时10秒)
可能是有部分人遇到了hibernate的瓶颈,但是这部分人的业务量我觉得,不是大部分使用hibernate的人都能遇到的。一般的小项目,不超过100个用户,这样的项目综合考虑的话更适合用mybatis还是hibernate?主要从开发效率上来说的话。为什么?
知乎上也有类似的问题。
看到高票的回答大致就是说,
hibernate
比mybatis
掌握难度要高一些,对sql的控制弱一些。mb sql写到xml里面不也需要解析么,效率也高不到哪里去吧
对比这两个之间的关系,从开发效率、可维护性、性能三个方面给出考虑。而就其重要性而言,在项目工程开发过程中,开发效率>可维护性>性能。可能对于某些业务来说,性能更关键,但放眼全局,个人觉得开发效率>可维护性>性能。
首先来说,开发效率。个人感觉如果你是做一些简单的CMS类似的只有简单的增删改查的项目,那么使用Hibernate更有优势,不需要掌握太多的Hibernate知识,只需要会一些基本的查询和一些配置(Hibernate真正要学会,个人感觉知识量比mybatis大很多)。hiberbate是用java对象拼sql,mybatis是直接写原生sql。hibernate提供了很好的映射机制,mybatis还需要自己写resultmap paramMap这些东西。Hibernate和MyBatis都有相应的代码生成工具。可以生成简单基本的DAO层方法。针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。综上所述,那么从开发效率上来讲,Hibernate> mybatis。
可维护性:hiberbate是用java对象拼sql,mybatis是直接写原生sql。直接写SQL更容易维护,而前者需要通过java对象来看SQL,你得把sql,用System.out.println(sql);把SQL打印出来,才可以看到。Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。Hibernate HQL语句的调优需要将SQL打印出来,而Hibernate的SQL被很多人嫌弃因为太丑了。MyBatis的SQL是自己手动写的所以调整方便。但Hibernate具有自己的日志统计。Mybatis本身不带日志统计,使用Log4j进行日志记录。
性能:两者都提供了缓存,session机制。小项目两者差不多吧.大型项目mybatis>hibernate。
看大家讨论感觉mybaits更好一样,但当初一直以为hibernate更适合大型开发就直接走hibernate了。那时项目比较急,用得像mybatis一样,后来玩久了,发现很多有趣的东西,hibernate提供的经验简化了不少工作量和兼容性,但这些绝对需要有经验后才明白,加上后来有用上了hibernate search,全文检索,也就没法换了,反正写原生sql也可以hql也可以,xml配置工具也有,辅助注解也灵活,甚至还能产生原生sql不一样的one2many,many2many数据结构,总之就是太全面的一个大家伙了,还没遇到后悔的时候,就继续学吧。一般是用hibernate tools自动创建所有表的Java和xml的mapping做一般查删改,然后复制Java代码改名,用注解手工建关联,删除不需要的字段。
1. 问题1:什么样的情况下,Hibernate 会慢MyBatis10倍?
当Hibernate用错了的情况下,会出现:P
比如, Hibernate的对象A里的内嵌对象B加载被你从默认懒加载改为预加载(假设你没有搞懂影响,就改动了配置), 你要查询对象A的列表,就会出现N+1查询, 但你的大部分业务逻辑又不需要读取内嵌对象B,性能就会很差.
而一般情况下MyBatis, 这种查询是需要手写的. 出现这种情况的概率较小.
JPA(Hibernate)的内容涵盖真的很广,有很多优化技巧.想玩熟要花的成本不低.(我手头上那本Hibernate In Action厚度很的让人望而生畏, 花了好久才看完), 不知道有多少程序员是爱看书的且有这个耐心.
但是,MyBatis上手要容易多了. 虽然MyBatis在用错的情况下.性能会同样比Hibernate差好多倍.但MyBatis没那么复杂啊. 那出错的几率就小很多了.
2. 问题2:小项目用MyBatis还是Hibernate?
如果你对Hibernate很有研究兴趣,且想把他用熟.我建议拿你就试试呗. 毕竟大多数的项目是需要快速出成果的.
Hibernate在这方面比MyBatis简单多了(当然MyBatis有自动生成代码的方法,但相比还是麻烦不少).
如果后续项目发展的不错, 需要多人协作开发, 请务必让新手远离持久层代码逻辑.
简单来说,Hibernate 是面向对象的,MyBatis 是面向 SQL 的。选哪个得看你的人员配置对哪个熟悉,业务会不会有很多复杂查询,对性能要求高不高。另外,很多时候都是对 Hibernate 不熟悉,所以会觉得 Hibernate 做不了这个事情,或者做起来很复杂。Hibernate 表示这锅我不背。。。
个人还觉得hibernate 好用呢,自动建表,性能问题是关联查询。
现在开发一边采用逻辑外键,不进行表关联,开发效率都差不多,mybatis简单,清晰,sql更具通用性,协作稍微方便点.
技术没有好坏,只有适不适合,在特定的情况下解决特定的问题。不同的人用hibernate,会产生不同的结果,如果你精通hibernate,性能一样不是问题。看到楼上说了那么多二者的比较,其实真的没有什么意义。
总的来说hibernate不够灵活,封装的太深了。mybatis可以随心所欲的配置想要的操作