1. 程式人生 > 程式設計 >MyBatisPlus中使用or()和and()遇到的問題及細節處理

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

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

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}%'
  </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()內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!