Mybatis本身是很靈活的,因為可以自己在XML檔案中編寫sql進行操作,那就可以一次性將插入到資料庫中,這樣只用向資料庫提交一次,效能也可以提高不少。下面來看一個例子:
首先,在DataMapper.java 介面類中加入介面:
void batchInsertUcfUserBatchImport(List<UcfUserBatchImport> ucfUserBatchImportList) throws Exception;
然後,在DataMapper.xml 中編寫對應的實現sql,我使用的是oracle,如果是mysql或sqlserver,可能sql語句會略有區別吧:
<insert id="batchInsertUcfUserBatchImport" parameterType="java.util.List"><![CDATA[INSERT INTO UCF_USER_BATCH_IMPORT (ID,REF_MERCHANT,REF_USER,REAL_NAME,REG_CELL,RGN_CODE,CERT_TYPE,CERT_NO,BANK_NAME,BANK_CARD_TYPE,BANK_CODE,BANK_CARD_NO,BANK_PROVINCE,BANK_CITY,BANK_CELL,CERT_STATUS,NOTICE_URL,GMT_CREATE)]]><foreach collection="list" item="item" index="index" open="(" close=")" separator="union" ><![CDATA[ select #{item.id,jdbcType=NUMERIC},#{item.merchantId,jdbcType=VARCHAR},#{item.refUserId,jdbcType=VARCHAR}, #{item.realName,jdbcType=VARCHAR},#{item.regCell,jdbcType=VARCHAR},#{item.rgncode,jdbcType=VARCHAR}, #{item.certType,jdbcType=VARCHAR},#{item.certNo,jdbcType=VARCHAR},#{item.bankName,jdbcType=VARCHAR}, #{item.bankCardType,jdbcType=VARCHAR},#{item.bankCode,jdbcType=VARCHAR},#{item.bankCardNo,jdbcType=VARCHAR}, #{item.bankProvince,jdbcType=VARCHAR},#{item.bankCity,jdbcType=VARCHAR},#{item.bankCell,jdbcType=VARCHAR}, #{item.certStatus,jdbcType=VARCHAR},#{item.noticeUrl,jdbcType=VARCHAR},sysdate from dual ]]> </foreach> </insert>
最後,在需要批量插入Data資料的地方調用介面:
ucfUserBatchImportDao.batchInsertUcfUserBatchImport(ucfUserBatchImportList);
說明一下xml檔案的實現,使用foreach標籤,是用來拼接內部的字串,item就相當於一個指標,用來遍曆list中的對象,將每一個item的屬性值複製給內部sql之後,用union拼接起來,一次性執行一個長的sql語句。 如果我們從後台列印sql執行語句的話,會看到這樣的sql語句
insert into TABLE (ID, TEXT, STAUTS) (select ?, ?, ? from dual union select ?, ?, ? from dual union select ?, ?, ? from dual )
從效能方面考慮,不管插入多少條資料,都只用向資料庫提交一次,這樣效率就會大幅提升。
項目中使用的大量新增操作:
<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>
項目中使用的批量修改操作:
<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