源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

详细介绍MyBatis 3.4.0版本的功能

  • 时间:2021-11-15 06:25 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:详细介绍MyBatis 3.4.0版本的功能
[b]新增功能[/b] [b]1. Cursor 新增返回值类型为游标的方法[/b] 当查询大量(上百万)数据的时候,使用游标可以有效的减少内存使用,不需要一次性将所有数据得到,可以通过游标逐个或者分批(逐个获取一批后)处理。 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);
[b]注意:[/b] 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());
}
[b]嵌套查询的情况[/b] 当使用嵌套查询时,还需要设置[code]resultOrdered="true"[/code]属性,使用方法如下:
<select id="selectAll" resultMap="xx.CityMap" resultOrdered="true">
只有设置这个属性才能得到当前对象 id 所对应的所有嵌套结果。 对某一个嵌套查询,设置 [code]resultOrdered="true"[/code] 的结果: [img]http://files.jb51.net/file_images/article/201706/201761585336836.jpg?201751585347[/img] 不设置的结果: [img]http://files.jb51.net/file_images/article/201706/201761585403866.jpg?201751585412[/img] 以上图为例,判断是否为同一个结果下的对象,使用 id 判断的,这个 id 必须是 <resultMap> 中的 <id>,另外为了结果完整,你还需要按照 <id> 配置的列进行排序,如果结果不是 <id> 对应列的顺序,嵌套的结果数量会出错。 [b]2. 增加对 Java 8 日期(JSR-310)的支持[/b] 添加以下依赖:
<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 项目的详细信息看[url=https://github.com/mybatis/typehandlers-jsr310]这里[/url] [b]3. 新增 autoMappingUnknownColumnBehavior 参数[/b] 新增了一个 settings 配置的参数 autoMappingUnknownColumnBehavior ,当检测出未知列(或未知属性)时,如何处理,默认情况下没有任何提示,这在测试的时候很不方便,不容易找到错误。 可选值: [list] [*]NONE : 不做任何处理 (默认值)[/*] [*]WARNING : 警告日志形式的详细信息[/*] [*]FAILING : 映射失败,抛出异常和详细信息[/*] [/list] 配置时,在 <settings> 里面添加:
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
[b]4. Sql Provider 注解方式支持多个参数[/b] 例如:
@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();
}
[b]解决的 BUG[/b] 支持实体类中的泛型类型 例如 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 出错。 这里只列举部分重要的内容,详细内容看[url=https://github.com/mybatis/mybatis-3/issues?q=milestone%3A3.4.0+is%3Aclosed]官方说明[/url] [b]总结[/b] 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如有疑问大家可以留言交流,谢谢大家对编程素材网的支持。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部