文章目录
有一个需求是需要写如下的动态sql ,
‘149’,‘145’ 这些个数的不确定的,
- Model
- Service
- dao
- Mapper

那么就需要用到mybatis的foreach了. 需要在mybatis中传入数组进去. 网上大多数关于foreach的用法是关于in的循环的.如下
select * from t_blog where id in
#{item}
但是上面的用法并不符合需求. 需要进行改造.
Model首先在模型中,要有一个数组的属性
在service层中,对模型的数组属性进行赋值 调用setLableIds方法
public List 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 getFavAndList(FavModel model);
Mapper
其中foreach的写法如下
and tagSplit(s.lableids, ${value}) = 1
注意: **在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 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
and tagSplit(s.lableids, ${value}) = 1
) 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
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)
AND B.STATUS = 1
AND A.STAFF_ID=#{staff_id}
AND B.TITLE LIKE '%'||#{keyword}||'%'
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