Java学习:使用MyBatis Plus的分页插件和QueryWrapper结合自定义mapper xml实现多表关联查询

2023-10-29

Vo:

/**
 * 用来返回给前端展示列表的数据实体
 */
@Data
public class CourseVo implements Serializable {

    private static final long serialVersionUID = 1L;
    private String id;
    private String title;
    private String subjectParentTitle;
    private String subjectTitle;
    private String teacherName;
    private Integer lessonNum;
    private String price;
    private String cover;
    private Long buyCount;
    private Long viewCount;
    private String status;
    private String gmtCreate;
}
/**
 * 专门用来接受课程列表查询参数的实体
 */
@Data
public class CourseQueryVo implements Serializable {

    private static final long serialVersionUID = 1L;

    private String title;
    private String teacherId;
    private String subjectParentId;
    private String subjectId;
}

Controller:

 public R index(
            @ApiParam(value = "当前页码", required = true)
            @PathVariable Long page,

            @ApiParam(value = "每页记录数", required = true)
            @PathVariable Long limit,

            @ApiParam(value = "查询对象")
                    CourseQueryVo courseQueryVo){

        IPage<CourseVo> pageModel = courseService.selectPage(page, limit, courseQueryVo);
        List<CourseVo> records = pageModel.getRecords();
        long total = pageModel.getTotal();
        return  R.ok().data("total", total).data("rows", records);
    }

Service:

IPage<CourseVo> selectPage(Long page, Long limit, CourseQueryVo courseQueryVo);
 public IPage<CourseVo> selectPage(Long page, Long limit, CourseQueryVo courseQueryVo) {
        QueryWrapper<CourseVo> queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByDesc("c.gmt_create");

        String title = courseQueryVo.getTitle();
        String teacherId = courseQueryVo.getTeacherId();
        String subjectParentId = courseQueryVo.getSubjectParentId();
        String subjectId = courseQueryVo.getSubjectId();

        if (!StringUtils.isEmpty(title)) {
            queryWrapper.like("c.title", title);
        }

        if (!StringUtils.isEmpty(teacherId) ) {
            queryWrapper.eq("c.teacher_id", teacherId);
        }

        if (!StringUtils.isEmpty(subjectParentId)) {
            queryWrapper.eq("c.subject_parent_id", subjectParentId);
        }

        if (!StringUtils.isEmpty(subjectId)) {
            queryWrapper.eq("c.subject_id", subjectId);
        }

        Page<CourseVo> pageParam = new Page<>(page, limit);
        //放入分页参数和查询条件参数,mp会自动组装
        List<CourseVo> records = baseMapper.selectPageByCourseQueryVo(pageParam, queryWrapper);
        pageParam.setRecords(records);
        return pageParam;
    }

Mapper:

List<CourseVo> selectPageByCourseQueryVo(//mp会自动组装分页参数
                                             Page<CourseVo> pageParam,
                                             //mp会自动组装queryWrapper:
                                             //@Param(Constants.WRAPPER) 和 xml文件中的 ${ew.customSqlSegment} 对应
                                             @Param(Constants.WRAPPER) QueryWrapper<CourseVo> queryWrapper);

Mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.guli.service.edu.mapper.CourseMapper">
    <sql id="columns">
     c.id,
     c.title,
     c.lesson_num AS lessonNum,
     CONVERT(c.price, DECIMAL(8,2)) AS price,
     c.cover,
     c.buy_count AS buyCount,
     c.view_count AS viewCount,
     c.status,
     c.gmt_create AS gmtCreate,
     t.name AS teacherName,
     s1.title AS subjectParentTitle,
     s2.title AS subjectTitle
    </sql>

    <sql id="tables">
        edu_course c
        LEFT JOIN edu_teacher t ON c.teacher_id = t.id
        LEFT JOIN edu_subject s1 ON c.subject_parent_id = s1.id
        LEFT JOIN edu_subject s2 ON c.subject_id = s2.id
    </sql>

    <select id="selectPageByCourseQueryVo" resultType="com.atguigu.guli.service.edu.entity.vo.CourseVo">
        SELECT
        <include refid="columns" />
        FROM
        <include refid="tables" />
        ${ew.customSqlSegment}
    </select>
</mapper>

重点:
MybatisPlus会将查询参数构成的条件和分页的page及limit自动组装到Sql中
以后进行多表联合查询时,可以使用以下方法来进行数据的查找与筛选
自动组装需要搭配:

 @Param(Constants.WRAPPER) 放置于Mapper层接口的查询参数前,详细见上面代码例子
 ${ew.customSqlSegment} 将此行代码放置于Mapper文件的语句中,MybatisPlus将会为我们自动将 @Param(Constants.WRAPPER) 注解后的查询参数自动组装到Sql中
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java学习:使用MyBatis Plus的分页插件和QueryWrapper结合自定义mapper xml实现多表关联查询 的相关文章

  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 如何从shell脚本自动登录MySQL?

    我有一个 MySQL 服务器 其中有一个用户和密码 我想在 shell 脚本中执行一些 SQL 查询而不指定密码 如下所示 config sh MYSQL ROOT root MYSQL PASS password mysql sh sou
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 当我从 Netbeans 创建 Derby 数据库时,它存储在哪里?

    当我从 netbeans 创建 Derby 数据库时 它存储在哪里 如何将它与项目的其余部分合并到一个文件夹中 右键单击Databases gt JavaDB in the Service查看并选择Properties This will
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • el-tabs组件切换之前拦截函数异常踩坑记录

    背景 产品需求在离开当前tab之前要对页面填写信息进行校验 若没有任何改动则可以直接切换tab 若有改动 则需要在跳转之前进行拦截 提示用户 当前页面信息未保存 确定离开吗 确定或取消由用户选择 代码实现
  • 逆向工程核心原理——DLL注入——创建远程线程

    什么是DLL注入 dll注入是一种将Windows动态链接库注入到目标进程中的技术 具体的说 就是将dll文件加载到一个进程的虚拟地址空间中 对某个进程进行dll注入 也就意味着dll模块与该进程共用一个进程空间 则这个dll文件就有了操纵
  • 可变频率正弦信号发生器的FPGA实现(Quartus)

    一 说明 实现平台 Quartus17 1 MATLAB2021a和Modelsim SE 64 10 4 二 内容 1 产生一个完整周期的正弦波信号 并保存为 mif文件 2 设计一个ROM 将正弦波信号文件初始化如该ROM中 3 设计一
  • 内存分配---kmalloc

    kmalloc 内存分配引擎是一个功能强大的工具 下面我们来讲解一下这个函数 Kmalloc 函数分配内存时有几个特点 1 获取内存空间时不会对内存空间进行清零 也就是说 分配给它的区域仍然保持着原有的数据 2 它分配的区域在物理内存中也是
  • Ubuntu中火狐浏览器Firefox打不开网页

    浏览器地址栏输入 about config 搜索 general useragent override 无则新建 输入字符串 Mozilla 5 0 X11 Linux x86 64 AppleWebKit 537 36 KHTML lik
  • 2021-09-02防火墙和CDN、Ajax跨域

    欢迎大家一起来Hacking水友攻防实验室学习 渗透测试 代码审计 免杀逆向 实战分享 靶场靶机 求关注 CDN 内容分发网络 Content Delivery Network 简称CDN 是建立并覆盖在承载网之上 由分布在不同区域的边缘节
  • 如何查看mac系统是32位还是64位的操作系统

    一 点击工具栏左上角点击 苹果Logo 标志 关于本机 gt 更多信息 gt 系统报告 gt 左侧栏中 软件 二 打开终端 输入命令 uname a 回车 x86 64 表示系统为64位 i686 表示系统32位的 比如我的 三 在终端输入
  • js实现模糊搜索

    功能一 关键字搜索 总结 1 搜索出的结果 前台先要清空原有表格 tbody empty 2 后台返回的json格式字符串 js eval 专成对象var stus eval msg 在循环进行字符串拼接到表格上 tbody html st
  • Ubuntu上vsftpd安装与多用户目录配置

    vsftpd安装与多用户目录配置 文章配置使用Ubuntu进行配置 CentOS系统的配置也是大同小异 主要理解虚拟用户的加载方式和权限目录的配置 配置目标 在 home vsftpd 目录下有3个子目录分别为folder1 folder2
  • 二叉搜索树的建立和排序

    二叉搜索树的建立和排序 今天面了一家自研 有一道二叉搜索树的题目 但是自己做的不好 就是有几个学生和成绩 使用树来存储 左子树大于等于root 右节点小于root package org example public class Main
  • 《Apache MINA 2.0 用户指南》第二章:基础知识

    最近准备将Apache MINA 2 0 用户指南英文文档翻译给大家 但是我偶然一次百度 发现 Defonds 这位大牛已经翻译大部分文档 原文链接 http mina apache org mina project userguide c
  • LAN9252芯片控制资料

    一 整个ethercat项目开发流程 通过STM32相关学习板 理解EtherCAT协议栈和通信步骤 根据项目需求构建XML 该XML将会由TwinCAT2解析 将相关特STM32程序烧写 修改应用层协议的程序 STM32作为SPI主模式与
  • Faiss流程与原理分析

    1 Faiss简介 Faiss是Facebook AI团队开源的针对聚类和相似性搜索库 为稠密向量提供高效相似度搜索和聚类 支持十亿级别向量的搜索 是目前最为成熟的近似近邻搜索库 它包含多种搜索任意大小向量集 备注 向量集大小由RAM内存决
  • 华为机试题--坐标移动

    题目描述 开发一个坐标计算工具 A表示向左移动 D表示向右移动 W表示向上移动 S表示向下移动 从 0 0 点开始移动 从输入字符串里面读取一些坐标 并将最终输入结果输出到输出文件里面 输入 合法坐标为A 或者D或者W或者S 数字 两位以内
  • 机器学习——从0开始构建自己的GAN网络

    目录 一 前言 二 生成式对抗网络GAN 三 GAN的训练思路 四 数据集 Chinese MNIST 五 代码 python 1 文件展示 2 代码 一 数据预处理 3 代码 二 生成器的构建 4 代码 三 判别器的构建 5 代码 四 图
  • Python 模块手动制作发布压缩包_安装

    1 创建setup py from distutils core import setup setup name my msg version 1 0 description 发送信息和接受信息 long description hlx 完
  • 【CubeMX配置STM32驱动MPU6050】

    CubeMX配置STM32驱动MPU6050 包含DMP 并且在0 96寸OLED上显示 一 使用CubeMX进行相关配置 1 配置OLED的IIC接口 OLED的具体使用方法我就不细说了 我前面的文章里面有讲OLED的 如果有需要可以去看
  • Sql server 期末知识点复习

    数据库基础概念 提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 数据库复习知识 数据库基本概念 一 第一章概念知识复习 二 数据库创建 数据库及数据库对象 数据库基本概念 一 第一章概念知识复习 1 数据库 数据库 DB
  • 旋转的加载动画 css3,CSS3 Loaders

    css webkit keyframes rotate 0 webkit transform rotate 0deg transform rotate 0deg 50 webkit transform rotate 180deg trans
  • Java学习:使用MyBatis Plus的分页插件和QueryWrapper结合自定义mapper xml实现多表关联查询

    Vo 用来返回给前端展示列表的数据实体 Data public class CourseVo implements Serializable private static final long serialVersionUID 1L pri