温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

mybatis与hibernate在java中的区别有哪些

发布时间:2021-01-19 15:15:23 来源:亿速云 阅读:130 作者:Leah 栏目:开发技术

这期内容当中小编将会给大家带来有关mybatis与hibernate在java中的区别有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

1.开发效率

如果是做一些简单的CMS类似的只有简单的增删改查的项目,那么使用Hibernate更有优势,不需要掌握太多的Hibernate知识,只需要会一些基本的查询和一些配置(Hibernate真正要学会,个人感觉知识量比mybatis大很多)。hiberbate是用java对象拼sql,mybatis是直接写原生sql。hibernate提供了很好的映射机制,mybatis还需要自己写resultmap paramMap这些东西。Hibernate和MyBatis都有相应的代码生成工具。可以生成简单基本的DAO层方法。针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。综上所述,那么从开发效率上来讲,Hibernate> mybatis。

2.可维护性

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进行日志记录。

3.性能

两者都提供了缓存,session机制。小项目两者差不多吧.大型项目mybatis>hibernate。

4.常见面试题

什么样的情况下,Hibernate 会慢MyBatis10倍?

当Hibernate用错了的情况下,会出现:P

比如, Hibernate的对象A里的内嵌对象B加载被你从默认懒加载改为预加载(假设你没有搞懂影响,就改动了配置), 你要查询对象A的列表,就会出现N+1查询, 但你的大部分业务逻辑又不需要读取内嵌对象B,性能就会很差。

而一般情况下MyBatis, 这种查询是需要手写的。 出现这种情况的概率较小。

知识点扩展:

Hibernate缓存

Hibernate一级缓存是Session缓存,利用好一级缓存就需要对Session的生命周期进行管理好。建议在一个Action操作中使用一个Session。一级缓存需要对Session进行严格管理。

Hibernate二级缓存是SessionFactory级的缓存。 SessionFactory的缓存分为内置缓存和外置缓存。内置缓存中存放的是SessionFactory对象的一些集合属性包含的数据(映射元素据及预定SQL语句等),对于应用程序来说,它是只读的。外置缓存中存放的是数据库数据的副本,其作用和一级缓存类似.二级缓存除了以内存作为存储介质外,还可以选用硬盘等外部存储设备。二级缓存称为进程级缓存或SessionFactory级缓存,它可以被所有session共享,它的生命周期伴随着SessionFactory的生命周期存在和消亡。

MyBatis缓存

MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。MyBatis 3 中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置。

默认情况下是没有开启缓存的,除了局部的 session 缓存,可以增强变现而且处理循环 依赖也是必须的。要开启二级缓存,你需要在你的 SQL 映射文件中添加一行: <cache/>

字面上看就是这样。这个简单语句的效果如下:

  1. 映射语句文件中的所有 select 语句将会被缓存。

  2. 映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。

  3. 缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。

  4. 根据时间表(比如 no Flush Interval,没有刷新间隔), 缓存不会以任何时间顺序 来刷新。

  5. 缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。

  6. 缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而 且可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

上述就是小编为大家分享的mybatis与hibernate在java中的区别有哪些了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI