MyBatisPlus中使用or()和and()遇到的問題及細節(jié)處理
在項目中使用MyBatisPlus中的or()查詢時由于誤用,導(dǎo)致查詢數(shù)據(jù)不對,僅作記錄。
寫法一:
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));
上面這種寫法對應(yīng)的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的細節(jié)處理
當(dāng)一條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>標(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>
如上代碼所示,加上一個<where>標(biāo)簽即可,where標(biāo)簽會自動識別,如果前面條件不滿足的話,會自己去掉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>
總結(jié)
到此這篇關(guān)于MyBatisPlus中使用or()和and()遇到的問題的文章就介紹到這了,更多相關(guān)MyBatisPlus中使用or()和and()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java try-catch-finally異常處理機制詳解
這篇文章主要介紹了Java try-catch-finally異常處理機制詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08SpringData整合ElasticSearch實現(xiàn)CRUD的示例代碼(超詳細)
本文主要介紹了SpringData整合ElasticSearch實現(xiàn)CRUD的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Java解除文件占用即Dom4j操作后實現(xiàn)xml關(guān)流
這篇文章主要介紹了Java解除文件占用即Dom4j操作后實現(xiàn)xml關(guān)流,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04springboot整合apache ftpserver詳細教程(推薦)
這篇文章主要介紹了springboot整合apache ftpserver詳細教程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01Java多線程并發(fā)的指令重排序問題及volatile寫屏障原理詳解
這篇文章主要介紹了Java多線程并發(fā)的指令重排序問題及volatile寫屏障原理詳解,指令重排序是編譯器或處理器為了提高性能而對指令執(zhí)行順序進行重新排列的優(yōu)化技術(shù),需要的朋友可以參考下2024-01-01