最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatisPlus中使用or()和and()遇到的問題及細(xì)節(jié)處理

 更新時(shí)間:2020年08月26日 10:51:31   作者:番茄炒蛋不加蛋  
這篇文章主要介紹了MyBatisPlus中使用or()和and()遇到的問題,本文通過多種寫法實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

在項(xiàng)目中使用MyBatisPlus中的or()查詢時(shí)由于誤用,導(dǎo)致查詢數(shù)據(jù)不對(duì),僅作記錄。

寫法一:

LambdaQueryWrapper<Task> queryWrapper = new QueryWrapper<Task>().lambda();
 queryWrapper
  .eq(Task::getUserId, "15")
  .eq(Task::getStatus, 2)
  .or()
  .eq(Task::getFileSize, 3251544304L);

上面這種寫法等價(jià)于下面的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));

上面這種寫法對(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拼接問題。參考如下代碼:

<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>

這樣寫的錯(cuò)誤是如果a==null那么第二個(gè)條件中就會(huì)多一個(gè)and,語句會(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。但是這句語句還是有問題,就是c條件里的語句里面有一個(gè)or,如果前面全部ab條件中有滿足的話就會(huì)形成這樣的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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

柯坪县| 丹东市| 汨罗市| 鹰潭市| 广宁县| 桂平市| 南岸区| 鹿泉市| 丰城市| 当涂县| 望奎县| 长白| 承德市| 法库县| 彝良县| 拜泉县| 师宗县| 阿荣旗| 射洪县| 静安区| 祁阳县| 蛟河市| 神农架林区| 乌鲁木齐县| 丹凤县| 钦州市| 芒康县| 霍山县| 永福县| 合山市| 秦皇岛市| 神木县| 九台市| 温州市| 承德县| 古交市| 康平县| 四川省| 桂东县| 西贡区| 石棉县|