前言
Mybatis是web工程開發中非常常用的數據持久化的框架,通過該框架,我們非常容易的進行數據庫的增刪改查。數據庫連接進行事務提交的時候,需要耗費的資源比較多,如果需要插入更新的數據比較多,而且每次事務只提交一條數據,會造成非常大的數據庫資源浪費,導致數據庫性能、系統性能大幅度下降。
關于mybatis的批量插入,網上的多數示例多半是關于MySQL數據庫的,關于Oracle數據庫的例子比較少。本文將給大家介紹關于Oracle+Mybatis批量插入、更新和刪除的相關內容,下面話不多說了,來一起看看詳細的介紹吧。
1、插入
(1)第一種方式:利用<foreach>標簽,將入參的list集合通過UNION ALL生成虛擬數據,從而實現批量插入(驗證過)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
<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)第二種方式:利用存儲過程實現批量插入(驗證過)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
< 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語句可以實現一條語句批量插入!
1
2
3
4
5
6
|
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)第一種方式:同樣是利用存儲過程(網上搜索的,還是上面那個博客)
1
2
3
4
5
6
7
8
9
10
11
|
<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)第二種方式:利用條件實現(已驗證)
1
2
3
4
5
6
|
<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、刪除
與更新第二種方式類似
1
2
3
4
5
6
7
8
|
<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> |
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://www.cnblogs.com/dahaihh-2018/p/8259441.html