目录

概述

编写代码

案例流程说明

控制层

服务层

数据访问层

自定义 SQL

测试

MybatiPlus文档


概述

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。在我们实际开发中利用MP 框架,可以简化我们对SQL的编写,提高我们工作效率。这篇文章讲解是MP自定义SQL多表查询详解和一些案例。

愿景

我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。

编写代码

案例流程说明

1. 自定义构建多表查询条件语句

  • 用户表关联角色用户关联表和角色表,模糊查询昵称和角色名称
  • where 自定义条件查询

2. 自定义构建多表 Wrapper 条件语句查询

  • 用户表关联角色用户关联表和角色表,模糊查询昵称和角色名称
  • Wrapper 自定义条件查询

控制层

/*** <p>* 自定义分页查询* </p>** @author LiPing.Zou* @since 2021-03-05*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/page")
@Api(value = "PageController", tags = "分页模块")
public class PageController {private final AdminService adminService;@GetMapping("getAdminPage")@ApiOperation(value = "获取用户分页列表")public Result<Pager<AdminResp>> getAdminPage(@RequestParam(value="pageNumber",defaultValue = "1") @ApiParam(name="pageNumber",value="当前第几页(从第一页开始)",required = true) Integer pageNumber,@RequestParam(value="pageSize",defaultValue = "10") @ApiParam(name="pageSize",value="每页多少条",required = true) Integer pageSize,@RequestParam(value="roleName",required = false) @ApiParam(name="roleName",value="角色名称") String roleName){return Result.success(adminService.getAdminPage(pageNumber,pageSize,roleName));}@GetMapping("getAdminPageByWraaper")@ApiOperation(value = "获取用户分页列表ByWraaper")public Result<Pager<AdminResp>> getAdminPageByWraaper(@RequestParam(value="pageNumber",defaultValue = "1") @ApiParam(name="pageNumber",value="当前第几页(从第一页开始)",required = true) Integer pageNumber,@RequestParam(value="pageSize",defaultValue = "10") @ApiParam(name="pageSize",value="每页多少条",required = true) Integer pageSize,@RequestParam(value="roleName",required = false) @ApiParam(name="roleName",value="角色名称") String roleName){return Result.success(adminService.getAdminPageByWraaper(pageNumber,pageSize,roleName));}}

服务层

说明:QueryWrapper 包装类查询,对应的字段必须是数据里面字段(如果你的表用了别名查询,查询对象字段最好别名.字段),如果没有匹配上,会报SQL错误

@Overridepublic Pager<AdminResp> getAdminPage(Integer pageNumber, Integer pageSize, String roleName) {log.info("getAdminPage.req pageNumber={},pageSize={},roleName={}",pageNumber,pageSize,roleName);IPage<AdminResp> page = new Page<>(pageNumber, pageSize);IPage<AdminResp> pageData = adminMapper.pageData(page,roleName);if (CollectionUtils.isNotEmpty(pageData.getRecords())) {return new Pager<>(pageNumber,pageSize,(int)pageData.getPages(),pageData.getTotal(),pageData.getRecords());}return new Pager<>();}@Overridepublic Pager<AdminResp> getAdminPageByWraaper(Integer pageNumber, Integer pageSize, String roleName) {log.info("getAdminPage.req pageNumber={},pageSize={},roleName={}",pageNumber,pageSize,roleName);IPage<AdminResp> page = new Page<>(pageNumber, pageSize);QueryWrapper<AdminResp> queryWrapper = Wrappers.query(new AdminResp());if (StringUtils.isNotBlank(roleName)) {queryWrapper.like("ua.nick_name",roleName).or().like("ur.`name`",roleName);}IPage<AdminResp> pageData = adminMapper.getAdminPageByWraaper(page,queryWrapper);if (CollectionUtils.isNotEmpty(pageData.getRecords())) {return new Pager<>(pageNumber,pageSize,(int)pageData.getPages(),pageData.getTotal(),pageData.getRecords());}return new Pager<>();}

数据访问层


/*** <p>* 后台用户表 Mapper 接口* </p>** @author SurRen* @since 2021-02-02*/
public interface AdminMapper extends BaseMapper<Admin> {/** * 自定义分页查询* @param page* @param roleName* @date: 2021/12/10 15:04* @return: com.baomidou.mybatisplus.core.metadata.IPage<com.zlp.dto.AdminResp> */IPage<AdminResp> pageData(IPage<AdminResp> page, String roleName);/** * Wrapper 包装类查询条件* @param page* @param queryWrapper* @date: 2021/12/10 15:03* @return: com.baomidou.mybatisplus.core.metadata.IPage<com.zlp.dto.AdminResp>*/IPage<AdminResp> getAdminPageByWraaper(IPage<AdminResp> page, @Param(Constants.WRAPPER) QueryWrapper<AdminResp> queryWrapper);
}

自定义 SQL

<select id="pageData" resultType="com.zlp.dto.AdminResp">SELECTua.id as userId,ua.username as username,ua.icon as icon,ua.email as email,ua.nick_name as nickName,ur.`name` as roleName,ua.create_time  as createTimeFROMums_admin uaINNER JOIN ums_admin_role_relation uarr ON ua.id = uarr.admin_idLEFT JOIN ums_role ur on uarr.role_id = ur.id<where><if test="roleName !=null and roleName !=''">and (ua.username like concat('%',#{roleName},'%') or ur.`name` like concat('%',#{roleName},'%'))</if></where></select><select id="getAdminPageByWraaper" resultType="com.zlp.dto.AdminResp">SELECTua.id as userId,ua.username as username,ua.icon as icon,ua.email as email,ua.nick_name as nickName,ur.`name` as roleName,ua.create_time  as createTimeFROMums_admin uaINNER JOIN ums_admin_role_relation uarr ON ua.id = uarr.admin_idLEFT JOIN ums_role ur on uarr.role_id = ur.id${ew.customSqlSegment}</select>

测试

http://127.0.0.1:9080/doc.html#/

调用 /page/getAdminPage 接口

后台打印sql语句,自动帮我们分页

SELECT ua.id as userId, ua.username as username, ua.icon as icon, ua.email as email, ua.nick_name as nickName, ur.`name` as roleName, ua.create_time as createTime FROM ums_admin ua INNER JOIN ums_admin_role_relation uarr ON ua.id = uarr.admin_id LEFT JOIN ums_role ur on uarr.role_id = ur.id WHERE (ua.username like concat('%',?,'%') or ur.`name` like concat('%',?,'%')) LIMIT ?,? 

调用 /page/getAdminPageByWraaper 接口

SELECT ua.id as userId, ua.username as username, ua.icon as icon, ua.email as email, ua.nick_name as nickName, ur.`name` as roleName, ua.create_time as createTime FROM ums_admin ua INNER JOIN ums_admin_role_relation uarr ON ua.id = uarr.admin_id LEFT JOIN ums_role ur on uarr.role_id = ur.id WHERE (ua.nick_name LIKE ? OR ur.`name` LIKE ?) LIMIT ?,? 

MybatiPlus文档

官方文档里面也做介绍,版本需要大于3.0.7
官方链接:使用 Wrapper 自定义SQL

MybatisPlus自定义 Sql 实现多表查询相关推荐

  1. mybatis plus按时间段查询_MybatisPlus自定义Sql实现多表查询的示例

    前言 前段时间看同事的代码,发现他用Layui+MybatisPlus做分页查询做得很规整,认真看了下代码发现这种方式不仅适用于与Layui做分页查询,在任何时候需要多表联查的时候都可以用到. 以下以 ...

  2. MP + QueryWrapper + 自定义SQL完成连表查询

    分析 userMapper.selectPage(page, queryWrapper); 上面这个分页查询方法,只能针对当前自己的实体,他很好的支持与解决,但是关联查询就不行了. 上面代码的底层,会 ...

  3. 使用mybatis-plus如何实现零sql做到多表查询

    使用mybatis-plus如何实现零sql做到多表查询 在很多时候我们使用mybatis时我们会发现mapper文件写起来太麻烦了,所以现在很多基于mybatis进行封装的框架,这些框架的目的是将一 ...

  4. SpringBoot集成MyBatis-Plus自定义SQL

    1.说明 本文介绍Spring Boot集成MyBatis-Plus框架后, 基于已经创建好的Spring Boot工程, 添加自定义的SQL实现复杂查询等操作. 自定义SQL主要有两种方式, 一种是 ...

  5. SQL语句多表查询:【多表连查】和【子查询】

    SQL语句多表查询:[多表连查]和[子查询] 说明:insert.update.delete只针对[一张表]执行操作. 说明:select可以查询一张表.也可以查询多张表. 说明:多表查询分为:[多表 ...

  6. php多表查询性能优化,MSSQL_SQL Server多表查询优化方案集锦,SQL Server多表查询的优化方案是 - phpStudy...

    SQL Server多表查询优化方案集锦 SQL Server多表查询的优化方案是本文我们主要要介绍的内容,本文我们给出了优化方案和具体的优化实例,接下来就让我们一起来了解一下这部分内容. 1.执行路 ...

  7. mybatis-plus自定义sql报错 ew.customSqlSegment

    mybatis-plus自定义sql报错: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibat ...

  8. SQL的连表查询 详细

    SQL的连表查询 2017年08月31日 15:58:49 阅读数:176 SQL的连表查询 连接查询包括合并.内连接.外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要. 只有真正了解它们 ...

  9. SQL:多表查询语句(嵌套子查询,多表连接)操作实例

    一.SQL Server多表查询,包括连接操作和嵌套子查询 背景知识: 一.连接:分成内连接和外连接,内连接相当于取交集,外连接相当于取并集 二.嵌套子查询:连接操作浪费资源,使用嵌套子查询可以避免连 ...

最新文章

  1. 何李石:七牛直播云技术详解
  2. 数学建模中的excel操作
  3. 深度学习笔记之win7下TensorFlow的安装
  4. android 多线程 场景,精选Android初中级面试题 (三): 深探Handler,多线程,Bitmap
  5. 海康9800平台linux的sdk,流媒体项目外包海康9800平台sdk适配
  6. python解析.pyd文件
  7. 51 SD配置-定价配置-维护定价过程
  8. Python typing —— 类型提示(type hint)
  9. 1971年中国的预警机就上天了
  10. 乐华网上阅卷系统服务器地址,乐华网上阅卷系统1.0操作手册
  11. win7系统怎样开启wmi服务器,WMI服务是什么?Win7系统如何禁用WMI服务?
  12. java解惑 - 最后的笑声
  13. dreamweaver动漫HTML网站制作——海贼王主题网页1页海贼王我当定了(HTML+CSS)
  14. 【Unity2D好项目分享】提高游戏人物打击感
  15. 张一鸣:人生中一半的问题,都是没有延迟满足感造成的
  16. 用turtle画各种各样的数学图形
  17. Pycharm专业版安装详细教程!
  18. Problem F. Asperger Syndrome
  19. CodeForces 366C Dima and Salad (背包dp)
  20. 【AIoT库】RFID基础知识第5期 · 市场应用及前景

热门文章

  1. 百度地图坐标点轨迹画线php,百度map经纬度定位绘制路线图
  2. ASP.NET2.0 开发无刷新页面
  3. js字符串拼接:${}
  4. 最适合学生的大纲笔记
  5. c语言宏函数返回值,C++宏定义方法的返回值
  6. #千锋逆战班,ssf# 在千锋“逆战”学习第 26天, 每个人生阶段都需要努力去扮好自己的角色,越努力越轻松,越坚强越幸运! 加油
  7. Unity UGUI通过摇杆joystick 控制角色移动 标准的第三人称视角手游-左侧控制移动,右侧控制视角和方向
  8. 电脑性能测试常用软件介绍,哪些工具可用于性能测试?常用的性能测试工具是什么?...
  9. 极客战纪——KITHMAZE最终历险攻略(JavaScript)
  10. android studio 的串口调试工具