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 <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 版本中会解决这个问题。

使用示例:

<select id="selectAll" resultType="tk.mybatis.springboot.model.City">
  select * from city
</select>

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

Cursor<City> selectAll();

或者使用命名接口方式:

Cursor<City> cityList = sqlSession.selectCursor("selectAll");

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

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"属性,使用方法如下:

<select id="selectAll" resultMap="xx.CityMap" resultOrdered="true">

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

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

不设置的结果:
不设置

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

2. 增加对 Java 8 日期(JSR-310)的支持

添加以下依赖:

<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-typehandlers-jsr310</artifactId>
  <version>1.0.0</version>
</dependency>

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

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

<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> 里面添加:

<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>

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

例如:

@SelectProvider(type = UserSqlBuilder.class, method = "buildGetUsersByName")
List<User> 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<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;
    }

其中一个子类:

public class User extends Entity<String>

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

isea533

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值