接口 io.mybatis.mapper.cursor.CursorMapper<T, E>

游标相关的功能,是在 2016年初的 MyBatis 3.3.1 中增加的,当你想逐个从数据库取值时可以使用。

通用方法中,仅提供了两个方法示例:

  • Cursor<T> selectCursor(T entity): 根据实体字段条件查询
  • Cursor<T> selectCursorByExample(E example):根据 Example 条件查询

这两个方法就提现了 5. 那就是一个 provider 实现,通过修改接口方法的返回值和入参,就能变身无数个通用方法, 这两个接口使用了 EntityProviderExampleProvider 中的现成实现,只是把返回值从 List<T> 改成了 Cursor<T>

一个简单的示例如下:

@Test
public void testSelectCursor() {
  SqlSession sqlSession = getSqlSession();
  try {
    CursorMapper<User, Example<User>> mapper = sqlSession.getMapper(UserMapper.class);
    User user = new User();
    user.setSex("女");
    Cursor<User> userCursor = mapper.selectCursor(user);
    Iterator<User> userIterator = userCursor.iterator();
    int count = 0;
    while (userIterator.hasNext()) {
      count++;
      User u = userIterator.next();
      System.out.println(u.getUserName());
      Assert.assertEquals(count, userCursor.getCurrentIndex() + 1);
    }
    Assert.assertEquals(16, count);
    Assert.assertTrue(userCursor.isConsumed());
  } finally {
    //不要忘记关闭sqlSession
    sqlSession.close();
  }
}

使用游标时还需要通过注解添加一些额外配置才能生效,具体用法参考下面两篇文章:

不同数据库需要的配置不一样,这部分需要针对数据库覆盖默认实现,参考:2.1.4 重写继承接口的定义