MyBatisPlus中使⽤or()和and()遇到的问题及细节处
理
在项⽬中使⽤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
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}%'
jpa mybatis</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 解决办法:加上<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()内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论