Mybatis與Ibatis的區(qū)別:
1、Mybatis實(shí)現(xiàn)了接口綁定,使用更加方便
在ibatis2.x中我們需要在DAO的實(shí)現(xiàn)類中指定具體對(duì)應(yīng)哪個(gè)xml映射文件,
而Mybatis實(shí)現(xiàn)了DAO接口與xml映射文件的綁定,自動(dòng)為我們生成接口的具體實(shí)現(xiàn),使用起來變得更加省事和方便。
這可以說是Mybatis最重要的改進(jìn)。
注意:
雖然Mybatis支持在接口中直接使用annotation的配置方式來簡(jiǎn)化配置,
不過強(qiáng)烈建議仍然使用xml配置的方式。畢竟annotation的配置方式功能有限且代碼入侵性太強(qiáng)。使用xml配置方式才能體現(xiàn)出Mybatis的優(yōu)勢(shì)所在
2、對(duì)象關(guān)系映射的改進(jìn),效率更高
相信很多在使用ibatis2.x的朋友并沒有通過ibatis的xml映射文件來實(shí)現(xiàn)對(duì)象間的關(guān)系映射。其實(shí)也確實(shí)沒有必要那么做,因?yàn)閕batis2.x采用的是“嵌套查詢”的方式將對(duì)象之間的關(guān)系通過查詢語句的直接拼裝來實(shí)現(xiàn),其效果和在DAO或Service中自行封裝是一樣的。
不過這種方式存在“N+1查詢問題”。
概括地講,N+1查詢問題可以是這樣引起的:
? 你執(zhí)行了一個(gè)單獨(dú)的SQL語句來獲取結(jié)果列表(就是+1)。
? 對(duì)返回的每條記錄,你執(zhí)行了一個(gè)查詢語句來為每個(gè)加載細(xì)節(jié)(就是N)。
這個(gè)問題會(huì)導(dǎo)致成百上千的SQL語句被執(zhí)行。這通常不是期望的。
而在Mybatis中,除了兼容ibatis2.x中的“嵌套查詢”方式外,還提供了直接“嵌套結(jié)果”的方式,其效果相當(dāng)于直接通過一句sql將查詢出的dto對(duì)象自動(dòng)封裝成所需的對(duì)象。
具體實(shí)現(xiàn)方法請(qǐng)自行參考Mybatis官方使用手冊(cè),不在此累述.
不過實(shí)際上這一改進(jìn)所帶來的好處也是很有限的。因?yàn)檫@一方式在使用分頁的時(shí)候并不起作用,或者說嵌套對(duì)象的結(jié)果集是不允許進(jìn)行分頁的。這一點(diǎn)在Mybatis框架中已經(jīng)做出了明確的限制(org.apache.ibatis.executor.resultset.NestedResultSetHandler里34行),而實(shí)際項(xiàng)目中需要分頁的情況又特別多……
仔細(xì)一想,一對(duì)多映射確實(shí)不能通過配置文件來分頁,因?yàn)檫@時(shí)查詢出的記錄數(shù)并不等于實(shí)際返回對(duì)象的size,不過一對(duì)一映射為什么也不允許就不太明白了。可能是因?yàn)橐粚?duì)一是一對(duì)多的特例,而在設(shè)計(jì)框架的時(shí)候并沒有考慮去處理或是難于處理這一特例吧。
3、MyBatis采用功能強(qiáng)大的基于OGNL的表達(dá)式來消除其他元素
熟悉struts2的人應(yīng)該對(duì)OGNL表達(dá)式不會(huì)感到陌生,
MyBatis采用OGNL表達(dá)式簡(jiǎn)化了配置文件的復(fù)雜性,使用起來更簡(jiǎn)潔。
可能較為關(guān)心的是
Mybatis實(shí)現(xiàn)了接口綁定,使用更加方便。
iBatis / MyBatis 3提供了一個(gè)新的功能:注解。