在开发过程中都会遇到批量的插入或者是更新数据,本人只写了一下自己在做的过程中遇到问题,写此篇文章的作用:第一是记录自己在工作过程中的问题。第二是方便同行的伙伴们避免出现这样的问题消耗太多的时间。废话不多说,直接上代码。
1.批量插入数据
Dao层:
void insertBatch(List<UserPermission> userPermission);
*参数直接是一个List对象
Mapper.xml
<insert id="insertBatch" parameterType="java.util.List" >
<selectKey keyProperty="id" order="BEFORE"
resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user_permission (<include refid="Base_Column_Inserts" />)
values
<foreach collection="list" item="item" index="index" separator=",">
<trim prefix=" (" suffix=")" suffixOverrides="," >
#{item.id,jdbcType=BIGINT},#{item.bid,jdbcType=BIGINT}, #{item.fid,jdbcType=BIGINT},#{item.buttonName,jdbcType=VARCHAR},#{item.buttonState,jdbcType=BIGINT},#{item.effective,jdbcType=BIGINT},#{item.createAt,jdbcType=TIMESTAMP}
</trim>
</foreach>
</insert>
<sql id="Base_Column_Inserts">
id,bid,fid,button_Name,button_state,effective,create_at
</sql>
*这里要值得注意的是:selectKey是用来自增长主键Id,如果使用的mybatis3.3.*以下的版本是有自增长的bug,mybatis3.3.*以上的版本是修复了该bug.
2.批量更新数据
Dao层:
void updateBatch(List<UserPermission> userPermission);
*参数直接是一个List对象
Mapper.xml
<update id="updateBatch" parameterType="java.util.List">
update user_permission
<trim prefix="set" suffixOverrides=",">
<trim prefix="effective =case" suffix="end,">
<foreach collection="list" item="permission">
<if test="permission.effective!=null">
when id=#{permission.id} then #{permission.effective}
</if>
</foreach>
</trim>
<trim prefix="update_at =case" suffix="end,">
<foreach collection="list" item="permission">
<if test="permission.updateAt!=null">
when id=#{permission.id} then #{permission.updateAt}
</if>
</foreach>
</trim>
</trim>
<where>
<foreach collection="list" separator="or" item="permission">
id = #{permission.id}
</foreach>
</where>
</update>
*
一条记录update一次,性能比较差,容易造成阻塞。
MySQL没有提供直接的方法来实现批量更新,但可以使用case when语法来实现这个功能。
UPDATE user_permission
SET name = CASE id
WHEN 1 THEN 'name1'
WHEN 2 THEN 'name2'
WHEN 3 THEN 'name3'
END,
title = CASE id
WHEN 1 THEN 'New Title 1'
WHEN 2 THEN 'New Title 2'
WHEN 3 THEN 'New Title 3'
END
WHERE id IN (1,2,3)
这条sql的意思是,如果id为1,则name的值为name1,title的值为New Title1;依此类推。
以上是我写的最终SQL,仅供小伙伴们参考,臣妾退下了。