关于Mybatis使用collection分页问题

 更新时间:2021年11月23日 16:01:06   作者:FLY-DUCK  
项目中mybatis分页的场景是非常高频的,当使用ResultMap并配置collection做分页的时候,我们可能会遇到获取当前页的数据少于每页大小的数据问题。接下来通过本文给大家介绍Mybatis使用collection分页问题,感兴趣的朋友一起看看吧

项目中mybatis分页的场景是非常高频的,当使用ResultMap并配置collection做分页的时候,我们可能会遇到获取当前页的数据少于每页大小的数据问题。使用PagerHelper插件同样会遇到该问题。

原因

引起该问题的原因是当我们使用的是ResultMap集合的嵌套结果映射来处理通过join查询的结果集,映射成Java实体类型的时候,会导致主数据被映射折叠后少于从数据库获取的数据,从而导致获取的映射数据少于每页大小的数据。

方案

方案一

不使用集合的嵌套结果映射,使用集合的嵌套select查询解决。使用该方案需要注意性能问题,会导致“N+1查询问题”。

这种方式虽然很简单,但在大型数据集或大型数据表上表现不佳。这个问题被称为“N+1 查询问题”。 概括地讲,N+1 查询问题是这样子的:

你执行了一个单独的 SQL 语句来获取结果的一个列表(就是“+1”)。对列表返回的每条记录,你执行一个 select 查询语句来为每条记录加载详细信息(就是“N”)。

这个问题会导致成百上千的 SQL 语句被执行。有时候,我们不希望产生这样的后果。

好消息是,MyBatis 能够对这样的查询进行延迟加载,因此可以将大量语句同时运行的开销分散开来。 然而,如果你加载记录列表之后立刻就遍历列表以获取嵌套的数据,就会触发所有的延迟加载查询,性能可能会变得很糟糕。

方案二

移除collection配置,在业务逻辑中进行处理。先将参与分页的数据获取出来,再根据需要在业务代码中获取分页数据关联的数据。博主更倾向于这种方案解决mybatis中collection分页问题。

扩展

Mybatis中配置加载一对多关系的两种方式:

1.集合的嵌套 Select 查询

一共会产生两个SQL语句,一个查询主的数据,另一个查询关联的数据。如下所示:

<resultMap id="blogResult" type="Blog">
  <collection property="posts" javaType="ArrayList" column="id" ofType="Post" select="selectPostsForBlog"/>
</resultMap>
 
<select id="selectBlog" resultMap="blogResult">
  SELECT * FROM BLOG WHERE ID = #{id}
</select>
 
<select id="selectPostsForBlog" resultType="Post">
  SELECT * FROM POST WHERE BLOG_ID = #{id}
</select>

2.集合的嵌套结果映射

只会产品一个SQL语句,主数据以及关联数据通过别名的形式进行配置映射到各自的对象的属性上。入戏所示:

<resultMap id="blogResult" type="Blog">
  <id property="id" column="blog_id" />
  <result property="title" column="blog_title"/>
  <collection property="posts" ofType="Post" resultMap="blogPostResult" columnPrefix="post_"/>
</resultMap>
 
<resultMap id="blogPostResult" type="Post">
  <id property="id" column="id"/>
  <result property="subject" column="subject"/>
  <result property="body" column="body"/>
</resultMap>

参考:

官方Mybatis高级结果映射ResultMap介绍与使用(包含collection使用)

PageHelper插件重要提示(分页插件不支持嵌套结果映射)

mybatis resultMap之collection聚集两种实现方式

到此这篇关于Mybatis使用collection分页问题的文章就介绍到这了,更多相关Mybatis collection分页内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • IDEA中的.iml文件和.idea文件的作用及意义

    IDEA中的.iml文件和.idea文件的作用及意义

    iml是 项目标识文件,每一个模块都有一个iml文件,存储模块的相关信息,跟eclipse的project文件是一样的功能,这篇文章主要介绍了IDEA中的.iml文件和.idea文件的作用,需要的朋友可以参考下
    2023-09-09
  • JpaRepository 实现简单条件查询

    JpaRepository 实现简单条件查询

    这篇文章主要介绍了JpaRepository 实现简单条件查询,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java并发之ArrayBlockingQueue详细介绍

    java并发之ArrayBlockingQueue详细介绍

    这篇文章主要介绍了java并发之ArrayBlockingQueue详细介绍的相关资料,需要的朋友可以参考下
    2017-05-05
  • JavaWeb Struts文件上传功能实现详解

    JavaWeb Struts文件上传功能实现详解

    这篇文章主要为大家详细介绍了JavaWeb Struts文件上传功能实现过程,思路清晰,供大家参考,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • 解决Springboot2.1.x配置Activiti7单独数据源问题

    解决Springboot2.1.x配置Activiti7单独数据源问题

    这篇文章主要介绍了Springboot2.1.x配置Activiti7单独数据源问题,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Java的项目构建工具Maven的配置和使用教程

    Java的项目构建工具Maven的配置和使用教程

    Maven是Java世界中的项目管理和构建自动化工具,基于POM项目对象模型的思想,下面我们就具体来看一下具体的Java的项目构建工具Maven的配置和使用教程:
    2016-05-05
  • SpringBoot居然有44种应用启动器,你都知道吗

    SpringBoot居然有44种应用启动器,你都知道吗

    很多人都不知道SpringBoot应用启动器竟然有44个,本文就一起来介绍一下,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-01-01
  • 使用spring aop统一处理异常和打印日志方式

    使用spring aop统一处理异常和打印日志方式

    这篇文章主要介绍了使用spring aop统一处理异常和打印日志方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java将中文转化为拼音的简单代码示例

    Java将中文转化为拼音的简单代码示例

    在我们使用手机通讯录或各种APP的搜索功能时,既可以根据中文搜索,也可以根据拼音搜索,这种时候就使用到了中文转拼音的功能了,下面这篇文章主要给大家介绍了关于Java将中文转化为拼音的简单代码示例,需要的朋友可以参考下
    2024-03-03
  • Spring @Value 设置默认值的实现

    Spring @Value 设置默认值的实现

    这篇文章主要介绍了Spring @Value 设置默认值的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09

最新评论