首页 > 其他分享 >MyBatis流式查询

MyBatis流式查询

时间:2022-10-07 18:35:25浏览次数:75  
标签: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
From: https://blog.51cto.com/u_15736642/5734846

相关文章

  • QGIS实现PostGIS数据库查询并返回新图层
    QGIS上传图层到PostgreSQL数据库1.数据准备2.在指定图层右键选择​​执行SQL​​弹出SQL语句输入界面窗口3.查询高度为10的要素(这里的语句因数据而异)SELECT*FROM"publ......
  • union合并查询结果集
    案例:查询工作岗位是MANAGER和SALESMAN的员工selectename,jobfromempwherejob='MANAGER'orjob='SALESMAN';selectename,jobfromempwherejobin('MANAG......
  • 子查询
    什么是子查询select语句中嵌套select语句,被嵌套的select语句称为子查询子查询都可以出现在哪里?select..(select).from..(select).where..(select).where子句......
  • 基于jprofiler 的一个简单dremio 查询处理学习
    一个dremio查询简单调用链的说明参考命令arthaswatchwatchcom.dremio.sabot.exec.fragment.FragmentExecutor$AsyncTaskImplrun'{params,target,returnObj,throwExp......
  • SpringBoot集成MyBatis(详细)
    前言JPA和MyBatis,JPA是SpringBoot官方的,前身就是著名的三大框架之一的Hibernate,好处是不用手写SQL(当然它也支持手写,如果必要的话),而MyBatis灵活性非常高,但是需要手写SQL语......
  • MyBatis框架:第八章:自定义结果集,一对一,一对多,延迟加载,赖加载
    13.1、自定义结果集介绍自定义结果集,可以给复杂的对象使用。也就是对象内又嵌套一个对象。或者一个集合。在这种情况下。前面学过的知识点,已经无法直接获取出对象内对象......
  • distinct关键字、连接查询
    把查询结果去除重复记录注意:原表数据不会被修改,只是查询结果去重去重需要使用一个关键字:distinct//只能出现在所有字段的最前方什么是连接查询从一张表中单独查询,称......
  • MyBatis框架:第九章:动态SQL语句
    准备工作:publicclassUser{privateintid;privateStringlastName;privateintsex;14.1、if语句说明:if语句,可以动态的根据你的值来决定,是否需要动态的添加查......
  • 3、spring+mybatis关联映射(无mapper实现类)+idea+maven
    该工程采用spring+mybatis的关联映射,动态sql,sql片段实现1、搭建项目结构如下  2、配置项目的pom.xml文件中的依赖1<?xmlversion="1.0"encoding="UTF-8"?>23<proj......
  • 2、spring+mybatis注解(无mapper实现类)+idea+maven
    1、在idea中配置database连接数据库,用来在idea中编写sql脚本操作数据库         2、sql详细脚本如下:1--1.创建部门表2createtabledept3(4deptnoint......