介绍:

  Hibernate :Hibernate 是当前最流行的ORM框架,对数据库结构提供了较为完整的封装。

  Mybatis:Mybatis同样也是非常流行的ORM框架,主要着力点在于POJO 与SQL之间的映射关系。

具体从几个方面说一下两者的区别:

1.两者最大的区别:

  针对简单逻辑,Hibernate和MyBatis都有相应的代码生成工具,可以生成简单基本的DAO层方法。

  针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。

2.开发难度对比

  Hibernate的开发难度要大于Mybatis。主要由于Hibernate比较复杂、庞大,学习周期较长。

  而Mybatis则相对简单一些,并且Mybatis主要依赖于sql的书写,让开发者感觉更熟悉。

3.sql书写比较

  Mybatis的SQL是手动编写的,所以可以按需求指定查询的字段。不过没有自己的日志统计,所以要借助log4j来记录日志。

  Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。不过Hibernate具有自己的日志统计。

4.数据库扩展性比较

  Mybatis由于所有SQL都是依赖数据库书写的,所以扩展性,迁移性比较差。

  Hibernate与数据库具体的关联都在XML中,所以HQL对具体是用什么数据库并不是很关心。

5.缓存机制比较

  相同点:Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓存方案,创建适配器来完全覆盖缓存行为。

  不同点:Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。

  MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。

  两者比较:因为Hibernate对查询对象有着良好的管理机制,用户无需关心SQL。所以在使用二级缓存时如果出现脏数据,系统会报出错误并提示。

而MyBatis在这一方面,使用二级缓存时需要特别小心。如果不能完全确定数据更新操作的波及范围,避免Cache的盲目使用。否则,脏数据的出现会给系统的正常运行带来很大的隐患。

6.总结:

  mybatis:小巧、方便、高效、简单、直接、半自动
  hibernate:强大、方便、高效、复杂、绕弯子、全自动

  Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。

  而MyBatis的优势是MyBatis可以进行更为细致的SQL优化,可以减少查询字段,并且容易掌握。

  Hibernate的优势是DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

mybatis:

  1. 入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。

  2. 可以进行更为细致的SQL优化,可以减少查询字段。

  3. 缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。

  4. 二级缓存机制不佳。

hibernate:

  1. 功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。

  2. 有更好的二级缓存机制,可以使用第三方缓存。

  3. 缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。

举个形象的比喻:

  mybatis:机械工具,使用方便,拿来就用,但工作还是要自己来作,不过工具是活的,怎么使由我决定。

  hibernate:智能机器人,但研发它(学习、熟练度)的成本很高,工作都可以摆脱他了,但仅限于它能做的事。

参考:https://blog.csdn.net/qq_41378597/article/details/88070335

最新文章

  1. 学记:为spring boot写一个自动配置
  2. Sql简单封装
  3. Tomcat异常 Multiple Contexts have a path of "/qqshl".解决方法
  4. json_decode时含有中文是解码问题(json_decode返回为null)
  5. MVC5 + EF6 + Bootstrap3 (7) Bootstrap的栅格系统
  6. matplotlib 显示中文
  7. 解析xml的几种方式
  8. css_day6
  9. 关于在Reshaper中添加代码模板代码段
  10. vs.net 2013 Saffolding功能扩展
  11. NYOJ--102--次方求模(快速求幂取模)
  12. 安装Loadrunner 11.0时,弹出缺少2.8 sp1组件--解决方案(win7)
  13. windows平台MySQL密码设置与破解
  14. functions 示例
  15. CentOS安装vmtools后 共享文件不能显示的问题
  16. linux 斜杠/
  17. jquery keycode
  18. 【BZOJ4709】【Jsoi2011】柠檬
  19. dubbo SpringContainer
  20. WPF/UWP 的 Grid 布局竟然有 Bug,还不止一个!了解 Grid 中那些未定义的布局规则

热门文章

  1. python函数的执行过程
  2. ElementTree
  3. MATLAB学习(三)元素访问和常用代数运算
  4. 【POJ - 1970】The Game(dfs)
  5. 无法从路径’NuGet.CommandLine.2.7.1.nupkg’读取包
  6. 将IList、DataTable数据导出到Excel
  7. 《ThinkPHP 5.0快速入门》 请求和响应
  8. TS问题:属性'filter'在类型'Vue'上不存在
  9. ZOJ Problem Set - 1005
  10. Python全栈开发之7、面向对象编程进阶-类属性和方法、异常处理和反射