MyBatis 3.4.0版本的新特性有哪些?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
創(chuàng)新互聯(lián)是一家從事企業(yè)網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站建設(shè)、行業(yè)門戶網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)制作的專業(yè)網(wǎng)站設(shè)計(jì)公司,擁有經(jīng)驗(yàn)豐富的網(wǎng)站建設(shè)工程師和網(wǎng)頁(yè)設(shè)計(jì)人員,具備各種規(guī)模與類型網(wǎng)站建設(shè)的實(shí)力,在網(wǎng)站建設(shè)領(lǐng)域樹立了自己獨(dú)特的設(shè)計(jì)風(fēng)格。自公司成立以來(lái)曾獨(dú)立設(shè)計(jì)制作的站點(diǎn)上千多家。
新增功能
1. Cursor 新增返回值類型為游標(biāo)的方法
當(dāng)查詢大量(上百萬(wàn))數(shù)據(jù)的時(shí)候,使用游標(biāo)可以有效的減少內(nèi)存使用,不需要一次性將所有數(shù)據(jù)得到,可以通過(guò)游標(biāo)逐個(gè)或者分批(逐個(gè)獲取一批后)處理。
SqlSession 中新增的 3 個(gè)游標(biāo)方法:
/** * A Cursor offers the same results as a List, except it fetches data lazily using an Iterator. * @paramthe returned cursor element type. * @param statement Unique identifier matching the statement to use. * @return Cursor of mapped objects */ Cursor selectCursor(String statement); /** * A Cursor offers the same results as a List, except it fetches data lazily using an Iterator. * @param the returned cursor element type. * @param statement Unique identifier matching the statement to use. * @param parameter A parameter object to pass to the statement. * @return Cursor of mapped objects */ Cursor selectCursor(String statement, Object parameter); /** * A Cursor offers the same results as a List, except it fetches data lazily using an Iterator. * @param the returned cursor element type. * @param statement Unique identifier matching the statement to use. * @param parameter A parameter object to pass to the statement. * @param rowBounds Bounds to limit object retrieval * @return Cursor of mapped objects */ Cursor selectCursor(String statement, Object parameter, RowBounds rowBounds);
注意: 3.4.0 版本的游標(biāo)方法目前有個(gè) bug,因此不支持 @Select 注解方式,在將來(lái)的 3.4.1 版本中會(huì)解決這個(gè)問(wèn)題。
使用示例:
xml 里面沒(méi)有任何改變,在獲取值的地方有變化,例如使用接口:
CursorselectAll();
或者使用命名接口方式:
CursorcityList = sqlSession.selectCursor("selectAll");
得到結(jié)果后,使用方法如下:
Iteratoriterator = cityList.iterator(); while(iterator.hasNext()){ City c2 = iterator.next(); Assert.assertNotNull(c2); Assert.assertNotNull(c2.getName()); Assert.assertNotNull(c2.getState()); }
嵌套查詢的情況
當(dāng)使用嵌套查詢時(shí),還需要設(shè)置resultOrdered="true"
屬性,使用方法如下:
只有設(shè)置這個(gè)屬性才能得到當(dāng)前對(duì)象 id 所對(duì)應(yīng)的所有嵌套結(jié)果。
對(duì)某一個(gè)嵌套查詢,設(shè)置 resultOrdered="true"
的結(jié)果:
不設(shè)置的結(jié)果:
以上圖為例,判斷是否為同一個(gè)結(jié)果下的對(duì)象,使用 id 判斷的,這個(gè) id 必須是
2. 增加對(duì) Java 8 日期(JSR-310)的支持
添加以下依賴:
org.mybatis mybatis-typehandlers-jsr310 1.0.0
如果你使用的 3.4.0 版本,就不需要任何配置就可以直接用。
如果你使用的老版本,需要手動(dòng)配置:
有關(guān) mybatis-typehandlers-jsr310 項(xiàng)目的詳細(xì)信息看這里
3. 新增 autoMappingUnknownColumnBehavior 參數(shù)
新增了一個(gè) settings 配置的參數(shù) autoMappingUnknownColumnBehavior ,當(dāng)檢測(cè)出未知列(或未知屬性)時(shí),如何處理,默認(rèn)情況下沒(méi)有任何提示,這在測(cè)試的時(shí)候很不方便,不容易找到錯(cuò)誤。
可選值:
配置時(shí),在
4. Sql Provider 注解方式支持多個(gè)參數(shù)
例如:
@SelectProvider(type = UserSqlBuilder.class, method = "buildGetUsersByName") ListgetUsersByName( @Param("name") String name, @Param("orderByColumn") String orderByColumn); // Multiple arguments
在寫 UserSqlBuilder 的時(shí)候,同樣需要使用注解來(lái)指定參數(shù)(或者按順序):
public String buildGetUsersByName( @Param("name") final String name @Param("orderByColumn") final String orderByColumn) { // Allow multiple arguments return new SQL(){{ SELECT("*"); FROM("users"); if (name != null) { WHERE("name like #{name} || '%'"); } ORDER_BY(orderByColumn); }}.toString(); }
解決的 BUG
支持實(shí)體類中的泛型類型
例如 Entity 基類:
public abstract class Entity{ private static final long serialVersionUID = -1L; protected K id; public K getId() { return id; } public void setId(K id) { this.id = id; }
其中一個(gè)子類:
public class User extends Entity
在先前的版本中,MyBatis 無(wú)法獲取 id 的實(shí)際類型,導(dǎo)致找不到 TypeHandler 出錯(cuò)。
看完上述內(nèi)容,你們掌握MyBatis 3.4.0版本的新特性有哪些的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!