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>