MyBatis-Plus流式查询的实现示例

 更新时间:2024年12月13日 09:14:18   作者:咕德猫宁丶  
MyBatis-Plus 从 3.5.4 版本开始支持流式查询,通过ResultHandler接口实现结果集的流式查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在使用 MyBatis-Plus 进行流式查询时,通常是为了处理大量数据而避免一次性加载所有数据到内存中,从而减少内存消耗并提高性能。

MyBatis-Plus 从 3.5.4 版本开始支持流式查询,这是 MyBatis 的原生功能,通过 ResultHandler 接口实现结果集的流式查询。这种查询方式适用于数据跑批或处理大数据的业务场景。

在 BaseMapper 中,新增了多个重载方法,包括 selectList, selectByMap, selectBatchIds, selectMaps, selectObjs,这些方法可以与流式查询结合使用。

需要注意的是,在低版本的 MyBatis-Plus 中,如果自定义 ResultHandler 结合分页查询,可能会出现错误。在这种情况下,需要手动关闭 count 查询。

使用示例

批量数据录入

刚好顺便学习下mybatisplus 批量数据录入

数据准备  10万条数据

@Autowired
	private MybatisUserService mybatisUserService;

	@Test
	void contextLoads() {
		List<MybatisUser> mybatisUsers = new ArrayList<>();
		for (int i = 0; i < 100000; i++) {
			MybatisUser mybatisUser = new MybatisUser();
			mybatisUser.setId(i);
			mybatisUser.setName("A"+i);
			mybatisUser.setSex(SexEnum.MAN);
			mybatisUsers.add(mybatisUser);
		}
		mybatisUserService.insertBatch(mybatisUsers);
	}

MybatisBatch方式

 // 记录开始时间,用于计算执行耗时
        long startTime = System.nanoTime(); // 使用 nanoTime 获取更精确的时间

        // 创建 MybatisBatch 对象,用于执行批量操作
        MybatisBatch<MybatisUser> mybatisBatch = new MybatisBatch<>(sqlSessionFactory, mybatisUser);
        // 创建 MybatisBatch.Method 对象,指定具体的操作方法
        MybatisBatch.Method<MybatisUser> method = new MybatisBatch.Method<>(MybatisUserDao.class);
        // 执行插入操作
        mybatisBatch.execute(method.insert());

        // 记录结束时间,用于计算执行耗时
        long endTime = System.nanoTime(); // 获取结束时间

        // 计算执行时间并打印
        long executionTime = endTime - startTime;
        System.out.println("Execution time: " + executionTime + " nanoseconds");

SQL values方式

    @Insert("<script>" +
            "INSERT INTO `mybatis_user`(`id`, `name`, `sex`) " +
            "VALUES " +
            "<foreach collection= 'list' item= 'item' separator= ','> " +
            "(#{item.id},#{item.name},#{item.sex})" +
            "</foreach></script>")
    int insertBatchSql(@Param("list") List<MybatisUser> list);

 虽然插入很快,但是不是特别推荐,当实体数据过多的时候,sql拼接可能会出问题。

推荐的话 还是用多线程来分批插入。

流式查询

/**
     * 选择并处理数据库中的所有用户记录
     * 此方法使用baseMapper从数据库中选择所有用户记录,并使用ResultHandler进行处理
     * 每处理一条记录,都会在控制台输出当前记录的信息
     */
    public void selectAll() {
        // 从数据库获取表所有记录,做数据处理
        baseMapper.selectList(Wrappers.emptyWrapper(), new ResultHandler<MybatisUser>() {
            // 初始化计数器,用于记录当前处理的记录数
            int count = 0;
    
            /**
             * 处理查询结果
             * 此方法在查询到每条记录时被调用,用于处理单个查询结果
             * @param resultContext 包含查询结果的上下文
             */
            @Override
            public void handleResult(ResultContext<? extends MybatisUser> resultContext) {
                // 获取当前处理的用户记录
                MybatisUser mybatisUser = resultContext.getResultObject();
                // 在控制台输出当前处理的记录信息
                System.out.println("当前处理第" + (++count) + "条记录: " + mybatisUser);
            }
    
        });
    
    }

下面是一下常用方法

  • getResultObject: 获取数据库中的每一条记录。
  • getResultCount: 获取当前处理的结果集条数,每处理一条记录,该计数器会加1,计数从1开始。
  • stop: 停止继续处理结果集,相当于在循环中使用 break 语句。

比如当我们需要导出大量数据的情况下,使用普通查询导出是因为一次性把所有数据查询出来放在集合中,这时候垃圾处理器释放不了这一部分内存,如果内存不够就会使程序挂掉。使用mybatis-plus的流式查询, 一边查询一边导出 ,这样用过的数据写入流之后垃圾处理器回收掉内存空间,使内存得到合理应用 。

到此这篇关于MyBatis-Plus流式查询的实现示例的文章就介绍到这了,更多相关MyBatis-Plus流式查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Spring 自定义propertyEditor的示例代码

    Spring 自定义propertyEditor的示例代码

    这篇文章主要介绍了Spring 自定义propertyEditor的示例代码,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • MySQL+SSM+Ajax上传图片问题

    MySQL+SSM+Ajax上传图片问题

    本文主要介绍了MySQL+SSM+Ajax上传图片问题。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • kaptcha验证码使用方法详解

    kaptcha验证码使用方法详解

    这篇文章主要为大家详细介绍了kaptcha验证码的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Java file.delete删除文件失败,Windows磁盘出现无法访问的文件问题

    Java file.delete删除文件失败,Windows磁盘出现无法访问的文件问题

    这篇文章主要介绍了Java file.delete删除文件失败,Windows磁盘出现无法访问的文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Java中的单例模式详解(完整篇)

    Java中的单例模式详解(完整篇)

    Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显,下面这篇文章主要给大家介绍了关于Java中单例模式的相关资料,需要的朋友可以参考下
    2021-11-11
  • SpringBoot自定义注解之实现AOP切面日志详解

    SpringBoot自定义注解之实现AOP切面日志详解

    这篇文章主要为大家详细介绍了SpringBoot自定义注解之实现AOP切面统一打印出入参日志,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Java中的Caffeine加载与驱逐策略详解

    Java中的Caffeine加载与驱逐策略详解

    这篇文章主要介绍了Java中的Caffeine加载与驱逐策略详解,Caffeine是基于Java 8的高性能缓存库,可提供接近最佳的命中率,Caffeine与ConcurrentMap相应,但是不完全相同,本文主要介绍Caffeine,需要的朋友可以参考下
    2023-10-10
  • IDEA自带Maven插件找不到settings.xml配置文件

    IDEA自带Maven插件找不到settings.xml配置文件

    IDEA自带了Maven插件,最近发现了一个问题,IDEA自带Maven插件找不到settings.xml配置文件,本文就来详细的介绍一下解决方法,感兴趣的可以了解一下
    2023-11-11
  • 一篇文章带你了解Java SpringMVC返回null

    一篇文章带你了解Java SpringMVC返回null

    这篇文章主要介绍了Spring MVC返回null,文中讲的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-10-10
  • SpringBoot完整实现滑块拼图验证+轨迹验证+Redis分布式方案

    SpringBoot完整实现滑块拼图验证+轨迹验证+Redis分布式方案

    滑块拼图验证是一种行为验证技术,通过要求用户将拼图块拖动到正确位置来区分人类用户和自动化程序,本文介绍SpringBoot完整实现滑块拼图验证+轨迹验证+Redis分布式方案,感兴趣的朋友跟随小编一起看看吧
    2026-03-03

最新评论