mybatis foreach 动态插入sql语句

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33229669/article/details/84893046

文章目录


有一个需求是需要写如下的动态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>

猜你喜欢

转载自blog.csdn.net/qq_33229669/article/details/84893046
今日推荐