当前位置: 首页 > news >正文

springboot+mybatis按条件分页查询多张表

文章目录

  • 背景
  • 方案推荐
  • 创建 DTO
  • 创建 Mapper
  • 创建对应 xml
  • Service 代码

背景

假如同 mysql 数据源下有如下几张表:

  • 用户基础信息表
  • 用户地址表
  • 用户学历信息表

我希望做分页查询用户数据,用户数据为各个表内信息的汇总,并且这个分页查询会根据各种条件来查询

那么通常该如何做呢?

方案推荐

一般情况下通用推荐(下面主讲):
使用 join 进行多表连接查询,使用 pagehelper 分页插件,通过 MyBatis 的 <resultMap> 和 JOIN 语句实现多表关联,使用 MyBatis 动态 SQL 标签(如 )处理条件组合

其他方案:

  • 方式一:将高频查询字段冗余到主表,形成宽表,此方案牺牲空间换取性能,以后直接分页查询一张表即可
  • 方式二:分步骤来查询,在代码层面进行数据组装

创建 DTO

创建 dto 做查询数据接收的对象

public class UserQueryDTO {
    private String name;        // 用户姓名(模糊查询)
    private String province;    // 省份条件 
    private String degree;      // 学历条件 
}

创建 Mapper

创建一个 mapper 接口 selectUserWithConditions

创建对应 xml

<!-- UserMapper.xml  -->
<select id="selectUserWithConditions" resultMap="UserResultMap">
    SELECT u.id,  u.name,  a.province,  e.degree  
    FROM user u 
    LEFT JOIN address a ON u.id  = a.user_id  
    LEFT JOIN education e ON u.id  = e.user_id  
    <where>
        <if test="name != null and name != ''">
            u.name  LIKE CONCAT('%', #{name}, '%')
        </if>
        <if test="province != null and province != ''">
            AND a.province  = #{province}
        </if>
        <if test="degree != null and degree != ''">
            AND e.degree  = #{degree}
        </if>
    </where>
</select>
 
<resultMap id="UserResultMap" type="UserVO">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="province" column="province"/>
    <result property="degree" column="degree"/>
</resultMap>

Service 代码

// 使用PageHelper(需在pom.xml 添加依赖)
public PageInfo<UserVO> queryUsers(UserQueryDTO dto) {
    PageHelper.startPage(dto.getPageNum(),  dto.getPageSize()); 
    List<UserVO> list = userMapper.selectUserWithConditions(dto); 
    return new PageInfo<>(list);
}

相关文章:

  • PHP语法完全入门指南:从零开始掌握动态网页
  • 代码随想录 第一章 数组 209.长度最小的子数组
  • Postgresql的三种备份方式_postgresql备份
  • 如何在在 CentOS 中安装 OLama
  • 企业实战 - 深入解析Python爬虫中的JS逆向技术
  • 【机器学习】线性回归 多项式线性回归
  • web信息泄露 ctfshow-web入门web1-web10
  • mysql 学习15 SQL优化,插入数据优化,主键优化,order by优化,group by 优化,limit 优化,count 优化,update 优化
  • CentOS上远程连接SSH常用操作命令整理
  • 字符串哈希动态规划_6
  • 二.数据治理流程架构
  • 《程序人生》工作2年感悟
  • Leetcode 424-替换后的最长重复字符
  • 复用输出模式的使用场景
  • [STM32 - 野火] - - - 固件库学习笔记 - - - 十五.设置FLASH的读写保护及解除
  • Vue 3最新组件解析与实践指南:提升开发效率的利器
  • 《Zookeeper 分布式过程协同技术详解》读书笔记-2
  • Android 14输入系统架构分析:图解源码从驱动层到应用层的完整传递链路
  • 数据仓库、数据湖和数据湖仓
  • Postgresql在线重建索引REINDEX INDEX CONCURRENTLY出现后缀带_ccnew和_ccold关键字且状态是invaild的索引
  • 欧洲加大力度招募美国科研人员
  • 雷军:小米芯片采用3纳米制程,首款SUV“YU7”即将发布
  • 优质文化资源下基层,上海各区优秀群文团队“文化走亲”
  • 家庭医生可提前5天预约三甲医院号源,上海常住人口签约率达45%,
  • 上昆“学馆制”10年,完成300出折子戏和20台大戏传承
  • 中国田径巡回赛西安站完赛:男子跳远石雨豪夺冠