MyBatisPlus中使用or()和and()遇到的问题及细节处理

所属分类: 软件编程 / java 阅读数: 71
收藏 0 赞 0 分享

在项目中使用MyBatisPlus中的or()查询时由于误用,导致查询数据不对,仅作记录。

写法一:

LambdaQueryWrapper<Task> queryWrapper = new QueryWrapper<Task>().lambda();
 queryWrapper
  .eq(Task::getUserId, "15")
  .eq(Task::getStatus, 2)
  .or()
  .eq(Task::getFileSize, 3251544304L);

上面这种写法等价于下面的sql

SELECT * FROM task WHERE user_id = ? AND status = ? OR file_size = ? 

写法二:

LambdaQueryWrapper<Task> queryWrapper2 = new QueryWrapper<Task>().lambda();
 queryWrapper2
  .eq(Task::getUserId, "15")
  .and(wrapper -> wrapper.eq(Task::getStatus, 2).or().eq(Task::getFileSize, 3251544304L));

上面这种写法对应的sql如下

SELECT * FROM task WHERE user_id = ? AND ( status = ? OR file_size = ? )

SpringBoot 集成 MyBatisPlus 配置文件添加以下配置即可在控制台查看 sql

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

PS:下面看下Mybatis中and和or的细节处理

当一条SQL中既有条件查又有模糊查的时候,偶尔会遇到这样的and拼接问题。参考如下代码:

<select id="listSelectAllBusiness">
  select * from ***
  where 
  <if test="a!= null">
   a = #{a}
  </if>
  <if test="b!= null">
   and b in
   <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
    #{item}
   </foreach>
  </if>
  <if test="c!= null">
   and name like '%${c}%' or code like '%${c}%'
  </if>
   order by id desc
   limit #{limit} offset #{page}
</select>

这样写的错误是如果a==null那么第二个条件中就会多一个and,语句会变成select * from *** where and b in (...),而如果条件全都不满足的话SQL会变成select * from *** where order by id desc limit...解决办法:加上<where>标签,如下:

<select id="listSelectAllBusiness">
  select * from ***
  <where> 
  <if test="a!= null">
   a = #{a}
  </if>
  <if test="b!= null">
   and b in
   <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
    #{item}
   </foreach>
  </if>
  <if test="c!= null">
   and name like '%${c}%' or code like '%${c}%'
  </if>
  </where>
   order by id desc
   limit #{limit} offset #{page}
</select>

如上代码所示,加上一个<where>标签即可,where标签会自动识别,如果前面条件不满足的话,会自己去掉and。如果满足的话会自己加上and。但是这句语句还是有问题,就是c条件里的语句里面有一个or,如果前面全部ab条件中有满足的话就会形成这样的SQL,select * from *** where a = ? and name like '%%' or code like '%%',这条就类似SQL注入了,只要后面or条件满足都能查出来,不满足需求。解决办法:给c条件的语句加上(),如下:

<select id="listSelectAllBusiness">
  select * from ***
  <where> 
  <if test="a!= null">
   a = #{a}
  </if>
  <if test="b!= null">
   and b in
   <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
    #{item}
   </foreach>
  </if>
  <if test="c!= null">
   and (name like '%${c}%' or code like '%${c}%')
  </if>
  </where>
   order by id desc
   limit #{limit} offset #{page}
</select>
更多精彩内容其他人还在看

Javaweb 鼠标移入移出表格颜色变化的实现

这篇文章主要介绍了Javaweb 鼠标移入移出表格颜色变化的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Java 实现图片压缩的两种方法

这篇文章主要介绍了Java 实现图片压缩的两种方法,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

据说这个是可以撸到2089年的idea2020.2(推荐)

这篇文章主要介绍了据说这个是可以撸到2089年的idea2020.2,本教程给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

一篇文章带你搞定SpringBoot不重启项目实现修改静态资源

这篇文章主要介绍了一篇文章带你搞定SpringBoot不重启项目实现修改静态资源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

win10操作系统下重启电脑java环境变量失效

这篇文章主要介绍了win10操作系统下重启电脑java环境变量失效,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Java实现批量修改文件名和重命名的方法

这篇文章主要介绍了Java实现批量修改文件名和重命名的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

关于Java HashMap自动排序的简单剖析

这篇文章主要给大家介绍了关于Java HashMap自动排序的简单剖析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring中BeanFactory和ApplicationContext的作用和区别(推荐)

这篇文章主要介绍了Spring中BeanFactory和ApplicationContext的作用和区别,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java程序执行Cmd指令所遇问题记录及解决方案

这篇文章主要介绍了Java程序执行Cmd指令所遇问题记录,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

深入浅析jni中的java接口使用

这篇文章主要介绍了jni中的java接口使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多