第一方面:开辟速率的对照
就开辟速率而言,Hibernate的真正控制要比Mybatis来得难些。Mybatis框架相对简朴很轻易上手,但也相对大略些。个人以为要用好Mybatis照样首先要先明白好Hibernate。(引荐进修:Java视频教程)
比起二者的开辟速率,不单单议要斟酌到二者的特征及机能,更要依据项目需求去斟酌终究哪个更适合项目开辟,比方:一个项目中用到的庞杂查询基础没有,就是简朴的增编削查,如许挑选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 映照文件中增加一行: <cache/>
字面上看就是如许。这个简朴语句的结果以下:
映照语句文件中的一切 select 语句将会被缓存。
映照语句文件中的一切 insert,update 和 delete 语句会革新缓存。
缓存会运用 Least Recently Used(LRU,近来起码运用的)算法来收回。
依据时刻表(比方 no Flush Interval,没有革新距离), 缓存不会以任何时刻递次 来革新。
缓存会存储列表鸠合或对象(不管查询要领返回什么)的 1024 个援用。
缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是同享的,而 且能够平安地被挪用者修正,而不滋扰其他挪用者或线程所做的潜伏修正。
一切的这些属性都能够经由过程缓存元素的属性来修正。
比方: <cache eviction=”FIFO” flushInterval=”60000″ size=”512″ readOnly=”true”/>
这个更高等的设置建立了一个 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的自觉运用。不然,脏数据的涌现会给体系的一般运转带来很大的隐患。
更多Java相干技术文章,请接见Java开辟教程栏目举行进修!
以上就是mybatis和hibernate的区分的细致内容,更多请关注ki4网别的相干文章!