【Mybatis-Plus】联表分页查询实现
参考文章:
https://blog.csdn.net/weixin_43847283/article/details/125822614
上上周写的SQL案例确实可以重构,所以搬到Demo里面测试看看
案例需要的依赖库
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> <dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency> <dependency>
<groupId>com.github.yulichang</groupId>
<artifactId>mybatis-plus-join</artifactId>
<version>1.2.2</version>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
</dependencies>
这是原来的SQL脚本
SELECT
WX_USER.WEIXINID,
WX_USER.PHONENUM,
WX_USER.NICKNAME,
WX_USER.HEADIMGURL,
WX_USER.UNIONID ,
WX_USER.CREATETIME,
WX_USER.WEIXINID,
WX_USER.UPDATETIME,
MERCHANT.MERCHANT_NO,
MERCHANT.MERCHANT_NAME AS merchantName ,
MERCHANT.PROVINCE AS province,
MERCHANT.CITY AS city,
MERCHANT.AREA AS areaCode
FROM
`aisw_user` WX_USER
LEFT JOIN `aisw_merchant` MERCHANT ON WX_USER.MERCHANT_NO = MERCHANT.MERCHANT_NO
WHERE 1 = 1
<if test="user.phonenum != null and user.phonenum != ''">
AND WX_USER.PHONENUM LIKE CONCAT('%', #{user.phonenum},'%')
</if>
<if test="user.unionid != null and user.unionid != ''">
AND WX_USER.UNIONID LIKE CONCAT('%', #{user.unionid},'%')
</if>
<if test="user.timeline0 != null and user.timeline0 != '' and user.timeline1 != null and user.timeline1 != ''">
AND WX_USER.CREATETIME BETWEEN #{user.timeline0} AND #{user.timeline1}
</if>
<if test="user.merchantName != null and user.merchantName != ''">
AND (
MERCHANT.MERCHANT_NO LIKE CONCAT('%', #{user.merchantName},'%')
OR
MERCHANT.MERCHANT_NAME LIKE CONCAT('%', #{user.merchantName},'%')
)
</if>
<if test="user.province != null and user.province != ''">
AND MERCHANT.PROVINCE = #{user.province}
</if>
<if test="user.city != null and user.city != ''">
AND MERCHANT.CITY = #{user.city}
</if>
<if test="user.areaCode != null and user.areaCode != ''">
AND MERCHANT.AREA = #{user.areaCode}
</if>
ORDER BY WX_USER.CREATETIME DESC
Dao调用代码:
/**
* /aiswUser/queryUserPage
* @description: 查询aisw用户列表
* @author: cloud9
* @date: 2022/06/24 11:31
* @param dto
* @return: cn.ymcd.comm.page.PageResult<cn.ymcd.aisw.common.strategy.dto.UserDTO>
**/
@PostMapping(value = "/queryUserPage")
public IPage<UserDTO> queryUserPage(@RequestBody UserDTO dto) {
IPage iPage = userDAO.queryUserPageWithMerchantInfo(dto.getPage(), dto);
return iPage;
}
换成MPJMapper实现:
@PostMapping(value = "/queryUserPage2")
public IPage<UserDTO> queryUserPage2(@RequestBody UserDTO dto) {
IPage<UserDTO> page = userDAO.selectJoinPage(
dto.getPage(),
UserDTO.class,
new MPJLambdaWrapper<UserDTO>()
.selectAll(UserDTO.class)
.selectAs(AiswMerchantDTO::getMerchantName, UserDTO::getMerchantName)
.selectAs(AiswMerchantDTO::getProvince, UserDTO::getProvince)
.selectAs(AiswMerchantDTO::getCity, UserDTO::getCity)
.selectAs(AiswMerchantDTO::getArea, UserDTO::getAreaCode)
.leftJoin(AiswMerchantDTO.class, AiswMerchantDTO::getMerchantNo, UserDTO::getMerchantNo)
.like(!StringUtils.isEmpty(dto.getUnionid()), UserDTO::getUnionid, dto.getUnionid())
.like(!StringUtils.isEmpty(dto.getPhonenum()), UserDTO::getPhonenum, dto.getPhonenum())
.and(
!StringUtils.isEmpty(dto.getMerchantName()),
wq -> wq
.like(AiswMerchantDTO::getMerchantName, dto.getMerchantName())
.or()
.like(AiswMerchantDTO::getMerchantNo, dto.getMerchantName())
)
.between(
!StringUtils.isEmpty(dto.getTimeline0()) && !StringUtils.isEmpty(dto.getTimeline1()),
UserDTO::getTimeline, dto.getTimeline0(), dto.getTimeline1()
)
.eq(!StringUtils.isEmpty(dto.getProvince()), AiswMerchantDTO::getProvince, dto.getProvince())
.eq(!StringUtils.isEmpty(dto.getCity()), AiswMerchantDTO::getCity, dto.getCity())
.eq(!StringUtils.isEmpty(dto.getAreaCode()), AiswMerchantDTO::getProvince, dto.getAreaCode())
.orderByDesc(UserDTO::getCreatetime)
);
return page;
}
两者的SQL比较:
-- MPJ生成SQL
SELECT
t.ID,
t.WEIXINID,
t.PHONENUM,
t.NICKNAME,
t.PROVINCE,
t.PLACECITY,
t.PLACEAREA,
t.HEADIMGURL,
t.UNIONID,
t.CREATETIME,
t.UPDATETIME,
t.TIMELINE,
t.MERCHANT_NO,
t1.MERCHANT_NAME AS merchantName,
t1.PROVINCE AS province,
t1.CITY AS city,
t1.AREA AS areaCode
FROM
aisw_user t
LEFT JOIN aisw_merchant t1 ON ( t1.MERCHANT_NO = t.MERCHANT_NO )
WHERE
( t.TIMELINE BETWEEN '2022-07-13 00:00:00' AND '2022-08-23 23:59:59' )
ORDER BY
t.CREATETIME DESC -- 我写的SQL
SELECT
WX_USER.WEIXINID,
WX_USER.PHONENUM,
WX_USER.NICKNAME,
WX_USER.HEADIMGURL,
WX_USER.UNIONID,
WX_USER.CREATETIME,
WX_USER.WEIXINID,
WX_USER.UPDATETIME,
MERCHANT.MERCHANT_NO,
MERCHANT.MERCHANT_NAME AS merchantName,
MERCHANT.PROVINCE AS province,
MERCHANT.CITY AS city,
MERCHANT.AREA AS areaCode
FROM
`aisw_user` WX_USER
LEFT JOIN `aisw_merchant` MERCHANT ON WX_USER.MERCHANT_NO = MERCHANT.MERCHANT_NO
WHERE
1 = 1
AND WX_USER.CREATETIME BETWEEN '2022-07-13 00:00:00'
AND '2022-08-23 23:59:59'
ORDER BY
WX_USER.CREATETIME DESC
【Mybatis-Plus】联表分页查询实现的更多相关文章
- springBootJpa 联表分页查询总数不准的问题
问题情景: 在联表查询时 ``` // 两张表关联查询 Join<Project, Plan> planJoin = root.join("plans", JoinTy ...
- Mybatis oracle多表联合查询分页数据重复的问题
Mybatis oracle多表联合查询分页数据重复的问题 多表联合查询分页获取数据时出现一个诡异的现象:数据总条数正确,但有些记录多了,有些记录却又少了甚至没了.针对这个问题找了好久,最后发现是由于 ...
- Java基础-SSM之mybatis的统计函数和分页查询
Java基础-SSM之mybatis的统计函数和分页查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- MyBatis 中两表关联查询MYSQL (14)
MyBatis 中两表关联查询MYSQL 1.创建数据库表语句 2.插入测试数据 3.pom文件内容 <?xml version="1.0" encoding="U ...
- mybatis之联表查询
今天碰到了一个问题,就是要在三张表里面各取一部分数据然后组成一个list传到前台页面显示.但是并不想在后台做太多判断,(因为涉及到for循环)会拉慢运行速度.正好用的框架是spring+springM ...
- Mybatis框架-联表查询显示问题解决
需求:查询结果要求显示用户名,用户密码,用户的角色 因为在用户表中只有用户角色码值,没有对应的名称,角色名称是在码表smbms_role表中,这时我们就需要联表查询了. 这里需要在User实体类中添加 ...
- JdbcTemplate+PageImpl实现多表分页查询
一.基础实体 @MappedSuperclass public abstract class AbsIdEntity implements Serializable { private static ...
- mybatis实现多表联合查询
本文转自:http://www.cnblogs.com/xdp-gacl/p/4264440.html#!comments 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) ...
- Mybatis-plus多表关联查询,多表分页查询
学习plus真的觉得写代码真的越来越舒服了.昨天开始接触吧,只要学会了多表关联查询.plus就能随意搭配使用了. 关于怎么搭建的就自行了去研究了哦.这里直接进入主题. 我用的是springboot+m ...
- sql连表分页查询(存储过程)
1.平时分页查询都比较多针对一个表的数据 而这个分页查询是针对连表查询的 ,这也是我网上改版别人的sql语句 先在数据库新建一个存储过程 拷贝以下代码 CREATE PROCEDURE [dbo].[ ...
随机推荐
- Vue学习:6.认识计算属性
计算属性是 Vue.js 提供的一种特殊属性,用于在模板中动态计算和返回数据.计算属性使得在模板中使用动态计算的数据变得非常简洁和方便,同时又能保持响应式更新的特性,提高了代码的可读性和可维护性. 与 ...
- rust程序设计(6)枚举与模式匹配
rust中的枚举有什么用?枚举可以嵌入类型的好处是什么 你可以在同一个枚举中既有单个值,也有元组或结构体. 枚举的每个变体可以拥有不同数量和类型的关联数据. 这增加了类型的灵活性和表达力,使你能够更精 ...
- 高性能版本的零内存分配LikeString函数(ZeroMemAllocLikeOperator)
继上一篇文章在.NET Core,除了VB的LikeString,还有其它方法吗?(四种LikeString实现分享)分享了四种实现方式,笔者对这四种实现方式,不管是执行性能还是内存分配性能上,都不太 ...
- flutter 创建第一个项目(二)
新建flutter project 项目 这样就创建出了第一个项目
- MySQL条件判断IF,CASE,IFNULL语句详解
MySQL条件判断IF,CASE,IFNULL语句详解 1.IF语句的基本用法IF(condition, true_statement, false_statement);condition: 条件表 ...
- Unity 罗技G29接入
Unity 罗技G29接入 unity g29unity logictech g29g29 Unity 罗技G29接入 一. 使用Unity Standard Assets中的CrossPlatfor ...
- Jmeter自动录制脚本
1.Jmeter配置 1.1新增一个线程组 1.2Jmeter中添加HTTP代理 1.3配置HTTP代理服务器 修改端口 修改Target Cintroller(目标控制器) 修改Grouping(分 ...
- tar命令 --null -T 参数详解
tar 命令的 --null 和 -T 参数可以一起使用,以从 null 设备读取文件名,并将这些文件名传递给 tar 命令来处理. --null 参数的作用是将文件名作为 null 字符分隔的字符串 ...
- 架构师必知的11种API性能优化方法
前言 接口性能优化是后端开发人员经常碰到的一道面试题,因为它是一个跟开发语言无关的公共问题. 这个问题既可以很简单,也可以相当复杂. 有时候,只需要添加一个索引就能解决. 有时候,代码需要进行重构. ...
- Docker安装InfluxDB1.x和InfluxDB2.x以及与SpringBoot整合
两者区别: 1.x 版本使用 influxQL 查询语言,2.x 和 1.8+(beta) 使用 flux 查询语法:相比V1 移除了database 和 RP,增加了bucket. V2具有以下几个 ...