Mybatis多对多查询+PageHelpler分页问题

2023-11-17

多对多查询

说明:tb_user用户表,tb_role角色表,tb_user_role用户角色关联表

  1. 实现表数据的多对多查询并返回
  2. 使用PageHelper对查询结果分页

在这里插入图片描述

  • 用户表
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("tb_user")
public class TbUser implements Serializable{
    private static final long serialVersionUID = 1L;
    @TableId(value = "uid", type = IdType.AUTO)
    private Integer uid;
    // 用户名称
    private String username;
    // 密码
    private String password;
    // 角色
    @TableField(exist = false)
    private List<TbRole> roles;
    // 创建时间
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    // 修改时间
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date updateTime;
}
  • 角色表
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@AllArgsConstructor
@TableName("tb_role")
public class TbRole implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @JsonProperty(value="rName")
    private String rName;
}

1、Mybatis实现多对多查询

  • Controller
    @GetMapping("infolist")
    public Result infolist() {
        List<TbUser> userPageInfo = userInfoService.select();
        return Result.success(200, "查询成功", userPageInfo);
    }
  • Service
public interface UserInfoService extends IService<TbUser> {
    List<TbUser> select();
}

// Impl
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, TbUser> implements UserInfoService {
    @Autowired
    private UserInfoMapper userInfoDao;
    @Override
    public List<TbUser> select() {
        List<TbUser> userList = userInfoDao.selectMap();
        return userList ;
    }
}
  • Mapper
@Mapper
public interface UserInfoMapper extends BaseMapper<TbUser> {
    List<TbUser> selectMap();
}
  • xml
<resultMap id="userList" type="com.server.entity.TbUser">
    <id property="uid" column="uid" jdbcType="INTEGER"></id>
    <result property="username" column="username"></result>
    <result property="createTime" column="create_time"></result>
    <result property="updateTime" column="update_time"></result>
    <collection property="roles" ofType="com.server.entity.TbRole">
        <id property="id" column="rid"></id>
        <result property="rName" column="r_name"></result>
    </collection>
</resultMap>
<select id="selectMap" resultMap="userList">
    select u.*,r.id rid,r.r_name
    from tb_user u
    left join tb_user_role ur on u.uid = ur.u_id
    left join tb_role r on ur.r_id = r.id
--         limit ${size} offset ${((num-1)*size).intValue()} 这里是分页先不考虑
</select>

在这里插入图片描述

2、Mybatis多对多PageHelper问题

2.1 介绍问题

先贴出官网问题
在这里插入图片描述
我们常用的分页方式(错误的分页方式)

  1. limit分页
<resultMap id="userList" type="com.server.entity.TbUser">
  <id property="uid" column="uid" jdbcType="INTEGER"></id>
  <result property="username" column="username"></result>
  <result property="createTime" column="create_time"></result>
  <result property="updateTime" column="update_time"></result>
  <collection property="roles" ofType="com.server.entity.TbRole">
      <id property="id" column="rid"></id>
      <result property="rName" column="r_name"></result>
  </collection>
</resultMap>
<select id="selectMap" resultMap="userList">
  select u.*,r.id rid,r.r_name
  from tb_user u
  left join tb_user_role ur on u.uid = ur.u_id
  left join tb_role r on ur.r_id = r.id
  limit ${size} offset ${((num-1)*size).intValue()} 
</select>
  1. PageHelper.startPage(pageNum,pageSize); 该方法会对代码下方第一个sql查询进行分页处理

上述两种方式都会出现错误,错误原因:

  • 上面两种方式的分页查询,对于xml中的sql查询,都是每次执行了一次sql,然后再进行集合实体映射,一次查询出的数据是没有进行集合映射之前的数据
  • 例如:【个人理解】一个user中包含3个role,那么查询出来的数据就是三条,这里可以看一下idea控制台的输出,其实是三条数据;然后再根据resultMap配置进行映射进对应的集合,最后成一条user数据。而我们使用Limit或者PageHelper插件分页时,总条数读取的是查询出来的总条数是分条的结果也就是3,而最后因为映射所以实际需要的只是一条数据,分页显示的时候会按照分条结果显示,所以就会有问题。

2.2 解决方法

1、PageHelper方式
  • Controller
@GetMapping("infolist")
public Result infolist(@RequestParam(defaultValue = "1") Integer pageNum,
                       @RequestParam(defaultValue = "10") Integer pageSize) {
    PageInfo<TbUser> userPageInfo = userInfoService.select(pageNum,pageSize);
    return Result.success(200, "查询成功", userPageInfo);
}
  • Service
// 接口
PageInfo<TbUser> select(Integer pageNum, Integer pageSize);
// 实现
@Override
public PageInfo<TbUser> select(Integer pageNum, Integer pageSize) {
    PageHelper.startPage(pageNum,pageSize);
    List<TbUser> userList = userInfoDao.selectMap();
    PageInfo<TbUser> pageInfo = new PageInfo<>(userList);
    return pageInfo;
}
  • Mapper
List<TbUser> selectMap();
  • xml
<resultMap id="userList" type="com.server.entity.TbUser">
    <id property="uid" column="uid" jdbcType="INTEGER"></id>
    <result property="username" column="username"></result>
    <result property="createTime" column="create_time"></result>
    <result property="updateTime" column="update_time"></result>
    <collection property="roles" javaType="ArrayList" column="uid" select="selectRole" ofType="com.server.entity.TbRole">
        <id property="id" column="id"></id>
        <result property="rName" column="r_name"></result>
    </collection>
</resultMap>

<select id="selectRole" resultType="com.server.entity.TbRole">
    select r.id, r.r_name
        from tb_role r,tb_user_role ur
    where ur.u_id=#{uid} and ur.r_id = r.id
</select>

<select id="selectMap" resultMap="userList">
    select *
    from tb_user
</select>

接口测试结果查看:
在这里插入图片描述
在这里插入图片描述

2、Limit
  • Controller
@GetMapping("infolist")
public Result infolist(@RequestParam(defaultValue = "1") Integer pageNum,
                       @RequestParam(defaultValue = "10") Integer pageSize) {
    List<TbUser> userPageInfo = userInfoService.select(pageNum,pageSize);
    return Result.success(200, "查询成功", userPageInfo);
}
  • Service
//接口
List<TbUser> select(Integer pageNum, Integer pageSize);
//实现
@Override
public List<TbUser> select(Integer pageNum, Integer pageSize) {
    List<TbUser> userList = userInfoDao.selectMap(pageNum,pageSize);
    return userList;
}
  • Mapper
List<TbUser> selectMap(@Param("num") Integer pageNum,
                       @Param("size") Integer pageSize);
  • xml
<resultMap id="userList" type="com.server.entity.TbUser">
    <id property="uid" column="uid" jdbcType="INTEGER"></id>
    <result property="username" column="username"></result>
    <result property="createTime" column="create_time"></result>
    <result property="updateTime" column="update_time"></result>
    <collection property="roles" javaType="ArrayList" column="uid" select="selectRole" ofType="com.server.entity.TbRole">
        <id property="id" column="id"></id>
        <result property="rName" column="r_name"></result>
    </collection>
</resultMap>
<select id="selectRole" resultType="com.server.entity.TbRole">
    select r.id, r.r_name
    from tb_role r,tb_user_role ur
    where ur.u_id=#{uid} and ur.r_id = r.id
</select>
<select id="selectMap" resultMap="userList">
    select *
    from tb_user
    limit ${size} offset ${((num-1)*size).intValue()}
</select>

【推荐】MybatisPlus通过注解的方式实现多对多查询

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis多对多查询+PageHelpler分页问题 的相关文章

随机推荐

  • vue点击把某个区域变成图片数据

    前言 使用html2canvas 可以实现把某个区域变成图片的base64数据 官网入口 点我 目录 实现步骤 1 引入 npm引入 js引入 2 在需要使用的vue组件中引入 3 将制定区域内转成图片 添加ref标记 4 点击开始转换的方
  • SV--线程(mailbox)

    3 mailbox 3 1概述 线程之间如果传递信息 可以使用mailbox mailbox和队列queue有相近之处 mailbox是一个对象 因此也可以用new 来例化 例化时 有一个可选的参数size来限定其存储的最大数量 如果siz
  • Windows中zlib的安装与配置

    安装zlib所需前置条件 cmake VS 2022 其他版本也可以 cmake的安装可以看 windows中CMake的安装与配置 第一步 下载zlib库源文件 下载zlib库源文件 可以去官网下载 也可以去github下载 这里推荐Gi
  • 数据挖掘--分类算法的优缺点

    1决策树 Decision Trees 的优缺点 决策树的优点 一 决策树易于理解和解释 人们在通过解释后都有能力去理解决策树所表达的意义 二 对于决策树 数据的准备往往是简单或者是不必要的 其他的技术往往要求先把数据一般化 比如去掉多余的
  • 万向区块链元宇宙系列报告:对工业元宇宙的认知

    伴随着元宇宙概念大热 国内外多个巨头企业抢先布局 国内多个地方政府也在积极布局 发展元宇宙技术及相关产业 试图抢占先机 针对各业务场景与元宇宙的融合 万向区块链首席经济学家办公室团队出具了系列元宇宙相关研究报告 本篇将主要聚焦工业元宇宙 探
  • json和pickle的dump,dumps,load,dumps方法的使用

    序列化 Serialization 将对象的状态信息转换为便于存储或传输的形式的过程称之为序列化 该过程的逆向则称之为反序列化 如 1 数据和文本的转换 2 Python的数据类型和二进制数据类型的转化 3 Python的数据类型和json
  • 微信小程序 - 判断一个经纬度是否在一个多边形区域内

    功能描述 最近公司做了一个定位打卡的小程序 需要判断用户的经纬度是否在一个闭合的多边形区域内 在区域内允许打卡 否则提示 不再打卡范围 由于腾讯地图小程序SDK没有提供相关功能 所以需要自己手写造轮子 实现思路 首先已知一个用户坐标 x0
  • python函数式编程例子-python之面向过程,函数式编程,面向对象浅析

    python编程有面向过程 面向函数 面向对象三种 那么他们区别在哪呢 这个问题 让我想起我在学习编程的时候 我的老师给我举的例子 分享给大家 面向过程就是将编程当成是做一件事 要按步骤完成 比如煮咖啡这件事 先拿一定量的咖啡豆 然后磨成粉
  • Vue----双向绑定指令

    文章目录 3 7 双向绑定指令 3 7 1 v model 指令的修饰符 3 7 双向绑定指令 vue提供了 v model双向绑定指令 用来辅助开发者在 不操作DOM 的前提下 快速 获取表单数 据
  • 使用idea自带的maven插件配置镜像

    一 选择idea自带maven路径 setting文件的位置选择 二 打开setting文件 三 修改maven的镜像
  • 华为HCIE云计算之Fusion Access桌面云

    华为HCIE云计算之Fusion Access桌面云 一 Fusion Access介绍 二 华为Fusion Access架构 1 Fusion Access桌面云解决方案逻辑架构 2 FusionSphere云平台架构 三 Fusion
  • 【无人机分配】一种无人机实时最优任务分配模型附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 信号处理 图像
  • 不能看到共享的服务器文件夹,服务器不能共享文件夹

    服务器不能共享文件夹 内容精选 换一换 VPC为弹性云服务器构建隔离的 用户自主配置和管理的虚拟网络环境 提升用户云中资源的安全性 简化用户的网络部署 使用弹性文件服务时 文件系统和云服务器归属于同一VPC下才能文件共享 VPC可以通过网络
  • Java发送HTTP的get,post请求(JSON)

    import net sf json JSONObject import org apache commons httpclient import org apache commons httpclient methods GetMetho
  • 2020-09-06

    Elasticsearch Elasticsearch 简称ES 是一个可分布式的实时搜索和分析引擎 一个建立在全文搜索引擎 一个建立在全文搜索引擎Apache Lucence基础上的搜索引擎 它不仅可以进行全文搜素 还可以进行以下工作 分
  • centos7 Docker化应用体验

    centos7 Docker化应用体验 环境分析 WordPress运行环境需要如下软件的支持 PHP 5 6 或 更新版本 MySQL 5 6 或 更新版本 Apache 和 mod rewrite 模块 下载应用镜像 下载mariadb
  • RobotFramework-ride自动化操作教程

    一丶启动robotframework 启动RIDE 打开用例文件 找到文件位置 gt 选择文件 查看资源文件 确保用例所需资源文件当前目录都存在 三 用例编写 执行 新增用例 2 执行用例 勾选要执行的用例 点击run tests 或者 F
  • 浅谈漏洞及其分类

    浅谈漏洞及其分类 一 漏洞概念 漏洞是指一个系统上硬件 软件 协议等具体实现或系统安全策略上存在的弱点或缺陷 系统对特定威胁攻击或危险事件的敏感性 或进行攻击的威胁作用的可能性 这些缺陷 错误或不合理之处可能被有意或无意地利用 可以使攻击者
  • python中unexpected indent报错的解决办法

    python中unexpected indent报错的解决办法 在我们初步学习pyton的时候 由于对python语言的学习掌握不充分 则会导致所编写的代码 运行时候报错 比如 容易报错的unexpected indent问题 下面举例说明
  • Mybatis多对多查询+PageHelpler分页问题

    多对多查询 说明 tb user用户表 tb role角色表 tb user role用户角色关联表 实现表数据的多对多查询并返回 使用PageHelper对查询结果分页 用户表 Data NoArgsConstructor AllArgs