新增功能
1. Cursor 新增返回值类型为游标的方法
当查询大量(上百万)数据的时候,使用游标可以有效的减少内存使用,不需要一次性将所有数据得到,可以通过游标逐个或者分批(逐个获取一批后)处理。
SqlSession 中新增的 3 个游标方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
/**
* 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 版本的游标方法目前有个 bug,因此不支持 @Select 注解方式,在将来的 3.4.1 版本中会解决这个问题。
使用示例:
1
2
3
|
<select id= "selectAll" resultType= "tk.mybatis.springboot.model.City" >
select * from city
</select>
|
xml 里面没有任何改变,在获取值的地方有变化,例如使用接口:
1
|
Cursor<City> selectAll();
|
或者使用命名接口方式:
1
|
Cursor<City> cityList = sqlSession.selectCursor( "selectAll" );
|
得到结果后,使用方法如下:
1
2
3
4
5
6
7
|
Iterator<City> iterator = cityList.iterator();
while (iterator.hasNext()){
City c2 = iterator.next();
Assert.assertNotNull(c2);
Assert.assertNotNull(c2.getName());
Assert.assertNotNull(c2.getState());
}
|
嵌套查询的情况
当使用嵌套查询时,还需要设置resultOrdered="true"
属性,使用方法如下:
1
|
<select id= "selectAll" resultMap= "xx.CityMap" resultOrdered= "true" >
|
只有设置这个属性才能得到当前对象 id 所对应的所有嵌套结果。
对某一个嵌套查询,设置 resultOrdered="true"
的结果:
不设置的结果:
以上图为例,判断是否为同一个结果下的对象,使用 id 判断的,这个 id 必须是 <resultMap> 中的 <id>,另外为了结果完整,你还需要按照 <id> 配置的列进行排序,如果结果不是 <id> 对应列的顺序,嵌套的结果数量会出错。
2. 增加对 Java 8 日期(JSR-310)的支持
添加以下依赖:
1
2
3
4
5
|
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
<version> 1.0 . 0 </version>
</dependency>
|
如果你使用的 3.4.0 版本,就不需要任何配置就可以直接用。
如果你使用的老版本,需要手动配置:
1
2
3
4
5
6
7
8
9
|
<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>
|
有关 mybatis-typehandlers-jsr310 项目的详细信息看这里
3. 新增 autoMappingUnknownColumnBehavior 参数
新增了一个 settings 配置的参数 autoMappingUnknownColumnBehavior ,当检测出未知列(或未知属性)时,如何处理,默认情况下没有任何提示,这在测试的时候很不方便,不容易找到错误。
可选值:
- NONE : 不做任何处理 (默认值)
- WARNING : 警告日志形式的详细信息
- FAILING : 映射失败,抛出异常和详细信息
配置时,在 <settings> 里面添加:
1
|
<setting name= "autoMappingUnknownColumnBehavior" value= "WARNING" />
|
4. Sql Provider 注解方式支持多个参数
例如:
1
2
3
4
|
@SelectProvider (type = UserSqlBuilder. class , method = "buildGetUsersByName" )
List<User> getUsersByName(
@Param ( "name" ) String name,
@Param ( "orderByColumn" ) String orderByColumn); // Multiple arguments
|
在写 UserSqlBuilder 的时候,同样需要使用注解来指定参数(或者按顺序):
1
2
3
4
5
6
7
8
9
10
11
12
|
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
支持实体类中的泛型类型
例如 Entity 基类:
1
2
3
4
5
6
7
8
9
10
11
|
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
|
public class User extends Entity<String>
|
在先前的版本中,MyBatis 无法获取 id 的实际类型,导致找不到 TypeHandler 出错。
这里只列举部分重要的内容,详细内容看官方说明
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://blog.csdn.net/isea533/article/details/51533296