一
這個區別不是很大,最主要的區別就是mybatis簡化了編碼的過程,不需要去寫dao的實現類,直接寫一個dao的借口,再寫一個xml配置文件,整個mybatis就配置好了,也就是數據庫就連接好了,然后再service里面調用dao就可以了,但是ibatis則不可以,必須要寫dao的實現類,在寫個什么return getSqlMapClientTemplate().queryForList()神馬的,所以說mybatis是ibatis的升級版本,也就是在這里,不用寫dao的實現類,還有些區別就是xml里面的sql語句的寫法有些小變化,但是不大
二
隨着開發團隊轉投Google Code旗下,ibatis3.x正式更名為Mybatis
雖然從正式版發布至今也有近一年時間,官方也非常友好的提供了 中文版的使用手冊,不過相信很多人還在項目中使用ibatis2.x版本。
究竟Mybatis有哪些新特性,能給我們帶來哪些好處呢?以下是我看一位大俠研究后
2.1、Mybatis實現了接口綁定,使用更加方便。
在ibatis2.x中我們需要在DAO的實現類中指定具體對應哪個xml映射文件,
而Mybatis實現了DAO接口與xml映射文件的綁定,自動為我們生成接口的具體實現,使用起來變得更加省事和方便。
這可以說是Mybatis最重要的改進。
注意:
雖然Mybatis支持在接口中直接使用annotation的配置方式來簡化配置,
不過強烈建議仍然使用xml配置的方式。畢竟annotation的配置方式功能有限且代碼入侵性太強。使用xml配置方式才能體現出Mybatis的優勢所在
2.2、對象關系映射的改進,效率更高
相信很多在使用ibatis2.x的朋友並沒有通過ibatis的xml映射文件來實現對象間的關系映射。其實也確實沒有必要那么做,因為ibatis2.x采用的是“嵌套查詢”的方式將對象之間的關系通過查詢語句的直接拼裝來實現,其效果和在DAO或Service中自行封裝是一樣的。
不過這種方式存在“N+1查詢問題”。
概括地講,N+1查詢問題可以是這樣引起的:
? 你執行了一個單獨的SQL語句來獲取結果列表(就是+1)。
? 對返回的每條記錄,你執行了一個查詢語句來為每個加載細節(就是N)。
這個問題會導致成百上千的SQL語句被執行。這通常不是期望的。
而在Mybatis中,除了兼容ibatis2.x中的“嵌套查詢”方式外,還提供了直接“嵌套結果”的方式,其效果相當於直接通過一句sql將查詢出的dto對象自動封裝成所需的對象。
具體實現方法請自行參考Mybatis官方使用手冊,不在此累述.
不過實際上這一改進所帶來的好處也是很有限的。因為這一方式在使用分頁的時候並不起作用,或者說嵌套對象的結果集是不允許進行分頁的。這一點在Mybatis框架中已經做出了明確的限制(org.apache.ibatis.executor.resultset.NestedResultSetHandler里34行),而實際項目中需要分頁的情況又特別多……
仔細一想,一對多映射確實不能通過配置文件來分頁,因為這時查詢出的記錄數並不等於實際返回對象的size,不過一對一映射為什么也不允許就不太明白了。可能是因為一對一是一對多的特例,而在設計框架的時候並沒有考慮去處理或是難於處理這一特例吧。
2.3 Batis采用功能強大的基於OGNL的表達式來消除其他元素。
熟悉struts2的人應該對OGNL表達式不會感到陌生,
MyBatis采用OGNL表達式簡化了配置文件的復雜性,使用起來更簡潔。
雖然從正式版發布至今也有近一年時間,官方也非常友好的提供了 中文版的使用手冊,不過相信很多人還在項目中使用ibatis2.x版本。
究竟Mybatis有哪些新特性,能給我們帶來哪些好處呢?以下是我看一位大俠研究后
2.1、Mybatis實現了接口綁定,使用更加方便。
在ibatis2.x中我們需要在DAO的實現類中指定具體對應哪個xml映射文件,
而Mybatis實現了DAO接口與xml映射文件的綁定,自動為我們生成接口的具體實現,使用起來變得更加省事和方便。
這可以說是Mybatis最重要的改進。
注意:
雖然Mybatis支持在接口中直接使用annotation的配置方式來簡化配置,
不過強烈建議仍然使用xml配置的方式。畢竟annotation的配置方式功能有限且代碼入侵性太強。使用xml配置方式才能體現出Mybatis的優勢所在
2.2、對象關系映射的改進,效率更高
相信很多在使用ibatis2.x的朋友並沒有通過ibatis的xml映射文件來實現對象間的關系映射。其實也確實沒有必要那么做,因為ibatis2.x采用的是“嵌套查詢”的方式將對象之間的關系通過查詢語句的直接拼裝來實現,其效果和在DAO或Service中自行封裝是一樣的。
不過這種方式存在“N+1查詢問題”。
概括地講,N+1查詢問題可以是這樣引起的:
? 你執行了一個單獨的SQL語句來獲取結果列表(就是+1)。
? 對返回的每條記錄,你執行了一個查詢語句來為每個加載細節(就是N)。
這個問題會導致成百上千的SQL語句被執行。這通常不是期望的。
而在Mybatis中,除了兼容ibatis2.x中的“嵌套查詢”方式外,還提供了直接“嵌套結果”的方式,其效果相當於直接通過一句sql將查詢出的dto對象自動封裝成所需的對象。
具體實現方法請自行參考Mybatis官方使用手冊,不在此累述.
不過實際上這一改進所帶來的好處也是很有限的。因為這一方式在使用分頁的時候並不起作用,或者說嵌套對象的結果集是不允許進行分頁的。這一點在Mybatis框架中已經做出了明確的限制(org.apache.ibatis.executor.resultset.NestedResultSetHandler里34行),而實際項目中需要分頁的情況又特別多……
仔細一想,一對多映射確實不能通過配置文件來分頁,因為這時查詢出的記錄數並不等於實際返回對象的size,不過一對一映射為什么也不允許就不太明白了。可能是因為一對一是一對多的特例,而在設計框架的時候並沒有考慮去處理或是難於處理這一特例吧。
2.3 Batis采用功能強大的基於OGNL的表達式來消除其他元素。
熟悉struts2的人應該對OGNL表達式不會感到陌生,
MyBatis采用OGNL表達式簡化了配置文件的復雜性,使用起來更簡潔。
可能較為關心的是
Mybatis實現了接口綁定,使用更加方便。
iBatis / MyBatis 3提供了一個新的功能:的注解。