MyBatisPlus中使用or()和and()遇到的問(wèn)題及細(xì)節(jié)處理
在項(xiàng)目中使用MyBatisPlus中的or()查詢時(shí)由于誤用,導(dǎo)致查詢數(shù)據(jù)不對(duì),僅作記錄。
寫(xiě)法一:
LambdaQueryWrapper<Task> queryWrapper = new QueryWrapper<Task>().lambda(); queryWrapper .eq(Task::getUserId, "15") .eq(Task::getStatus, 2) .or() .eq(Task::getFileSize, 3251544304L);
上面這種寫(xiě)法等價(jià)于下面的sql
SELECT * FROM task WHERE user_id = ? AND status = ? OR file_size = ?
寫(xiě)法二:
LambdaQueryWrapper<Task> queryWrapper2 = new QueryWrapper<Task>().lambda(); queryWrapper2 .eq(Task::getUserId, "15") .and(wrapper -> wrapper.eq(Task::getStatus, 2).or().eq(Task::getFileSize, 3251544304L));
上面這種寫(xiě)法對(duì)應(yīng)的sql如下
SELECT * FROM task WHERE user_id = ? AND ( status = ? OR file_size = ? )
SpringBoot 集成 MyBatisPlus 配置文件添加以下配置即可在控制臺(tái)查看 sql
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
PS:下面看下Mybatis中and和or的細(xì)節(jié)處理
當(dāng)一條SQL中既有條件查又有模糊查的時(shí)候,偶爾會(huì)遇到這樣的and拼接問(wèn)題。參考如下代碼:
<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>
這樣寫(xiě)的錯(cuò)誤是如果a==null那么第二個(gè)條件中就會(huì)多一個(gè)and,語(yǔ)句會(huì)變成select * from *** where and b in (...),而如果條件全都不滿足的話SQL會(huì)變成select * from *** where order by id desc limit...解決辦法:加上<where>標(biāo)簽,如下:
<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>
如上代碼所示,加上一個(gè)<where>標(biāo)簽即可,where標(biāo)簽會(huì)自動(dòng)識(shí)別,如果前面條件不滿足的話,會(huì)自己去掉and。如果滿足的話會(huì)自己加上and。但是這句語(yǔ)句還是有問(wèn)題,就是c條件里的語(yǔ)句里面有一個(gè)or,如果前面全部ab條件中有滿足的話就會(huì)形成這樣的SQL,select * from *** where a = ? and name like '%%' or code like '%%'
,這條就類似SQL注入了,只要后面or條件滿足都能查出來(lái),不滿足需求。解決辦法:給c條件的語(yǔ)句加上(),如下:
<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>
總結(jié)
到此這篇關(guān)于MyBatisPlus中使用or()和and()遇到的問(wèn)題的文章就介紹到這了,更多相關(guān)MyBatisPlus中使用or()和and()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java try-catch-finally異常處理機(jī)制詳解
這篇文章主要介紹了Java try-catch-finally異常處理機(jī)制詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08SpringData整合ElasticSearch實(shí)現(xiàn)CRUD的示例代碼(超詳細(xì))
本文主要介紹了SpringData整合ElasticSearch實(shí)現(xiàn)CRUD的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Java解除文件占用即Dom4j操作后實(shí)現(xiàn)xml關(guān)流
這篇文章主要介紹了Java解除文件占用即Dom4j操作后實(shí)現(xiàn)xml關(guān)流,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Lucene實(shí)現(xiàn)多種高級(jí)搜索形式
這篇文章主要介紹了Lucene實(shí)現(xiàn)多種高級(jí)搜索形式的相關(guān)資料,需要的朋友可以參考下2017-04-04springboot整合apache ftpserver詳細(xì)教程(推薦)
這篇文章主要介紹了springboot整合apache ftpserver詳細(xì)教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01Java多線程并發(fā)的指令重排序問(wèn)題及volatile寫(xiě)屏障原理詳解
這篇文章主要介紹了Java多線程并發(fā)的指令重排序問(wèn)題及volatile寫(xiě)屏障原理詳解,指令重排序是編譯器或處理器為了提高性能而對(duì)指令執(zhí)行順序進(jìn)行重新排列的優(yōu)化技術(shù),需要的朋友可以參考下2024-01-01springboot整合kaptcha生成驗(yàn)證碼功能
這篇文章主要介紹了springboot整合kaptcha生成驗(yàn)證碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10