Mybatis與Ibatis的區(qū)別
Mybatis與Ibatis的區(qū)別:
1、Mybatis實(shí)現(xiàn)了接口綁定,使用更加方便
在ibatis2.x中我們需要在DAO的實(shí)現(xiàn)類(lèi)中指定具體對(duì)應(yīng)哪個(gè)xml映射文件,
而Mybatis實(shí)現(xiàn)了DAO接口與xml映射文件的綁定,自動(dòng)為我們生成接口的具體實(shí)現(xiàn),使用起來(lái)變得更加省事和方便。
這可以說(shuō)是Mybatis最重要的改進(jìn)。
注意:
雖然Mybatis支持在接口中直接使用annotation的配置方式來(lái)簡(jiǎn)化配置,
不過(guò)強(qiáng)烈建議仍然使用xml配置的方式。畢竟annotation的配置方式功能有限且代碼入侵性太強(qiáng)。使用xml配置方式才能體現(xiàn)出Mybatis的優(yōu)勢(shì)所在
2、對(duì)象關(guān)系映射的改進(jìn),效率更高
相信很多在使用ibatis2.x的朋友并沒(méi)有通過(guò)ibatis的xml映射文件來(lái)實(shí)現(xiàn)對(duì)象間的關(guān)系映射。其實(shí)也確實(shí)沒(méi)有必要那么做,因?yàn)閕batis2.x采用的是“嵌套查詢”的方式將對(duì)象之間的關(guān)系通過(guò)查詢語(yǔ)句的直接拼裝來(lái)實(shí)現(xiàn),其效果和在DAO或Service中自行封裝是一樣的。
不過(guò)這種方式存在“N+1查詢問(wèn)題”。
概括地講,N+1查詢問(wèn)題可以是這樣引起的:
? 你執(zhí)行了一個(gè)單獨(dú)的SQL語(yǔ)句來(lái)獲取結(jié)果列表(就是+1)。
? 對(duì)返回的每條記錄,你執(zhí)行了一個(gè)查詢語(yǔ)句來(lái)為每個(gè)加載細(xì)節(jié)(就是N)。
這個(gè)問(wèn)題會(huì)導(dǎo)致成百上千的SQL語(yǔ)句被執(zhí)行。這通常不是期望的。
而在Mybatis中,除了兼容ibatis2.x中的“嵌套查詢”方式外,還提供了直接“嵌套結(jié)果”的方式,其效果相當(dāng)于直接通過(guò)一句sql將查詢出的dto對(duì)象自動(dòng)封裝成所需的對(duì)象。
具體實(shí)現(xiàn)方法請(qǐng)自行參考Mybatis官方使用手冊(cè),不在此累述.
不過(guò)實(shí)際上這一改進(jìn)所帶來(lái)的好處也是很有限的。因?yàn)檫@一方式在使用分頁(yè)的時(shí)候并不起作用,或者說(shuō)嵌套對(duì)象的結(jié)果集是不允許進(jìn)行分頁(yè)的。這一點(diǎn)在Mybatis框架中已經(jīng)做出了明確的限制(org.apache.ibatis.executor.resultset.NestedResultSetHandler里34行),而實(shí)際項(xiàng)目中需要分頁(yè)的情況又特別多……
仔細(xì)一想,一對(duì)多映射確實(shí)不能通過(guò)配置文件來(lái)分頁(yè),因?yàn)檫@時(shí)查詢出的記錄數(shù)并不等于實(shí)際返回對(duì)象的size,不過(guò)一對(duì)一映射為什么也不允許就不太明白了。可能是因?yàn)橐粚?duì)一是一對(duì)多的特例,而在設(shè)計(jì)框架的時(shí)候并沒(méi)有考慮去處理或是難于處理這一特例吧。
3、MyBatis采用功能強(qiáng)大的基于OGNL的表達(dá)式來(lái)消除其他元素
熟悉struts2的人應(yīng)該對(duì)OGNL表達(dá)式不會(huì)感到陌生,
MyBatis采用OGNL表達(dá)式簡(jiǎn)化了配置文件的復(fù)雜性,使用起來(lái)更簡(jiǎn)潔。
可能較為關(guān)心的是
Mybatis實(shí)現(xiàn)了接口綁定,使用更加方便。
iBatis / MyBatis 3提供了一個(gè)新的功能:注解。
- struts2+spring+ibatis框架整合實(shí)現(xiàn)增刪改查
- 在Spring使用iBatis及配置講解
- ibatis結(jié)合oracle批量插入三種方法的測(cè)評(píng)
- java~springboot~ibatis數(shù)組in查詢的實(shí)現(xiàn)方法
- ibatis遷移到mybatis3的注意事項(xiàng)
- 通過(guò)ibatis解決sql注入問(wèn)題
- ibatis學(xué)習(xí)之搭建Java項(xiàng)目
- Mybatis報(bào)錯(cuò): org.apache.ibatis.exceptions.PersistenceException解決辦法
- Ibatis配置xml文件CDATA使用方法詳解
相關(guān)文章
無(wú)感NullPointerException的值相等判斷方法
當(dāng)我們需要去判斷一個(gè)?入?yún)?查庫(kù)?返回的開(kāi)關(guān)變量(通常是個(gè)Integer類(lèi)型的)時(shí),常常會(huì)寫(xiě)如下的if-else判斷語(yǔ)句。但又會(huì)為在生產(chǎn)環(huán)境看到的「NullPointerException」感到困擾,遇到這個(gè)問(wèn)題如何處理呢,下面小編通過(guò)本文給大家詳細(xì)講解,需要的朋友參考下吧2023-02-02Java基于深度優(yōu)先遍歷的隨機(jī)迷宮生成算法
今天小編就為大家分享一篇關(guān)于Java基于深度優(yōu)先遍歷的隨機(jī)迷宮生成算法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02java DataInputStream和DataOutputStream詳解及實(shí)例代碼
這篇文章主要介紹了java DataInputStream和DataOutputStream詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01java JTree JCheckBox樹(shù)復(fù)選框詳解
這篇文章主要為大家詳細(xì)介紹了java JTree JCheckBox樹(shù)復(fù)選框的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11SpringBoot整合Javamail實(shí)現(xiàn)郵件發(fā)送功能
郵件發(fā)送是一個(gè)很普遍的功能,springboot整合了相關(guān)的starter,本文給大家介紹了可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的郵件發(fā)送功能的實(shí)例,文中通過(guò)代碼給大家介紹的非常詳細(xì),感興趣的朋友可以參考下2023-12-12簡(jiǎn)單介紹區(qū)分applet和application的方法
applet和application都是Java語(yǔ)言編寫(xiě)出來(lái)的應(yīng)用程序,本文簡(jiǎn)單介紹了二者的不同之處,需要的朋友可以參考下2017-09-09Java?JVM虛擬機(jī)調(diào)優(yōu)詳解
JVM是JavaVirtualMachine(Java虛擬機(jī))的縮寫(xiě),JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來(lái)實(shí)現(xiàn)的,本文主要介紹了jvm調(diào)優(yōu),感興趣的小伙伴們可以參考一下<BR>2022-07-07mybatisPlus條件構(gòu)造器常用方法小結(jié)
這篇文章主要介紹了mybatisPlus條件構(gòu)造器常用方法,首先是.select和其他條件,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10Android應(yīng)用開(kāi)發(fā)之將SQLite和APK一起打包的方法
這篇文章主要介紹了Android應(yīng)用開(kāi)發(fā)之將SQLite和APK一起打包的方法,文章時(shí)間較早,盡管現(xiàn)在開(kāi)發(fā)環(huán)境已大都遷移至Android Studio上,但打包原理依然相同,需要的朋友可以參考下2015-08-08