mybatis foreach 動態插入sql語句
阿新 • • 發佈:2018-12-30
文章目錄
有一個需求是需要寫如下的動態sql ,
‘149’,‘145’ 這些個數的不確定的,
那麼就需要用到mybatis的foreach了.
需要在mybatis中傳入陣列進去.
網上大多數關於foreach的用法是關於in的迴圈的.如下
<select id="dynamicForeach2Test" parameterType="java.util.ArrayList" resultType ="Blog">
select * from t_blog where id in
<foreach collection="array" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
但是上面的用法並不符合需求. 需要進行改造.
Model
首先在模型中,要有一個數組的屬性
Service
在service層中,對模型的陣列屬性進行賦值
呼叫setLableIds方法
public List<HashMap<String, String>> getFavAndList(FavModel model) {
String lableId = model.getLableId();
String[] array = lableId.split(",");
model.setLableIds(array);
try {
return favDao.getFavAndList(model);
} catch (Exception e) {
e.printStackTrace();
}
return favDao.getFavAndList(model);
}
dao
List<HashMap<String,String>> getFavAndList(FavModel model);
Mapper
其中foreach的寫法如下
<foreach collection="lableIds" item="value" index="index" >
and tagSplit(s.lableids, ${value}) = 1
</foreach>
注意:
**在foreach的屬性中,不需要寫open="(" separator="," close=")".
其中collection中的值,要和model陣列屬性名對應上. **
item的value,就是${value},要對應上. 會把每次的陣列變數的值,給賦值過去.
最後會形成如下的sql語句.
此處是加了where的標籤. 因此第一個語句的前面是沒有and的.
tagSplit(s.lables, 137) = 1 and
tagSplit(s.lables, 148) = 1 and
tagSplit(s.lables, 147) = 1
也可以寫成如下的sql
最後形成的sql語句如下
額外的. 如果加了separator=",", 那麼會導致在遍歷sql的時候, 每句話,都加上逗號了.
完整的sql語句如下
<!--標籤和收藏知識的並集查詢-->
<select id="getFavAndList" parameterType="com.ckms.comp.client.im.fav.model.FavModel" resultType="java.util.Map">
SELECT DISTINCT b.kid,
A.FAV_ID,
A.FAV_TYPE,
A.SORT_NUM,
A.STAFF_ID,
B.TITLE,
F.STAFF_NAME,
wm_concat(g.lable_name) lable_name
FROM
(select s.km_id
from (select wm_concat(t.lable_id) lableids,
t.km_id
from KM_LABLE_HRM t
where t.hrm_id = #{staff_id}
group by t.km_id) s
<where>
<foreach collection="lableIds" item="value" index="index" >
and tagSplit(s.lableids, ${value}) = 1
</foreach>
</where>
) s
left join IM_FAVORITES A
on s.km_id = a.fav_id
left join KM_DOCUMENT B
on A.FAV_ID = B.KID
left join HRM_STAFF F
on B.GATHERERS = F.STAFF_ID
left join KM_DOC_NODE E
on B.KID = E.KID
left join km_lable_hrm h
on b.kid = h.km_id
left join km_lable g
on g.lable_id = h.lable_id
WHERE A.FAV_TYPE=1
<if test="dataPurviewString!=null and dataPurviewString!=''">
AND exists (SELECT C.NODE_ID
FROM SSO_GROUP_PERMISSION T, SSO_DATA_PERMISSION C
WHERE C.PERMISSION_ID = T.PERMISSION_ID
AND GROUP_ID in (${dataPurviewString})
AND C.FUNCTIONAL_ID = 1 AND E.NODE_ID=C.NODE_ID)
</if>
AND B.STATUS = 1
<if test="staff_id!=null and staff_id!=''">
AND A.STAFF_ID=#{staff_id}
</if>
<if test="keyword!=null and keyword!=''">
AND B.TITLE LIKE '%'||#{keyword}||'%'
</if>
group by b.kid, A.FAV_ID,
A.FAV_TYPE,
A.SORT_NUM,
A.STAFF_ID,
B.TITLE,
F.STAFF_NAME
ORDER BY A.SORT_NUM
</select>