mybatis如何对大量数据的游标查询

 更新时间:2024年01月27日 09:26:34   作者:喵主子  
这篇文章主要介绍了mybatis如何对大量数据的游标查询问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

mybatis对大量数据的游标查询

mapper定义

@Mapper
public interface NewsRepository {
 
    String simpleQuery="select news.id,news.title,news.keywords," +
            "    news.url,news.author," +
            "    data.content,news.inputtime,news.updatetime " +
            " from news news join news_data data on news.id=data.id";
 
    /**
     * 使用游标查询数据数据
     * @return
     */
  
    @Select(value = simpleQuery +
            " where status=1" +
            " order by news.id asc")
    @Options(fetchSize = Integer.MIN_VALUE)//mysql情况比较特殊,只能这样设置
    Cursor<News> scrollResult();
 
}

service内使用

Cursor<News> cursor= repository.scrollResult();
Iterator<News> iter= cursor.iterator();
int count=0;
while (iter.hasNext()){
     System.err.println(iter.next().title);
     ..........
}

mybatis游标查询 org.apache.ibatis.cursor.Cursor

先说使用场景:针对超大数据,内存不够存储数据。

假设有一个1千万的日志数据,需要将这一千万的数据,全部都清洗一遍,从每一条的数据中查询出匹配的有效数据,且不能修改原始数据。

第一种办法

一次性查出来,内存不够,而且会很慢,不可取。

这种方法就直接放弃。

第二种办法

分页查询, 每次查询1000条,每次处理完后,再分页查询。

这种分页查询,分页会很慢,除非是有索引id,通过顺序读取,还有可以优化一下。

第三种办法

游标查询 org.apache.ibatis.cursor.Cursor

数据库查询DAO

TempStudent 数据POJO

  @Select(" SELECT * FROM temp_student ")
   Cursor<TempStudent> findListForCursor();

查询的service

    @Transactional
    public void scanTempStudent() {
        Cursor<TempStudent> cursor = tempStudentDao.findListForCursor();
        
        cursor.forEach(foo -> {
            System.out.println(foo.getId() + ":" + foo.getName());
        });
    }

特别注意,需要加上一个注解 Transactional, 事物的注解

为什么呢?

在取数据的过程中需要保持数据库连接,而 Mapper 方法通常在执行完后连接就关闭了,因此 Cusor 也一并关闭了,所以加上了事物保障就可以

Spring 框架当中注解使用的坑:只在外部调用时生效。在当前类中调用这个方法,依旧会报错。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 如何使用Java生成PDF文档详解

    如何使用Java生成PDF文档详解

    这篇文章主要给大家介绍了关于如何使用Java生成PDF文档的相关资料,PDF是可移植文档格式,是一种电子文件格式,具有许多其他电子文档格式无法相比的优点,需要的朋友可以参考下
    2023-07-07
  • Java基于redis实现分布式锁

    Java基于redis实现分布式锁

    系统的不断扩大,分布式锁是最基本的保障。今天我们介绍通过redis实现分布式锁,感兴趣的朋友可以参考下
    2021-05-05
  • Springboot整合Dubbo+Nacos实现RPC调用的示例代码

    Springboot整合Dubbo+Nacos实现RPC调用的示例代码

    随着互联网技术的飞速发展,越来越多的企业和开发者开始关注微服务架构,Nacos是阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台,本文讲解如何将Spring Boot与Dubbo和Nacos整合,实现RPC调用,需要的朋友可以参考下
    2024-02-02
  • 详解@ConditionalOnMissingBean注解的作用

    详解@ConditionalOnMissingBean注解的作用

    这篇文章主要介绍了详解@ConditionalOnMissingBean注解的作用,@ConditionalOnMissingBean,它是修饰bean的一个注解,主要实现的是,当你的bean被注册之后,如果而注册相同类型的bean,就不会成功,它会保证你的bean只有一个,需要的朋友可以参考下
    2023-10-10
  • SpringCloud微服务基础简介

    SpringCloud微服务基础简介

    今天带大家学习一下SpringCloud微服务的相关知识,文中有非常详细的图文示例及介绍,对正在学习SpringCloud微服务的小伙伴们很有帮助哦,需要的朋友可以参考下
    2021-05-05
  • Java实现视频时间维度剪切的工具类

    Java实现视频时间维度剪切的工具类

    这篇文章主要为大家详细介绍了将视频按照时间维度进行剪切的Java工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • Spring Cloud Zuul添加过滤器过程解析

    Spring Cloud Zuul添加过滤器过程解析

    这篇文章主要介绍了Spring Cloud Zuul添加过滤器过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 基于Docker的K8s(Kubernetes)集群部署方案

    基于Docker的K8s(Kubernetes)集群部署方案

    这篇文章主要介绍了基于Docker的K8s(Kubernetes)集群部署方案,文中介绍了安装k8s的可视化界面的相关操作,需要的朋友可以参考下
    2024-01-01
  • 全局记录Feign的请求和响应日志方式

    全局记录Feign的请求和响应日志方式

    这篇文章主要介绍了全局记录Feign的请求和响应日志方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • java中的按位与(&)用法说明

    java中的按位与(&)用法说明

    这篇文章主要介绍了java中的按位与(&)用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论