在开发过程中都会遇到批量的插入或者是更新数据,本人只写了一下自己在做的过程中遇到问题,写此篇文章的作用:第一是记录自己在工作过程中的问题。第二是方便同行的伙伴们避免出现这样的问题消耗太多的时间。废话不多说,直接上代码。
1.批量插入数据
Dao层:
void insertBatch(List userPermission);
*参数直接是一个List对象
Mapper.xml
resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
insert into user_permission ()
values
#{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}
id,bid,fid,button_Name,button_state,effective,create_at
*这里要值得注意的是:selectKey是用来自增长主键Id,如果使用的mybatis3.3.*以下的版本是有自增长的bug,mybatis3.3.*以上的版本是修复了该bug.
2.批量更新数据
Dao层:
void updateBatch(List userPermission);
*参数直接是一个List对象
Mapper.xml
update user_permission
when id=#{permission.id} then #{permission.effective}
when id=#{permission.id} then #{permission.updateAt}
id = #{permission.id}
*
一条记录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,仅供小伙伴们参考,臣妾退下了。