详细介绍MyBatis 3.4.0版本的功能

网友投稿 333 2023-05-07


详细介绍MyBatis 3.4.0版本的功能

新增功能

1. Cursor 新增返回值类型为游标的方法

当查询大量(上百万)数据的时候,使用游标可以有效的减少内存使用,不需要一次性将所有数据得到,可以通过游标逐个或者分批(逐个获取一批后)处理。

SqlSession 中新增的 3 个游标方法:

/**

* 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.

* @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.

* http://@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 版本的游标方法目前有个 bug,因此不支持 @Select 注解方式,在将来的 3.4.1 版本中会解决这个问题。

使用示例:

select * from city

xml 里面没有任何改变,在获取值的地方有变化,例如使用接口:

Cursor selectAll();

或者使用命名接口方式:

CbZhlPAEGKlursor cityList = sqlSession.selectCursor("selectAll");

得到结果后,使用方法如下:

Iterator iterator = cityList.iterator();

while(iterator.hasNext()){

City c2 = iterator.next();

Assert.assertNotNull(c2);

Assert.assertNotNull(c2.getName());

Assert.assertNotNull(c2.getState());

}

嵌套查询的情况

当使用嵌套查询时,还需要设置resultOrdered="true"属性,使用方法如下:

只有设置这个属性才能得到当前对象 id 所对应的所有嵌套结果。

对某一个嵌套查询,设置 resultOrdered="true" 的结果:

不设置的结果:

以上图为例,判断是否为同一个结果下的对象,使用 id 判断的,这个 id 必须是 中的 ,另外为了结果完整,你还需要按照 配置的列进行排序,如果结果不是 对应列的顺序,嵌套的结果数量会出错。

2. 增加对 java 8 日期(jsR-310)的支持

添加以下依赖:

org.mybatis

mybatis-typehandlers-jsr310

1.0.0

如果你使用的 3.4.0 版本,就不需要任何配置就可以直接用。

如果你使用的老版本,需要手动配置:

有关 mybatis-typehandlers-jsr310 项目的详细信息看这里

3. 新增 autoMappingUnknownColumnBehavior 参数

新增了一个 settings 配置的参数 autoMappingUnknownColumnBehavior ,当检测出未知列(或未知属性)时,如何处理,默认情况下没有任何提示,这在测试的时候很不方便,不容易找到错误。

可选值:

NONE : 不做任何处理 (默认值)

WARNING : 警告日志形式的详细信息

FAILING : 映射失败,抛出异常和详细信息

配置时,在 里面添加:

4. Sql Provider 注解方式支持多个参数

例如:

@SelectProvider(type = UserSqlBuilder.class, method = "buildGetUsersByName")

List getUsersByName(

@Param("name") String name,

@Param("orderByColumn") String orderByColumn); // Multiple arguments

在写 UserSqlBuilder 的时候,同样需要使用注解来指定参数(或者按顺序):

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 基类:

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;

}

其中一个子类:

public class User extends Entity

在先前的版本中,MyBatis 无法获取 id 的实际类型,导致找不到 TypeHandler 出错。

这里只列举部分重要的内容,详细内容看官方说明

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对我们的支持。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Mybatis利用OGNL表达式处理动态sql的方法教程
下一篇:spring cloud 之 Feign 使用HTTP请求远程服务的实现方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~