mybatis高效率批量update

zoeybug 2013-10-09 02:54:03
小弟想要批量update数据,以便减少与Oracle的交互。使用mybatis。
我一种写法:
<update id="batchUpdateTest" parameterType="java.util.List">
<foreach collection="list" item="i" separator="" open="begin" close="end;">

update table_x set

name=#{i.name}

where id= #{i.id};
</foreach>
</update>

但发现效率还不如一条一条update,多次交互更新。

试问大伙,有没有其他的写法,增加效率的???
...全文
62248 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
可可keketrtr 2016-04-28
  • 打赏
  • 举报
回复
更新单条记录 UPDATE course SET name = 'course1' WHERE id = 'id1'; 更新多条记录的同一个字段为同一个值 UPDATE course SET name = 'course1' WHERE id in ('id1', 'id2', 'id3); 更新多条记录为多个字段为不同的值 比较普通的写法,是通过循环,依次执行update语句。 Mybatis写法如下: <update id="updateBatch" parameterType="java.util.List"> <foreach collection="list" item="item" index="index" open="" close="" separator=";"> update course <set> name=${item.name} </set> where id = ${item.id} </foreach> </update> 一条记录update一次,性能比较差,容易造成阻塞。 MySQL没有提供直接的方法来实现批量更新,但可以使用case when语法来实现这个功能。 UPDATE course 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;依此类推。 在Mybatis中的配置则如下: <update id="updateBatch" parameterType="list"> update course <trim prefix="set" suffixOverrides=","> <trim prefix="peopleId =case" suffix="end,"> <foreach collection="list" item="i" index="index"> <if test="i.peopleId!=null"> when id=#{i.id} then #{i.peopleId} </if> </foreach> </trim> <trim prefix=" roadgridid =case" suffix="end,"> <foreach collection="list" item="i" index="index"> <if test="i.roadgridid!=null"> when id=#{i.id} then #{i.roadgridid} </if> </foreach> </trim> <trim prefix="type =case" suffix="end," > <foreach collection="list" item="i" index="index"> <if test="i.type!=null"> when id=#{i.id} then #{i.type} </if> </foreach> </trim> <trim prefix="unitsid =case" suffix="end," > <foreach collection="list" item="i" index="index"> <if test="i.unitsid!=null"> when id=#{i.id} then #{i.unitsid} </if> </foreach> </trim> </trim> where <foreach collection="list" separator="or" item="i" index="index" > id=#{i.id} </foreach> </update>
waterorblue 2016-02-25
  • 打赏
  • 举报
回复
我想知道最后楼主是怎么解决的了
安特矮油 2013-10-09
  • 打赏
  • 举报
回复
其实何苦纠结于此了,框架不能满足的时候可以考虑换一种实现方式撒,总不能就被框架搞死了撒
GreatLiw 2013-10-09
  • 打赏
  • 举报
回复
我以前也是用过mybatis做项目,批量关联删除用in,foreach拼凑的sql,mybatis好像没有什么批量删除的方法, 你这样写跟一条条执行没啥区别
zoeybug 2013-10-09
  • 打赏
  • 举报
回复
引用 2 楼 abstruct 的回复:
个人觉得应该没问题,主要是你数据量有多大,加大数据量再测试一下看看
不是数据了的问题……我只是测试10条数据的update。 mybatis完全是靠List数据拼出十条update……应该不是数据了的问题
zoeybug 2013-10-09
  • 打赏
  • 举报
回复
引用 4 楼 defonds 的回复:
批量操作的话最适合的还是 jdbc,框架实现批量是很慢的
项目要求用mybatis,我也没办法……
zoeybug 2013-10-09
  • 打赏
  • 举报
回复
引用 3 楼 AFer198215 的回复:
不能吧,这位亲确定有没有session.commit(false);及session.commit(); ? 另外,我一般这么写

	<insert id="insertBatch" parameterType="mybatis.bean.TTest3">
		insert into test3(name,value,ftname)values
		<foreach collection="list" item="item" index="index" separator=",">
			(#{item.name},#{item.value},'')
		</foreach>
	</insert>
我只能呵呵了……
Defonds 2013-10-09
  • 打赏
  • 举报
回复
批量操作的话最适合的还是 jdbc,框架实现批量是很慢的
想喝咖啡的貓 2013-10-09
  • 打赏
  • 举报
回复
不能吧,这位亲确定有没有session.commit(false);及session.commit(); ? 另外,我一般这么写

	<insert id="insertBatch" parameterType="mybatis.bean.TTest3">
		insert into test3(name,value,ftname)values
		<foreach collection="list" item="item" index="index" separator=",">
			(#{item.name},#{item.value},'')
		</foreach>
	</insert>
安特矮油 2013-10-09
  • 打赏
  • 举报
回复
个人觉得应该没问题,主要是你数据量有多大,加大数据量再测试一下看看
zoeybug 2013-10-09
  • 打赏
  • 举报
回复
难道,没人会?还是mybatis对批量update无能为力

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧