Oracle使用Mybatis實現批量插入或修改資料(Oracle)____Oracle

來源:互聯網
上載者:User

  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


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.