情景:查詢數據庫中文章的相關文章 文章爲一個表 字段tags爲相關文章字符串中間用','逗號進行啦分割數據庫
查詢完一個文章後能夠把tags字段構造爲一個List<String> 而後利用這個集合做爲條件來查詢app
<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>
字符串
看。 foreach 生成的效果是集合 轉化爲下面的it
select * from t_news n where ( ? in n.tags , ? in n.tags )io
foreach元素的屬性主要有 item,index,collection,open,separator,close。foreach
item表示集合中每個元素進行迭代時的別名.List
index指 定一個名字,用於表示在迭代過程當中,每次迭代到的位置.select
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>
<lect>
生成的SQL爲
select * from t_news n where n.tags like ? or n.tags like ?
foreach : 用的更多的地方爲: 根據Id批量刪除 / 判斷什麼 in 集合中(此時須要生成(**,***,)的形式)