您当前的位置: 首页 >  sql

java持续实践

暂无认证

  • 2浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

mybatis foreach 动态插入sql语句

java持续实践 发布时间:2018-12-08 15:52:41 ,浏览量:2

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

那么就需要用到mybatis的foreach了. 需要在mybatis中传入数组进去. 网上大多数关于foreach的用法是关于in的循环的.如下

  
    select * from t_blog where id in
    
          #{item}
     
     

但是上面的用法并不符合需求. 需要进行改造.

Model

首先在模型中,要有一个数组的属性

Service

在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
    
关注
打赏
1658054974
查看更多评论
立即登录/注册

微信扫码登录

0.0416s