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

网友投稿 2950 2022-11-25


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

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

写法一:

LambdaQueryWrapper queryWrapper = new QueryWrapper().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 queryWrapper2 = new QueryWrapper().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 * from ***

where

a = #{a}

and b in

#{item}

and name like '%${c}%' or code like '%${c}%'

order by id desc

limit #{limit} offset #{page}

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

select * from ***

a = #{a}

and b in

#{item}

and name like '%${c}%' or code like '%${c}%'

order by id desc

limit #{limit} offset #{page}

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

select * from ***

a = #{a}

and b in

#{item}

and (name like '%${c}%' or code like '%${c}%')

order by id desc

limit #{limit} offset #{page}

总结


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java 实现多个list 合并成一个去掉重复的案例
下一篇:关于使用Mybatisplus自带的selectById和insert方法时的一些问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~