這里只羅列部份重要的內(nèi)容,詳細(xì)內(nèi)容看官方說明
當(dāng)查詢大量(上百萬)數(shù)據(jù)的時(shí)候,使用游標(biāo)可以有效的減少內(nèi)存使用,不需要1次性將所有數(shù)據(jù)得到,可以通過游標(biāo)逐一或分批(逐一獲得1批后)處理。
SqlSession
中新增的 3 個(gè)游標(biāo)方法:
/**
* A Cursor offers the same results as a List, except it fetches data lazily using an Iterator.
* @param <T> the returned cursor element type.
* @param statement Unique identifier matching the statement to use.
* @return Cursor of mapped objects
*/
<T> Cursor<T> selectCursor(String statement);
/**
* A Cursor offers the same results as a List, except it fetches data lazily using an Iterator.
* @param <T> 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
*/
<T> Cursor<T> selectCursor(String statement, Object parameter);
/**
* A Cursor offers the same results as a List, except it fetches data lazily using an Iterator.
* @param <T> 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
*/
<T> Cursor<T> selectCursor(String statement, Object parameter, RowBounds rowBounds);
注意: 3.4.0 版本的游標(biāo)方法目前有個(gè) bug,因此不支持 @Select
注解方式,在將來的 3.4.1 版本中會(huì)解決這個(gè)問題。
使用示例:
<select id="selectAll" resultType="tk.mybatis.springboot.model.City">
select * from city
</select>
xml 里面沒有任何改變,在獲得值的地方有變化,例如使用接口:
Cursor<City> selectAll();
或使用命名接口方式:
Cursor<City> cityList = sqlSession.selectCursor("selectAll");
得到結(jié)果后,使用方法以下:
Iterator<City> iterator = 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"
屬性,使用方法以下:
<select id="selectAll" resultMap="xx.CityMap" resultOrdered="true">
只有設(shè)置這個(gè)屬性才能得到當(dāng)前對(duì)象 id
所對(duì)應(yīng)的所有嵌套結(jié)果。
對(duì)某1個(gè)嵌套查詢,設(shè)置 resultOrdered="true"
的結(jié)果:
不設(shè)置的結(jié)果:
以上圖為例,判斷是不是為同1個(gè)結(jié)果下的對(duì)象,使用 id 判斷的,這個(gè) id 必須是 <resultMap>
中的 <id>
,另外為了結(jié)果完全,你還需要依照 <id>
配置的列進(jìn)行排序,如果結(jié)果不是 <id>
對(duì)應(yīng)列的順序,嵌套的結(jié)果數(shù)量會(huì)出錯(cuò)。
添加以下依賴:
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
<version>1.0.0</version>
</dependency>
如果你使用的 3.4.0 版本,就不需要任何配置就能夠直接用。
如果你使用的老版本,需要手動(dòng)配置:
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.InstantTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.LocalDateTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.LocalTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.OffsetDateTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.OffsetTimeTypeHandler" />
<typeHandler handler="org.apache.ibatis.type.ZonedDateTimeTypeHandler" />
</typeHandlers>
有關(guān) mybatis-typehandlers-jsr310 項(xiàng)目的詳細(xì)信息看這里
新增了1個(gè) settings 配置的參數(shù) autoMappingUnknownColumnBehavior
,當(dāng)檢測(cè)出未知列(或未知屬性)時(shí),如何處理,默許情況下沒有任何提示,這在測(cè)試的時(shí)候很不方便,不容易找到毛病。
可選值:
配置時(shí),在 <settings>
里面添加:
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
例如:
@SelectProvider(type = UserSqlBuilder.class, method = "buildGetUsersByName")
List<User> getUsersByName(
@Param("name") String name,
@Param("orderByColumn") String orderByColumn); // Multiple arguments
在寫 UserSqlBuilder
的時(shí)候,一樣需要使用注解來指定參數(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();
}
例如 Entity
基類:
public abstract class Entity<K extends Serializable> {
private static final long serialVersionUID = -1L;
protected K id;
public K getId() {
return id;
}
public void setId(K id) {
this.id = id;
}
其中1個(gè)子類:
public class User extends Entity<String>
在先前的版本中,MyBatis 沒法獲得 id
的實(shí)際類型,致使找不到 TypeHandler
出錯(cuò)。