mybatis foreach標籤的解釋 與常用之處

weixin_34198881發表於2019-01-07

情景:查詢資料庫中文章的相關文章   文章為一個表 欄位tags為相關文章字串中間用','逗號進行啦分割

查詢完一個文章後可以把tags欄位構造為一個List<String> 然後利用這個集合作為條件來查詢

 

<select id="selectTestForEach" parameterType="News" resultMap="NewsResultMapper">
  select * from t_news n where 
  <foreach collection="listTag" index="index" item="tag" open="("
    separator="," close=")">
   #{tag} in n.tags
  </foreach>
 </select>

  

看。 foreach 生成的效果是集合 轉化為下面的

 select * from t_news n where ( ? in n.tags , ? in n.tags )

 


foreach元素的屬性主要有 item,index,collection,open,separator,close。

item表示集合中每一個元素進行迭代時的別名.

index指 定一個名字,用於表示在迭代過程中,每次迭代到的位置.

open表示該語句以什麼開始,separator表示在每次進行迭代之間以什麼符號作為分隔 符.

close表示以什麼結束.

 

<select id="selectTestForEach" parameterType="News" resultMap="NewsResultMapper">
  select * from t_news n where 
  <foreach collection="listTag" index="index" item="tag" open=""
    separator="or" close="">
   #{tag} in n.tags
  </foreach>
 </select>

  

所以 去除左右括號 和 把,改成 or 進行 。 就可以轉化為這種形式。
select * from t_news n where ? in n.tags or ? in n.tags   這樣可以用List<String> 來查。

 

但是查不到資料
需要使用如下方式:

<select id="selectTestForEach" parameterType="News" resultMap="NewsResultMapper">
  select * from t_news n where 
  <foreach collection="listTag" index="index" item="tag" open=""
    separator="or" close="">
    n.tags like  '%'||#{tag}||'%'
  </foreach>
<select>

  

生成的SQL為

select * from t_news n where n.tags like ? or n.tags like ?    

 

foreach : 用的更多的地方為: 根據Id批量刪除    /    判斷什麼 in 集合中(此時需要生成(**,***,)的形式)

相關文章