手表,鱼翅,从前慢-hi野兽,健身健美社区,锻炼计划推荐

admin 2019-05-21 阅读:129

我在hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也运用过,现在对hibernate和mybatis做一下比照,便于我们更好的了解和学习,使自己在做项目中愈加称心如意。

榜首方面:开发速度的比照

就开发速度而言,Hibernate的真实把握要比Mybatis来得难些。Mybatis结构相对简略很简略上手,但也相对粗陋些。个人觉得要用好Mybatis仍是首先要先了解好Hibernate。

比起两者的开发速度,不只是要考虑到两者的特性及功用,更要依据项目需求去考虑终究哪一个更适合项目开发,比方:一个项目中用到的杂乱查询底子没有,便是简略的增修正查,这样挑选hibernate功率就很快了,由于底子的sql句子现已被封装好了,底子不需求你去写sql句子,这就节省了许多的时刻,可是关于一个大型项目,杂乱句子较多,这样再去挑选hibernate就不是一个太好的挑选,挑选mybatis就会加速许多,并且句子的办理也比较便利。

第二方面:开发工作量的比照

Hibernate和MyBatis都有相应的代码生成东西。能够生成简略底子的DAO层办法。针对高档查询,Mybatis需求手动编写SQL句子,以及ResultMap。而Hibernate有杰出的映射机制,开发者无需关怀SQL的生成与成果映射,能够更专心于业务流程。

第三方面:sql优化方面

Hibernate的查询会将表中的一切字段查询出来,这一点会有功用耗费。Hibernate也能够自己写SQL来指定需求查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的,所以能够按需求指定查询的字段。

Hibernate HQL句子的调优需求将SQL打印出来,而Hibernate的SQL被许多人厌弃由于太丑了。MyBatis的SQL是自己手动写的所以调整便利。但Hibernate具有自己的日志计算。Mybatis自身不带日志计算,运用Log4j进行日志记载。

第四方面:目标办理的比照

Hibernate 是完好的目标/联系映射解决计划,它供给了目标状况办理(state management)的功用,使开发者不再需求理睬底层数据库体系的细节。也便是说,相关于常见的 JDBC/SQL 耐久层计划中需求办理 SQL 句子,Hibernate选用了更天然的面向目标的视角来耐久化 Java 运用中的数据。

换句话说,运用 Hibernate 的开发者应该总是重视目标的状况(state),不用考虑 SQL 句子的履行。这部分细节现已由 Hibernate 掌管稳当,只要开发者在进行体系功用调优的时分才需求进行了解。而MyBatis在这一块没有文档阐明,用户需求对目标自己进行具体的办理。

第五方面:缓存机制

Hibernate缓存

Hibernate一级缓存是Session缓存,利用好一级缓存就需求对Session的生命周期进行办理好。主张在一个Action操作中运用一个Session。一级缓存需求对Session进行严格办理。

Hibernate二级缓存是SessionFactory级的缓存。 SessionFactory的缓存分为内置缓存和外置缓存。内置缓存中寄存的是SessionFactory目标的一些调集特点包含的数据(映射元素据及预订SQL句子等),关于运用程序来说,它是只读的。外置缓存中寄存的是数据库数据的副本,其作用和一级缓存相似.二级缓存除了以内存作为存储介质外,还能够选用硬盘等外部存储设备。二级缓存称为进程级缓存或SessionFactory级缓存,它能够被一切session同享,它的生命周期伴随着SessionFactory的生命周期存在和消亡。

MyBatis缓存

MyBatis 包含一个十分强壮的查询缓存特性,它能够十分便利地装备和定制。MyBatis 3 中的缓存完成的许多改善都现已完成了,使得它愈加强壮并且易于装备。

默许状况下是没有敞开缓存的,除了部分的 session 缓存,能够增强变现并且处理循环 依靠也是有必要的。要敞开二级缓存,你需求在你的 SQL 映射文件中增加一行:

字面上看便是这样。这个简略句子的作用如下:

  • 映射句子文件中的一切 select 句子将会被缓存。
  • 映射句子文件中的一切 insert,update 和 delete 句子会改写缓存。
  • 缓存会运用 Least Recently Used(LRU,最近最少运用的)算法来收回。
  • 依据时刻表(比方 no Flush Interval,没有改写距离), 缓存不会以任何时刻次序 来改写。
  • 缓存会存储列表调集或目标(不管查询办法回来什么)的 1024 个引证。
  • 缓存会被视为是 read/write(可读/可写)的缓存,意味着目标检索不是同享的,而 且能够安全地被调用者修正,而不搅扰其他调用者或线程所做的潜在修正。

一切的这些特点都能够经过缓存元素的特点来修正。

比方:

这个更高档的装备创立了一个 FIFO 缓存,并每隔 60 秒改写,存数成果目标或列表的 512 个引证,并且回来的目标被认为是只读的,因而在不同线程中的调用者之间修正它们会 导致抵触。可用的收回战略有, 默许的是 LRU:

  • LRU – 最近最少运用的:移除最长时刻不被运用的目标。
  • FIFO – 先进先出:按目标进入缓存的次序来移除它们。
  • SOFT – 软引证:移除根据废物收回器状况和软引证规矩的目标。
  • WEAK – 弱引证:更积极地移除根据废物收集器状况和弱引证规矩的目标。

flushInterval(改写距离)能够被设置为恣意的正整数,并且它们代表一个合理的毫秒 方法的时刻段。默许状况是不设置,也便是没有改写距离,缓存只是调用句子时改写。

size(引证数目)能够被设置为恣意正整数,要记住你缓存的目标数目和你运转环境的 可用内存资源数目。默许值是1024。

readOnly(只读)属功用够被设置为 true 或 false。只读的缓存会给一切调用者回来缓 存目标的相同实例。因而这些目标不能被修正。这供给了很重要的功用优势。可读写的缓存 会回来缓存目标的复制(经过序列化) 。这会慢一些,可是安全,因而默许是 false。

相同点:Hibernate和Mybatis的二级缓存除了选用体系默许的缓存机制外,都能够经过完成你自己的缓存或为其他第三方缓存计划,创立适配器来彻底掩盖缓存行为。

不同点:Hibernate的二级缓存装备在SessionFactory生成的装备文件中进行具体装备,然后再在具体的表-目标映射中装备是那种缓存。

MyBatis的二级缓存装备都是在每个具体的表-目标映射中进行具体装备,这样针对不同的表能够自定义不同的缓存机制。并且Mybatis能够在命名空间中同享相同的缓存装备和实例,经过Cache-ref来完成。

两者比较:由于Hibernate对查询目标有着杰出的办理机制,用户无需关怀SQL。所以在运用二级缓存时假如呈现脏数据,体系会报出过错并提示。

而MyBatis在这一方面,运用二级缓存时需求特别当心。假如不能彻底确认数据更新操作的涉及规模,防止Cache的盲目运用。不然,脏数据的呈现会给体系的正常运转带来很大的危险。

别人总结

  • Hibernate功用强壮,数据库无关性好,O/R映射才能强,假如你对Hibernate恰当通晓,并且对Hibernate进行了恰当的封装,那么你的项目整个耐久层代码会恰当简略,需求写的代码很少,开发速度很快,十分爽。
  • Hibernate的缺陷便是学习门槛不低,要通晓门槛更高,并且怎样规划O/R映射,在功用和目标模型之间怎么权衡获得平衡,以及怎样用好Hibernate方面需求你的经历和才能都很强才行。
  • iBATIS入门简略,即学即用,供给了数据库查询的主动目标绑定功用,并且连续了很好的SQL运用经历,关于没有那么高的目标模型要求的项目来说,恰当完美。
  • iBATIS的缺陷便是结构仍是比较粗陋,功用尚有缺失,尽管简化了数据绑定代码,可是整个底层数据库查询实践仍是要自己写的,工作量也比较大,并且不太简略习惯快速数据库修正。

写在最终:小编为我们预备了一些适合于1-5年以上开发经历的java程序员面试涉及到的绝大部分面试题及答案做成了文档和学习笔记文件以及架构视频材料免费共享给我们(包含Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术材料),期望能够协助到我们。

获取方法:请我们转发重视并私信小编(学习)

即可获取你需求的各类材料。