Mybatis实现批量插入或修改数据(Oracle和MySQL)

Mybatis本身是很灵活的,因为可以自己在XML文件中编写sql进行操作,那就可以一次性将插入到数据库中,这样只用向数据库提交一次,性能也可以提高不少。下面来看一个例子:

首先,在DataMapper.java 接口类中加入接口:

void batchInsertUcfUserBatchImport(List<UcfUserBatchImport> ucfUserBatchImportList) throws Exception;

然后,在DataMapper.xml 中编写对应的实现sql,我使用的是MySQL,如果是Oracle,可能sql语句会略有区别吧:

<insert id="batchInsertUcfUserBatchImport" parameterType="java.util.List">
	<![CDATA[
		INSERT INTO UCF_USER_BATCH_IMPORT (ID,TEXT,STSTUS) VALUES
	]]>
	<foreach collection="list" item="item" index="index" separator="," >
	    <![CDATA[
	        (
	        #{item.id,jdbcType=NUMERIC},
	        #{item.text,jdbcType=VARCHAR},
	        #{item.status,jdbcType=VARCHAR}
	        )
	    ]]>
    </foreach> 
</insert>

最后,在需要批量插入Data数据的地方调用接口:

ucfUserBatchImportDao.batchInsertUcfUserBatchImport(ucfUserBatchImportList);

说明一下xml文件的实现,使用foreach标签,是用来拼接内部的字符串,item就相当于一个指针,用来遍历list中的对象,将每一个item的属性值复制给内部sql之后,一次性执行一个长的sql语句。如果我们从后台打印sql执行语句的话,会看到这样的sql语句

insert into TABLE (ID, TEXT, STAUTS) values
(xx, xx, xx), 
(xx, xx, xx), 
(xx, xx, xx)

从性能方面考虑,不管插入多少条数据,都只用向数据库提交一次,这样效率就会大幅提升。

 

但是Oracle不支持这种语法,我们可以使用insert all来完成批量插入,insert all相关介绍可以参考这里https://blog.csdn.net/diweikang/article/details/89978190

项目中使用的批量添加操作:

	<insert id="insertBatchAgentShareDetail" parameterType="java.util.ArrayList">
		<![CDATA[
		insert all 
		]]>
		<foreach collection="list" item="detail" index="index"> 
			<![CDATA[ 
				INTO UCF_AGENT_SHARE_DETAIL (ID,TOTAL_AMOUNT,TOTAL_FEE_AMOUNT,TOTAL_AGENT_FEE_AMOUNT,TOTAL_SHARE_AMOUNT,
					SHARE_RECORD_ID,PRODUCT_CODE,CARD_TYPE,TRADE_COUNT,SETTLE_DETAIL_ID) 
				VALUES(#{detail.id,jdbcType=VARCHAR},#{detail.totalAmount,jdbcType=NUMERIC},#{detail.totalFeeAmount,jdbcType=NUMERIC},#{detail.totalAgentFeeAmount,jdbcType=NUMERIC},
					#{detail.totalShareAmount,jdbcType=NUMERIC},#{detail.shareRecordId,jdbcType=VARCHAR},#{detail.productCode,jdbcType=VARCHAR},
					#{detail.cardType,jdbcType=VARCHAR},#{detail.tradeCount,jdbcType=NUMERIC},#{detail.settleDetailId,jdbcType=VARCHAR})
			]]>
		</foreach>
		<![CDATA[
		select * from dual
		]]>
	</insert>

如果我们从后台打印sql执行语句的话,会看到这样的sql语句

insert all
into TABLE (ID, TEXT, STAUTS) values (xx, xx, xx)
into TABLE (ID, TEXT, STAUTS) values (xx, xx, xx)
into TABLE (ID, TEXT, STAUTS) values (xx, xx, xx)
select * from dual

项目中使用的批量修改操作:

<update id="updateBatchMerchantSettleRecord" parameterType="java.util.ArrayList">
        <foreach collection="list" item="record" index="index" open="begin" close=";end;" separator=";"> 
        	<![CDATA[ UPDATE UCF_MERCHANT_SETTLE_RECORD ]]>
			<trim prefix="SET" suffixOverrides=",">
				<if test="null != record.shareStatus  and '' != record.shareStatus ">
	                <![CDATA[   SHARE_STATUS = #{record.shareStatus} ,]]>
				</if>
			</trim>
			<trim prefix="WHERE" prefixOverrides="AND">
				<if test="null != record.id and '' != record.id">
	                <![CDATA[ AND ID = #{record.id} ]]>
				</if>
			</trim>
        </foreach>
</update>

 

参考:http://blog.csdn.net/mahoking/article/details/46811865

 

展开阅读全文

没有更多推荐了,返回首页