Oracle + Mybatis實現批量插入、更新和刪除示例程式碼
前言
Mybatis是web工程開發中非常常用的資料持久化的框架,通過該框架,我們非常容易的進行資料庫的增刪改查。資料庫連線進行事務提交的時候,需要耗費的資源比較多,如果需要插入更新的資料比較多,而且每次事務只提交一條資料,會造成非常大的資料庫資源浪費,導致資料庫效能、系統性能大幅度下降。
關於mybatis的批量插入,網上的多數示例多半是關於MySQL資料庫的,關於Oracle資料庫的例子比較少。本文將給大家介紹關於Oracle+Mybatis批量插入、更新和刪除的相關內容,下面話不多說了,來一起看看詳細的介紹吧。
1、插入
(1)第一種方式:利用<foreach>標籤,將入參的list集合通過UNION ALL生成虛擬資料,從而實現批量插入(驗證過)
<insert id="insertBatchLaTContactRecord" parameterType="java.util.Map"> <selectKey resultType="java.lang.Long" keyProperty="dto.id" order="BEFORE"> select seq_LA_T_CONTACT_RECORD.nextval as id from dual </selectKey> insert into la_t_contact_record ( id , contract_id , contacter_add_name , contacter_add_type , contact_add_phone , contact_add_home_address , contact_add_work , contact_add_work_address , create_by , create_time , modify_by , modify_time , validate_state , sys_source , isquery ) select seq_LA_T_CONTACT_RECORD.NEXTVAL,A.* from( <foreach collection="list" item="dto" index="index" separator="UNION ALL"> select #{dto.contractId,jdbcType=VARCHAR} ,#{dto.contacterAddName,jdbcType=VARCHAR} ,#{dto.contacterAddType,jdbcType=VARCHAR} ,#{dto.contactAddPhone,jdbcType=VARCHAR} ,#{dto.contactAddHomeAddress,jdbcType=VARCHAR} ,#{dto.contactAddWork,jdbcType=VARCHAR} ,#{dto.contactAddWorkAddress,jdbcType=VARCHAR} ,#{dto.createBy,jdbcType=DECIMAL} ,systimestamp ,#{dto.modifyBy,jdbcType=DECIMAL} ,#{dto.modifyTime,jdbcType=TIMESTAMP} ,'1' ,#{dto.sysSource,jdbcType=VARCHAR} ,#{dto.isquery,jdbcType=VARCHAR} from dual </foreach>) A </insert>
注意:入參必須是list集合,sql語句中沒有values;
(2)第二種方式:利用儲存過程實現批量插入(驗證過)
<insert id="insertPlanRepaymentOtherfeeBatch" parameterType="java.util.List"> begin <foreach collection="list" item="item" index="index"> insert into lb_t_plan_repayment_otherfee ( id , key , value , term , contract_id, PAY_ORDER, FEE_NAME, INTO_ID ) values(SEQ_LB_T_PLAN_REPAY_OTHERFEE.nextval ,#{item.key,jdbcType=VARCHAR} ,#{item.value,jdbcType=VARCHAR} ,#{item.term,jdbcType=DECIMAL} ,#{item.contractId,jdbcType=VARCHAR} ,#{item.payOrder,jdbcType=DECIMAL} ,#{item.feeName,jdbcType=VARCHAR} ,#{item.intoId,jdbcType=VARCHAR} ); </foreach> end; </insert>
注意:入參仍然是list集合,sql中有values,本質是利用儲存過程實現批量插入;
(3)第三種方式:使用特殊的sql語句(網上搜到的,待驗證)
參考部落格:http://blog.csdn.net/w_y_t_/article/details/51416201
下面這條sql語句可以實現一條語句批量插入!
INSERT ALL
INTO USERINFO(userid,username) VALUES('1001','Tom')
INTO USERINFO(userid,username) VALUES('1002','Black')
INTO USERINFO(userid,username) VALUES('1003','Jetty')
INTO USERINFO(userid,username) VALUES('1004','Cat')
SELECT 1 FROM DUAL;
?
1
2
3
4
5
6
7
<insert id="batchInsertUser" parameterType="java.util.ArrayList">
INSERT ALL
<foreach collection="list" item="userList" index="index">
INTO USERINFO(userid,username) VALUES(#{userList.userid},#{userList.username})
</foreach>
SELECT 1 FROM DUAL
</insert>
注意:當list的size大於500時,會失敗;
2、更新
(1)第一種方式:同樣是利用儲存過程(網上搜索的,還是上面那個部落格)
<update id="batchUpdateUser" parameterType="java.util.ArrayList">
<foreach collection="list" item="userlist" index="index" open="begin" close=";end;" separator=";">
UPDATE USERINFO T
<set>
T.USERID = #{userlist.userid,jdbcType=VARCHAR},
T.USERNAME = #{userlist.username,jdbcType=VARCHAR},
</set>
WHERE
T.USERID = #{userlist.userid,jdbcType=VARCHAR}
</foreach>
</update>
(2)第二種方式:利用條件實現(已驗證)
<update id="updateBatchByListStat" parameterType="java.util.Map">
update la_t_advfinished t1
set t1.list_stat='07',
t1.modify_time =systimestamp
where t1.id in(<foreach collection="ids" separator="," item="id">'${id}'</foreach>)
</update>
注意:同樣可以使用or的條件實現,類似於下面刪除的sql;
3、刪除
與更新第二種方式類似
<delete id="deleteAttractions" parameterType="java.util.List">
delete from ATTRACTIONS
<where>
<foreach collection="list" index="index" item="item" open="(" separator="or" close=")">
id=#{item.id}
</foreach>
</where>
</delete>
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對指令碼之家的支援。
您可能感興趣的文章:
- Oracle批量插入資料的三種方式【推薦】
- C# Oracle批量插入資料進度條的實現程式碼
- MyBatis批量插入資料到Oracle資料庫中的兩種方式(例項程式碼)
- Oracle兩張表關聯批量更新其中一張表的資料
- Oracle批量查詢、刪除、更新使用BULK COLLECT提高效率
- mybatis執行批量更新batch update 的方法(oracle,mysql兩種)
- Oracle批量匯入文字檔案快速的方法(sqlldr實現)
- Oracle+Mybatis的foreach insert批量插入報錯的快速解決辦法
- Java實現mybatis批量插入資料到Oracle
- Oracle批量執行sql語句之禁用所有表的外來鍵
- oracle+mybatis 使用動態Sql當插入欄位不確定的情況下實現批量insert
- Oracle 高速批量資料載入工具sql*loader使用說明
- Oracle資料庫更新大批量資料案例