1. 程式人生 > >mybatis foreach 動態插入sql語句

mybatis foreach 動態插入sql語句

文章目錄


有一個需求是需要寫如下的動態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>