mybatis foreach 批量

阅读数:73 评论数:0

跳转到新版页面

分类

python/Java

正文

一、批量插入

<insert id="insertList" parameterType="java.util.List">
        insert into t_enterprise_water_ele
        (
        /*方法一*/
        -- WATER_ELE_ID,
        -- ENTERPRISE_ID,
        -- ENTERPRISE_USCC,
        -- ENTERPRISE_NAME,
        -- YEARMONTH,
        -- WATER_SIZE,
        -- WATER_AMOUNT,
        -- ELE_SIZE,
        -- ELE_AMOUNT,
        -- STATUS,
        -- OPERATOR,
        -- OPERATE_TIME
        /*方法二*/
        <include refid="Base_Column_List"/>
        )
        VALUES
        <foreach collection="list" item="item" index="index" separator=",">
            (
            #{item.waterEleId,jdbcType=VARCHAR},
            #{item.enterpriseId,jdbcType=VARCHAR},
            #{item.enterpriseUscc,jdbcType=VARCHAR},
            #{item.enterpriseName,jdbcType=VARCHAR},
            #{item.yearmonth,jdbcType=VARCHAR},
            #{item.waterSize,jdbcType=DECIMAL},
            #{item.waterAmount,jdbcType=VARCHAR},
            #{item.eleSize,jdbcType=DOUBLE},
            #{item.eleAmount,jdbcType=VARCHAR},
            #{item.status,jdbcType=INTEGER},
            #{item.operator,jdbcType=VARCHAR},
            #{item.operateTime,jdbcType=TIMESTAMP}
            )
        </foreach>
    </insert>

foreach的属性:

(1)item表示集合中每一个元素进行迭代时的别名

(2)index相当于迭代索引,指向迭代到的位置

(3)open表示该语句以什么开始,close表示以什么结束

(4)separator表示每次迭代之间以什么符号作为分隔符

(5)collection属性,遍历的对象,List对象默认用list代替作为键,数组对象有array代替作为键,Map对象没有默认的键,这个名字可以在foreach里面随便引用。当然在作为入参时可以使用@Param("key")来设置键,设置keyName后,list和array将会失效。

当为一个对象的某个字段的时候,例如

如果User有属性List ids,入参是User对象,那么collection=“ids”

如果User有属性Ids ids,Ids也是一个对象,Ids有个属性List id,入参是User对象,那么collection="ids.id"。

如果传入参数类型为map,这个入参有注解@Param("params"),则map的所有key集合可以写成params.keys,所有值集合可以写成params.values。这样foreach就可以对key集合或值集合进行迭代。

public interface UserMapper {
   //如果使用@param("xxx")注解的话,foreach集合中的colleciton的值可以是"xxx.keys"
    public int insertUser(Map<String,Map<String,Object>> param); 
    public int insertUsers(Map<String,List<Object>> param);
}
<insert id="insertUser" parameterType="map">
    insert into tb_user 
    <foreach collection="keys" index="key" item="value" open="(" close=")" separator=",">
       ${key} <!--此处用$,不要用#,这里是连接的需要,不是占位 -->
    </foreach>
    values
    <foreach collection="keys" item="value1" open="(" close=")" separator=",">
       #{value1}
    </foreach>
    <!-- 第二次foreach时,其实循环的顺序和第一次是一样的,因为此时map是一定的,并没有增删-->
</insert>
    <!--( id, user_name, password,
    name, age, birthday, created, updated) valu  -->
<insert id="insertUsers">
       insert into tb_user
       ( id, user_name, password,sex,
         name, age, birthday, created, updated)
       values
       <foreach collection="keys" item="value"  separator=",">
          (null,#{value.userName},#{value.password},#{value.sex},#{value.name},#{value.age},#{value.birthday},#{value.created},#{value.updated})
       </foreach>
    </insert>

二、批量更新

int updateBatchStateByPrimaryKeySelective(@Param("arrArticleid") Integer[] arrArticleid, @Param("state") Byte state, @Param("userid") Integer userid);

<update id="updateBatchStateByPrimaryKeySelective">
    update ARTICLE
    set STATE = #{state,jdbcType=TINYINT}
    where AUTHORID in
      <foreach collection="arrArticleid" index="index" item="item" open="(" separator="," close=")">
        #{item,jdbcType=INTEGER}
      </foreach>
    and CREATORID = #{userid,jdbcType=INTEGER}
</update>

三、foreach遍历map

1、利用map的entrySet

 <insert id="XXX" parameterType="java.util.Map">
    INSERT INTO table(a, b)
    VALUES
    <foreach collection="param.entrySet()" open="(" separator="," close=")" index="key" item="val">
        #{key}, #{val}
    </foreach>
  </insert>
</mapper>

2、方式二

<insert id="XXX" parameterType="java.util.Map">
    INSERT INTO table
    <foreach collection="params.keys" item="key" open="(" separator="," close=")">
        获取值:#{param[key]}
        键:#{key}
    </foreach>
    VALUES
    <foreach collection="param.value" item="val" open="(" separator="," close=")">
       值:#{val}
   </foreach>
</insert>



相关推荐