ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MyBatis流式查询

2022-06-16 00:02:58  阅读:145  来源: 互联网

标签:cursor 流式 查询 Cursor test limit MyBatis


转自:

http://www.java265.com/JavaFramework/MyBatis/202206/3614.html

下文笔者讲述Mybatis流式查询的相关简介说明,如下所示

Mybatis流式查询简介

流式查询简介:
   我们将MyBatis返回数据为一个迭代器,这种查询模式称之为“流式查询”
流式查询的返回值:
   使用迭代器逐条的遍历数据

流式查询注意事项:
   流式查询过程中
    数据库连接必须保持一直打开
     并且执行完查询后需要手动的关闭数据库连接

MyBatis流式查询接口

MyBatis提供了
org.apache.ibatis.cursor.Cursor 的接口类用于流式查询
此接口继承了 java.io.Closeable 和 java.lang.Iterable 接口
所以Cursor 是可关闭/遍历的。

Cursor常见的方法

方法名 备注
isOpen() 用于在取数据之前判断 Cursor 对象是否是打开状态,只有当打开时 Cursor 才能取数据
isConsumed() 用于判断查询结果是否全部取完
getCurrentIndex() 返回已经获取了多少条数据

使用 Cursor 流式接口

 @Mapper
public interface TestMapper {
   @Select("select * from test limit #{limit}")
   Cursor<Test> scan(@Param("limit") int limit);
}


@GetMapping("test/1/{limit}")
public void testFun(@PathVariable("limit") int limit) throws Exception {
   try (
       SqlSession sqlSession = sqlSessionFactory.openSession();  // 1
       Cursor<Test> cursor =
             sqlSession.getMapper(TestMapper.class).scan(limit)   // 2
  ) {
       cursor.forEach(Test -> { });
  }
}
上述代码1位置
  开启一个SqlSession(实际上也代表了一个数据库连接)
  并保证它最后能关闭
  2位置
  使用 SqlSession 来获得 Mapper 对象
  采用以上模式能保证得到的 Cursor 对象是打开状态的。

2.事务控制 TransactionTemplate
在 Spring 中,可以用 TransactionTemplate 来执行一个数据库事务 

@GetMapping("test/2/{limit}")
public void testFun(@PathVariable("limit") int limit) throws Exception {
   TransactionTemplate transactionTemplate =
           new TransactionTemplate(transactionManager);  // 1

   transactionTemplate.execute(status -> {               // 2
       try (Cursor<Test> cursor = TestMapper.scan(limit)) {
           cursor.forEach(test -> { });
      } catch (IOException e) {
           e.printStackTrace();
      }
       return null;
  });
}
上面的代码中1处创建了一个 TransactionTemplate 对象
2处执行数据库事务
而数据库事务的内容则是调用Mapper对象的流式查询
注意这里的 Mapper 对象无需通过 SqlSession 创建

事务控制 @Transactional 注解
这个本质上和方案二一样,代码如下:

@GetMapping("test/3/{limit}")
@Transactional
public void test(@PathVariable("limit") int limit) throws Exception {
   try (Cursor<Test> cursor = TestMapper.scan(limit)) {
       cursor.forEach(test -> { });
  }
}

标签:cursor,流式,查询,Cursor,test,limit,MyBatis
来源: https://www.cnblogs.com/java265/p/16337106.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有