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 框架当中注解使用的坑:只在外部调用时生效。在当前类中调用这个方法,依旧会报错。

总结

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

相关文章

  • springBoot静态资源加载不到,并且配置了也不生效问题及解决

    springBoot静态资源加载不到,并且配置了也不生效问题及解决

    这篇文章总结了一个在Spring Boot 2.6.x版本中,由于路径匹配策略改变导致静态资源无法加载的问题,并提供了解决方案:通过配置类或在配置文件中设置路径匹配策略为AntPathMatcher,或者直接降级Spring Boot版本
    2025-02-02
  • SpringBoot全局异常处理之多个处理器匹配顺序(最新推荐)

    SpringBoot全局异常处理之多个处理器匹配顺序(最新推荐)

    这篇文章主要介绍了SpringBoot全局异常处理之多个处理器匹配顺序(最新推荐),调试源码可见匹配顺序为:异常层级高者优先,再清楚点,子类异常处理器优先,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-03-03
  • java虚拟机参数-D、-X和-XX的区别小结

    java虚拟机参数-D、-X和-XX的区别小结

    本文主要介绍了java虚拟机参数-D、-X和-XX的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Springboot中@RequestParam和@PathVariable的用法与区别详解

    Springboot中@RequestParam和@PathVariable的用法与区别详解

    这篇文章主要介绍了Springboot中@RequestParam和@PathVariable的用法与区别详解,RESTful API设计的最佳实践是使用路径参数来标识一个或多个特定资源,而使用查询参数来对这些资源进行排序/过滤,需要的朋友可以参考下
    2024-01-01
  • Java设计模式之工厂模式实现方法详解

    Java设计模式之工厂模式实现方法详解

    这篇文章主要介绍了Java设计模式之工厂模式实现方法,结合实例形式较为详细的分析了工厂模式的分类、原理、实现方法与相关注意事项,需要的朋友可以参考下
    2017-12-12
  • SpringBoot定制三种错误页面及错误数据方法示例

    SpringBoot定制三种错误页面及错误数据方法示例

    Spring Boot提供的默认异常处理机制通常并不一定适合我们实际的业务场景,因此,我们通常会根据自身的需要对Spring Boot全局异常进行统一定制,例如定制错误页面,定制错误数据等。本文主要介绍了SpringBoot三种自定义错误页面的实现,快来学习吧
    2021-12-12
  • Java中基于推、拉模式的sentinel规则持久化详解

    Java中基于推、拉模式的sentinel规则持久化详解

    这篇文章主要介绍了Java中基于推、拉模式的sentinel规则持久化详解,推模式是sentinelDashboard 把规则推给Nacos,Nacos监听规则的变化推给微服务,拉模式是sentinelDashboard 把规则直接给微服务, Nacos定时的同步微服务端的规则,需要的朋友可以参考下
    2023-09-09
  • 使用Java实现生命游戏串行代码示例

    使用Java实现生命游戏串行代码示例

    生命游戏是一种二维细胞自动机,由英国数学家在1970年发明,在游戏的过程中,细胞会形成各种有规律的结构,展现出生命的复杂性和多样性,本文通过java和JavaFX实现了一个简单的生命游戏,可以直观的观察到细胞的迭代过程,需要的朋友可以参考下
    2024-10-10
  • 全面解析Java中的HashMap类

    全面解析Java中的HashMap类

    HashMap类为Java提供了键值对应的map类型,本文将从源码角度全面解析Java中的HashMap类,同时包括其各种常用操作方法等,欢迎参考与借鉴
    2016-05-05
  • Java Scanner对象中hasNext()与next()方法的使用

    Java Scanner对象中hasNext()与next()方法的使用

    这篇文章主要介绍了Java Scanner对象中hasNext()与next()方法的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10

最新评论