Mybatis一对多查询,分页显示问题解决方案

news2024/12/23 10:27:00

原文:Mybatis一对多查询,分页显示问题解决方案_mybatis一对多分页问题-CSDN博客

在我们的开发中也许是遇到最多的功能,一张表的分页,多张表一对一功能的分页相信大家写来都是得心应手,但是在一对多分页查询的时候大家写法不对的时候,可能会遇到查询的总条数和实际总条数对不上的问题。不多说下面请看演示。

1:先提供2张表的建表SQL如下【使用的是Mysql】:

CREATE TABLE `School`(  
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(100) COMMENT '学校名称',
  `create_date` DATE,
  `create_by` VARCHAR(20),
  PRIMARY KEY (`id`)
);
 
CREATE TABLE `class`(  
  `id` INT NOT NULL AUTO_INCREMENT,
  `school_id` INT COMMENT 'school表的主键,进行逻辑关联',
  `class_name` VARCHAR(20) COMMENT '班级名称。。',
  `create_date` DATE,
  `create_by` VARCHAR(20),
  PRIMARY KEY (`id`)
);

2:初始化的语句。

INSERT INTO School (NAME,create_date,create_by) VALUES('上海交通大学',NOW(),'admin');
INSERT INTO School (NAME,create_date,create_by) VALUES('复旦',NOW(),'admin');
INSERT INTO School (NAME,create_date,create_by) VALUES('同济',NOW(),'admin');
INSERT INTO class  (school_id,class_name,create_date,create_by) VALUES((SELECT * FROM (SELECT id FROM school WHERE NAME='上海交通大学') a),'计算机一班',NOW(),'admin');
INSERT INTO class  (school_id,class_name,create_date,create_by) VALUES((SELECT * FROM (SELECT id FROM school WHERE NAME='上海交通大学') a),'计算机二班',NOW(),'admin');
INSERT INTO class  (school_id,class_name,create_date,create_by) VALUES((SELECT * FROM (SELECT id FROM school WHERE NAME='复旦') a),'通信学院一班',NOW(),'admin');
INSERT INTO class  (school_id,class_name,create_date,create_by) VALUES((SELECT * FROM (SELECT id FROM school WHERE NAME='复旦') a),'通信学院二班',NOW(),'admin');
INSERT INTO class  (school_id,class_name,create_date,create_by) VALUES((SELECT * FROM (SELECT id FROM school WHERE NAME='同济') a),'建筑学院一班',NOW(),'admin');
INSERT INTO class  (school_id,class_name,create_date,create_by) VALUES((SELECT * FROM (SELECT id FROM school WHERE NAME='同济') a),'建筑学院二班',NOW(),'admin');

然后初始化一个简单的项目,注意还是 Spring boot 加Mybatis-Plus。我的这篇文章介绍的Mybatis-Plus初始化简单项目非常不错,欢迎阅读。

 好了我把主要的代码贴出来。

// 首先是最基础的mapper文件,最主要的代码就在这里了,一对多很多人都
 // 这样写,但是如果涉及到分页,这样写就不对了,后面会有结果演示。
 <resultMap type="io.renren.dto.SchoolDTO" id="schoolMap">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <collection property="classDtos" ofType="io.renren.dto.ClassDTO">
            <id property="id" column="id"></id>
            <result property="schoolId" column="school_id"></result>
            <result property="className" column="class_name"></result>
        </collection>
    </resultMap>
    
    <select id="querySchoolByPage"  resultMap="schoolMap">
    SELECT a.id,a.name,b.id,b.school_id,b.class_name FROM school a JOIN class b ON a.id=b.school_id
    <where>
        <if test="query!=null">
            <if test="query.name!=null and query.name!=''">
                a.name=#{query.name}
            </if>
        </if>
    </where>
    </select>
  
  // 2: mapper接口
  public interface SchoolDao extends BaseMapper<School> {
    // 使用的是Mybatis-Plus的分页插件,按照Mybatis-Plus的规则传参
    // 就会自动进行分页拦截
    IPage querySchoolByPage(IPage iapge, @Param("query") SchoolQuery query);  
}
// 相关的Service和controller
public interface SchoolService extends IService<School> {  
    IPage<SchoolDTO> querySchoolByPage(IPage<?> page, SchoolQuery query) ;
    
}
@Service("schoolService")
public class SchoolServiceImpl extends ServiceImpl<SchoolDao, School> implements SchoolService {
 
    @Autowired
    private SchoolDao schoolDao ;
 
    @Override
    public IPage<SchoolDTO> querySchoolByPage(IPage<?> page, SchoolQuery query) {
        return schoolDao.querySchoolByPage(page,query);
    }
}
 
// 里面的Query这个类只要你按照我上面引用的那个文章,下载相关代码
// 就能看到这个类,由于这个类代码太多也不是主要讲的我就不贴出来了。
// 注意Query这个类开发中你也可以自己封装一个更好的类。由于这里不是注意讲
// Mybatis-Plus的我就按照Query这个类给大家展示了。
// 封装起来也很容易按照相应的规则就可以了。
@RestController
@RequestMapping("/school")
public class SchoolController {
    @Autowired
    private SchoolService schoolService ;
    @PostMapping("/query")
    // 这里我使用Map接收参数,开发的时候自己要建一个类,不要使用Map
    public IPage<SchoolDTO>  querySchool(@RequestBody Map<String,Object> params){
        return  schoolService.querySchoolByPage(new Query<SchoolQuery>().getPage(params),
                null); // 为了演示直接传一个null,不需要查询条件,只要分页参数
    }
}

好了我们使用PostMan测试一下如下图:

 显示的结果如下图:

从上面我们SQL初始化的数据知道School这个表我们就初始化了3条数据,但是给的总的结果是6条,这个是不对的。我们查询的时候每页要查2条数据而显示的结果只要1条数据也不是我们要的结果,所以上面的SQL用来分页查询是不对的,后面就带大家写出正确的SQL。

如下其实就是改一下mapper文件中的sql就行了。其原理就是Mybatis的懒加载,先查询出来School,这个单表查询分页肯定没问题,然后再根据条件查询Class,如下SQL也是比较简单的。
 

 
<!-- 可根据自己的需求,是否要使用 -->
    <resultMap type="io.renren.dto.SchoolDTO" id="schoolMap">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <collection property="classDtos" ofType="io.renren.dto.ClassDTO" column="id=id" select="selectClassBySchoolId">
            <id property="id" column="id"></id>
            <result property="schoolId" column="school_id"></result>
            <result property="className" column="class_name"></result>
        </collection>
 
    </resultMap>
    <select id="querySchoolByPage"  resultMap="schoolMap">
    SELECT a.id,a.name  FROM school a
    <where>
        <if test="query!=null">
            <if test="query.name!=null and query.name!=''">
                a.name=#{query.name}
            </if>
        </if>
    </where>
    </select>
 
    <select id="selectClassBySchoolId" resultType="io.renren.dto.ClassDTO">
        select * from class where school_id=#{id}
    </select>

然后使用Postman测试结果如下:

查询第一页,每页显示2条数据,查出来的结果也是完全满足我们的要求,也和我们数据库初始化的总条数一样,一共3条数据【PS上面的Mapper中SQL的写法对ORACLE同样可以使用,因为这次它两个的语法规则是一样的】。

好了读完这篇文章我感觉开发中再遇到一对多的分页查询对你来说很容易了,所以麻烦点点小手关注一下,后面你在开发过程中遇到同样的问题,拿出文章看一下对照着写,很容易就写出来了也不会有问题。也欢迎转发给你感觉可能会使用这个功能的朋友,分享给朋友手留余香【因为赠人玫瑰,手留余香】。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1139419.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Ubuntu18.04】激光雷达与相机联合标定(Livox+HIKROBOT)(一)相机内参标定

LivoxHIKROBOT联合标定——相机内参标定 引言1 海康机器人HIKROBOT SDK二次开发并封装ROS1.1 介绍1.2 安装MVS SDK1.3 封装ROS packge 2 览沃Livox SDK二次开发并封装ROS3 相机雷达联合标定——相机内参标定3.1 环境配置3.1.1 安装依赖——PCL 安装3.1.2 安装依赖——Eigen 安装…

【表面缺陷检测】钢轨表面缺陷检测数据集介绍(2类,含xml标签文件)

一、介绍 钢轨表面缺陷检测是指通过使用各种技术手段和设备&#xff0c;对钢轨表面进行检查和测量&#xff0c;以确定是否存在裂纹、掉块、剥离、锈蚀等缺陷的过程。这些缺陷可能会对铁路运输的安全和稳定性产生影响&#xff0c;因此及时进行检测和修复非常重要。钢轨表面缺陷…

GaussDB SQL基础语法示例-BOOLEAN表达式

目录 一、前言 二、GaussDB SQL 中的BOOLEAN表达式介绍 1、概念 2、组成 3、语法示例 三、在GaussDB SQL中的基础应用 1、示例1&#xff0c;使用比较运算符 2、示例2&#xff0c;使用逻辑运算符 3、示例3&#xff0c;使用IS NOT NULL运算符 4、示例4&#xff0c;使用…

vscode安装包下载——vscode的下载速度慢问题两种解决方法

1.vscode下载&#xff1a; 1.首先我们去官网下载vccode&#xff0c;下载过程非常慢&#xff1a; 官网链接&#xff1a; https://code.visualstudio.com/ 2.解决办法1 这是因为国外镜像地址下载慢的原因&#xff0c;此时需要去国内镜像地址进行下载&#xff0c;复制下载链接&…

【Andriod】使用adb命令安装和卸载apk的通用python脚本

文章目录 1.前言2.连接设备3.从本机通过adb安装apk4.从本机通过adb卸载apk 1.前言 如不会使用adb请看之前的文章 【Andriod】adb调试安卓手机时连接真机或模拟器的3种方法&#xff0c;你知道么&#xff1f; 2.连接设备 import os # python标准库中的os模块""&qu…

互动直播UI设置 之 主播UI

目录 一、普通模式下&#xff0c;布局选项 1、布局按钮 1&#xff09;、点击布局按钮 2&#xff09;、选择哪种布局后&#xff0c;主进程通过WM_COPYDATA 发送信息 2、duilib样式布局文件 1&#xff09;、主画面 2&#xff09;、连麦者画面 3、主画面自动调整宽度 1&a…

UnrealSynth - 基于虚幻引擎的YOLO合成数据生成器

UnrealSynth虚幻合成数据生成器利用虚幻引擎的实时渲染能力搭建逼真的三维场景&#xff0c;为YOLO等AI模型的训练提供自动生成的图像和标注数据&#xff0c;官方下载地址&#xff1a;UnrealSynth虚幻合成数据生成器。 UnrealSynth生成的合成数据可用于深度学习模型的训练和验证…

18.3 NPCAP 构建中间人攻击

ARP欺骗&#xff08;ARP Spoofing&#xff09;是一种网络攻击手段&#xff0c;其目的是通过欺骗目标主机来实现网络攻击。ARP协议是一种用于获取MAC地址的协议&#xff0c;因此欺骗者可以使用ARP欺骗来迫使其目标主机将网络流量发送到攻击者控制的设备上&#xff0c;从而实现网…

error LNK2019: 无法解析的外部符号

文章目录 1 问题2 出现该问题的原因和解决方法2.1 原因&#xff1a;2.3 解决方法&#xff1a;需要查看一下项目的属性配置是否正确&#xff1a; 3 其他可能得原因&#xff0c;但是本项目中没有出现 1 问题 在测试base64代码的时候&#xff0c;VS2022提示我错误如下&#xff1a…

Julia数值计算初步

文章目录 复数系统运算符三角函数指数、对数、取整 Julia系列&#xff1a;编程初步&#x1f525;数组 Julia作为主打数值计算的编程语言&#xff0c;对一些常用的计算函数提供了非常细致的支持&#xff0c;十分人性化&#xff0c;体验之后爱不释手。 复数系统 在Juli中&…

笔记本怎么录屏?这3个方法请你收好

在现代教育、工作和演示中&#xff0c;屏幕录制成为了无可替代的工具。它使我们能够捕捉电脑屏幕上的一切&#xff0c;从PPT演示到教程制作&#xff0c;再到技术支持。因此&#xff0c;选择合适的录屏工具显得尤为重要。本文将详细介绍笔记本怎么录屏的3个方法&#xff0c;这些…

软件绘制 硬件加速绘制 【DisplayList RenderNode】

Android4.0以后&#xff0c;系统默认开启硬件加速来渲染视图 异同点 共同点 两者都是从SF获取一块内存&#xff0c;绘制都是在APP端&#xff0c;绘制好后都是通知SF去进行合成图层 真正的区别 真正的区别&#xff1a;绘制是通过CPU还是GPU完成的视图绘制。 对应区别在代码中的体…

SpringBoot整合Gateway 的Demo(附源码)

源码&#xff0c;可直接下载 Gateway模块 Gateway 的父pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sc…

学习嵌入式可以胜任哪一些行业?

今日话题&#xff0c;学习嵌入式可以胜任哪一些行业&#xff1f;学习嵌入式开发可以胜任许多行业&#xff0c;因为嵌入式技术在各个领域都有广泛的应用。嵌入式系统用于医疗设备、患者监测系统、药物分发设备等。智能手机、智能家居设备、游戏机等消费电子产品都包含嵌入式系统…

RocketMQ mmap原理和使用

传统文件IO 普通的IO操作的一个弊端&#xff0c;必然涉及到两次数据拷贝操作&#xff0c;对磁盘读写性能是有影响的。 那么如果我们要将一些数据写入到磁盘文件里去呢&#xff1f; 那这个就是一样的过程了&#xff0c;必须先把数据写入到用户进程空间里去&#xff0c;然后从这里…

网络时代下的声音之路:如何在中央新闻媒体发布网评稿

在当今数字时代&#xff0c;信息传播已经变得更加便捷和广泛。各大中央新闻媒体平台为民众提供了一个发布观点、表达意见的平台。在这个背景下&#xff0c;撰写并发布网评稿成为了一种重要的社会参与方式。根据媒介易软文发稿平台的总结&#xff0c;下面是探讨如何在各大中央新…

基于单片机的IC卡门禁系统设计

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、主要研究内容及总体设计方案1.1 系统方案设计1.2系统工作原理 二、硬件设计2.1 主控电路 三、软件设计3.2主程序设计实物附录1 原理图附录2 源程序清单 四、 结论五、 文章目录 概要 本论文重点通过对射频技术…

电脑上怎么录制视频教程带画笔工具?

无论你是创建教程、还是演示文稿&#xff0c;可能都希望使用带有画笔工具的录屏软件来帮助你创建吸引观众注意力的重要内容。幸运的是&#xff0c;有一些很棒的录屏软件可供你选择&#xff0c;本文就为你推荐一款带有画笔工具的最佳录屏软件&#xff0c;继续阅读查看吧&#xf…

明基、书客、小米的护眼台灯谁的更值得入手?三款台灯真实测评!

目前中国青少年近视占比是越来越高了&#xff0c;尤其是初中生更是重灾区。而现在看来小学阶段近视风险也有上升的趋势。所以&#xff0c;孩子在正式步入小学时&#xff0c;学习桌上不可或缺的就要放上一台好的且不错的护眼台灯。不过如今市面上的护眼台灯种类多到让人眼花缭乱…

Maven第三章:IDEA集成与常见问题

Maven第三章:IDEA集成与常见问题 前言 本章内容重点:了解如何将Maven集成到IDE(如IntelliJ IDEA或Eclipse)中,以及使用过程中遇到的常见的问题、如何解决,如何避免等,可以大大提高开发效率。 IEAD导入Maven项目 File ->Open 选择上一章创建的Maven项目 my-app查看po…