时间:2021-05-20
在项目中使用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.StdOutImplPS:下面看下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>总结
到此这篇关于MyBatisPlus中使用or()和and()遇到的问题的文章就介绍到这了,更多相关MyBatisPlus中使用or()和and()内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
MybatisPlus给我们提供了更加强大的代码生成器MyBatisPlus在3.0.3版本之前使用代码生成器因为存在默认依赖,所以不需要其他的依赖,项目中使用
以下是在使用cx_freeze过程中遇到的问题及解决办法(Win7)1.问题描述:运行exe,启动无数个主程序,导致系统无法使用 原因:在程序中使用了mul
在Laravel中使用cursor来查询并处理数据(轻松处理千万级的数据)事发现场最近在项目中遇到内存不足的问题,测试环境中的PHP内存只有64M,在导出的时候
最近在使用MyBatisPlus,发现在拼接条件的时候,and和or会出问题,比如下面这种QueryWrapperuserWrapper=newQueryWra
一、需求:实现Springboot中MyBatisplus使用IPage和Page分页二、技术:MyBatisplus的IPage和Page三、实现1、代码结构