mysql数据库,使用mybatis进行批量更新

本文详细介绍如何在MyBatis中使用动态SQL实现批量更新操作,通过配置允许多查询并在mapper.xml中使用foreach标签,有效地提高了数据库操作效率。

环境:

db:mysql5.6.22
mybatis:3.4.5


动态拼接成:

update xx set xx=xx;

update xx set xx=xx;

update xx set xx=xx;

这种形式的去进行批量更新操作

注:使用这种方式需要在jdbc:mysql://xx.xx.xx.xx:3306/db_name?配置下加上参数allowMultiQueries=true(allowMultiQueries区分大小写)
即:jdbc:mysql://xx.xx.xx.xx:3306/db_name?allowMultiQueries=true
    
mapper.xml中

<update id="updateList" parameterType="java.util.List">
	<foreach close=";" collection="list" index="index" item="test" open="" separator=";">
		update t_test
		<set>
			<if test="test.name!=null">
				name=#{test.name,jdbcType=VARCHAR},
			</if>
			<if test="test.sex!=null">
				sex=#{test.sex,jdbcType=VARCHAR},
			</if>
		</set>
		where id=#{test.id}
	</foreach>
</update>

 

不同数据库使用MyBatis进行批量更新时,性能会受到多种因素的影响,以下是几种常见数据库的性能差异分析: #### MySQL - **`ON DUPLICATE KEY UPDATE`方式**:这种方式适用于处理插入和更新批量操作,若记录已存在则更新,不存在则插入。由于它将插入和更新操作合并,减少了与数据库的交互次数,在处理有主键或唯一键冲突的数据时,性能表现较好。例如: ```xml <insert id="updateBatch3" parameterType="java.util.List"> insert into user (name,pwd) values <foreach collection="list" item="item" index="index" separator=","> (#{item.name },#{item.pwd}) </foreach> ON DUPLICATE KEY UPDATE id=VALUES(id),name = VALUES(name),pwd =VALUES(pwd) </insert> ``` - **分号分隔多个`UPDATE`语句方式**:通过`<foreach>`标签生成多个`UPDATE`语句并以分号分隔。不过MyBatis映射文件中的SQL语句默认不支持以分号结尾,即不支持多条SQL语句的执行,需要在连接MySQL的URL上加`&allowMultiQueries=true`才可执行。当数据量较大时,这种方式会增加数据库的解析负担,性能可能会有所下降。示例如下: ```xml <update id="updateCarrierWayStatus" parameterType="java.util.List"> <foreach collection="list" item="item" index="index" separator=";"> UPDATE order_main_info <set> <if test="item != null"> carrier_way_flag = #{item.carrierWayFlag}, remarks = #{item.remarks} </if> </set> WHERE customer_order_no = #{item.customerOrderNo} </foreach> </update> ``` #### Oracle Oracle可使用`begin...end;`块来执行批量更新,将多个`UPDATE`语句组合起来执行。这种方式在处理大量数据时,由于需要在PL/SQL块中处理,会增加数据库的内存开销,性能可能不如MySQL的某些批量更新方式。示例代码如下: ```xml <update id="updateUserDO" parameterType="list"> <foreach collection="list" item="param" separator="" open="begin" close="end;"> update user <set> <if test="null!=param.account and ''!=param.account"> account =#{param.account}, </if> <if test="null!=param.userName and ''!=param.userName"> user_name =#{param.userName}, </if> </set> where uuid = #{param.uuid}; </foreach> </update> ``` #### 达梦数据库 MyBatis有三种基本的Executor执行器:Simple、Reuse、Batch。不同的执行器对批量更新性能有影响。Simple执行器每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象,这种方式在批量更新时会频繁创建和销毁Statement对象,性能较低。而Batch执行器可以将多个SQL语句批量发送给数据库执行,能有效减少与数据库的交互次数,提高批量更新性能。 ### 总结 不同数据库批量更新性能差异主要体现在数据库自身的特性、SQL语法支持以及执行器的实现上。在选择批量更新方式时,需要根据数据库类型、数据量大小、业务需求等因素综合考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值