参考文章:

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】联表分页查询实现的更多相关文章

  1. springBootJpa 联表分页查询总数不准的问题

    问题情景: 在联表查询时 ``` // 两张表关联查询 Join<Project, Plan> planJoin = root.join("plans", JoinTy ...

  2. Mybatis oracle多表联合查询分页数据重复的问题

    Mybatis oracle多表联合查询分页数据重复的问题 多表联合查询分页获取数据时出现一个诡异的现象:数据总条数正确,但有些记录多了,有些记录却又少了甚至没了.针对这个问题找了好久,最后发现是由于 ...

  3. Java基础-SSM之mybatis的统计函数和分页查询

    Java基础-SSM之mybatis的统计函数和分页查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  4. MyBatis 中两表关联查询MYSQL (14)

    MyBatis 中两表关联查询MYSQL 1.创建数据库表语句 2.插入测试数据 3.pom文件内容 <?xml version="1.0" encoding="U ...

  5. mybatis之联表查询

    今天碰到了一个问题,就是要在三张表里面各取一部分数据然后组成一个list传到前台页面显示.但是并不想在后台做太多判断,(因为涉及到for循环)会拉慢运行速度.正好用的框架是spring+springM ...

  6. Mybatis框架-联表查询显示问题解决

    需求:查询结果要求显示用户名,用户密码,用户的角色 因为在用户表中只有用户角色码值,没有对应的名称,角色名称是在码表smbms_role表中,这时我们就需要联表查询了. 这里需要在User实体类中添加 ...

  7. JdbcTemplate+PageImpl实现多表分页查询

    一.基础实体 @MappedSuperclass public abstract class AbsIdEntity implements Serializable { private static ...

  8. mybatis实现多表联合查询

    本文转自:http://www.cnblogs.com/xdp-gacl/p/4264440.html#!comments 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) ...

  9. Mybatis-plus多表关联查询,多表分页查询

    学习plus真的觉得写代码真的越来越舒服了.昨天开始接触吧,只要学会了多表关联查询.plus就能随意搭配使用了. 关于怎么搭建的就自行了去研究了哦.这里直接进入主题. 我用的是springboot+m ...

  10. sql连表分页查询(存储过程)

    1.平时分页查询都比较多针对一个表的数据 而这个分页查询是针对连表查询的 ,这也是我网上改版别人的sql语句 先在数据库新建一个存储过程 拷贝以下代码 CREATE PROCEDURE [dbo].[ ...

随机推荐

  1. const与指针的组合

    ① const int *p; //指向一个整型常量的指针,p可变,p指向的对象不可变. ② int const *p; //同上. ③ int * const p; //p不可变,p指向的对象可变( ...

  2. Java StringBuffer 与StringBuilder 类的介绍与区别

    目录 StringBuffer类(用来解决String类的内存浪费问题) 构造方法 public StringBuffer(); 无参构造 public StringBuffer( String ); ...

  3. CF437E The Child and Polygon

    The Child and Polygon 题解 这世界这么大,遇到了这个奇奇怪怪的题. 这道题其实可以很自然的联想到卡特兰数. 在卡特兰数的计数中,有这么一个意义:\(C_n\) 表示把有 \(n+ ...

  4. 使用Wesky.Net.OpenTools包来快速实现嵌套型结构体数据转换功能

    今天遇到有人提到结构体和byte数组互转的问题,我就顺便拿来水一篇.这是一个冷门的问题,估计使用的人不多.既然有需求,应该就有使用场景,那就顺便整一波. 为了达到效果,结构体.复杂结构体嵌套等都能实现 ...

  5. 【干货分享】.NET人脸识别解决方案

    前言 前段时间有同学在DotNetGuide技术社区交流群提问:.NET做人脸识别功能有什么好的解决方案推荐的吗?今天大姚给大家推荐2款.NET开源.免费.跨平台.使用简单的人脸识别库,希望可以帮助到 ...

  6. restful接口返回JSONObject和父类抽象实现类设计,请求头获取sign和支付宝RSA签名验签工具类方法

    restful接口返回JSONObject和父类抽象实现类设计,请求头获取sign和支付宝RSA签名验签工具类方法 1.JSONObject可以通用数据的灵活性,类似Map数据,数据字段不清晰.具体返 ...

  7. 短链服务接口慢优化 redis应用

    短链服务接口慢优化 redis应用 短链接服务:1.长链接 查询 短链接(长链接如果存在,直接返回短链接,如果长链接不存在,则需要生成短链接),比如:在获取短信之前,或者管理后台编辑短信内容之前,需要 ...

  8. 端口占用,无法通过netstat找到进程,占用的端口又不能修改,该怎么办?

    最近遇到一个奇葩的问题,项目跑的好好的,没有安装其它特殊软件,突然服务器启动报错,日志如下,显然是服务器的8080端口占用了. Caused by: java.net.BindException: A ...

  9. Linux/Unix-stty命令详解

    文章目录 介绍 stty命令的使用方法 stty的参数 我常用的选项 所有选项 介绍 stty用于查询和设置当前终端的配置. 如果你的终端回车不换行.输入命令不显示等各种奇葩问题,那么stty命令可以 ...

  10. 【Autoware】Autoware安装教程

    此篇主要是从自己的csdn copy 在博客园上备份一下哈~ 前提:大家需要换源[软件源和pip源]:git clone的时候走博主给的Gitee的链接吧 不然得等个十万年... 如果想看最终是啥样的 ...