Oracle + Mybatis實(shí)現(xiàn)批量插入、更新和刪除示例代碼
前言
Mybatis是web工程開發(fā)中非常常用的數(shù)據(jù)持久化的框架,通過該框架,我們非常容易的進(jìn)行數(shù)據(jù)庫的增刪改查。數(shù)據(jù)庫連接進(jìn)行事務(wù)提交的時(shí)候,需要耗費(fèi)的資源比較多,如果需要插入更新的數(shù)據(jù)比較多,而且每次事務(wù)只提交一條數(shù)據(jù),會(huì)造成非常大的數(shù)據(jù)庫資源浪費(fèi),導(dǎo)致數(shù)據(jù)庫性能、系統(tǒng)性能大幅度下降。
關(guān)于mybatis的批量插入,網(wǎng)上的多數(shù)示例多半是關(guān)于MySQL數(shù)據(jù)庫的,關(guān)于Oracle數(shù)據(jù)庫的例子比較少。本文將給大家介紹關(guān)于Oracle+Mybatis批量插入、更新和刪除的相關(guān)內(nèi)容,下面話不多說了,來一起看看詳細(xì)的介紹吧。
1、插入
(1)第一種方式:利用<foreach>標(biāo)簽,將入?yún)⒌膌ist集合通過UNION ALL生成虛擬數(shù)據(jù),從而實(shí)現(xiàn)批量插入(驗(yàn)證過)
<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>
注意:入?yún)⒈仨毷莑ist集合,sql語句中沒有values;
(2)第二種方式:利用存儲(chǔ)過程實(shí)現(xiàn)批量插入(驗(yàn)證過)
<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>
注意:入?yún)⑷匀皇莑ist集合,sql中有values,本質(zhì)是利用存儲(chǔ)過程實(shí)現(xiàn)批量插入;
(3)第三種方式:使用特殊的sql語句(網(wǎng)上搜到的,待驗(yàn)證)
參考博客:http://blog.csdn.net/w_y_t_/article/details/51416201
下面這條sql語句可以實(shí)現(xiàn)一條語句批量插入!
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;
<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>
注意:當(dāng)list的size大于500時(shí),會(huì)失??;
2、更新
(1)第一種方式:同樣是利用存儲(chǔ)過程(網(wǎng)上搜索的,還是上面那個(gè)博客)
<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)第二種方式:利用條件實(shí)現(xiàn)(已驗(yàn)證)
<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的條件實(shí)現(xiàn),類似于下面刪除的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>
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
SpringBoot下使用定時(shí)任務(wù)的方式全揭秘(6種)
這篇文章主要介紹了SpringBoot下使用定時(shí)任務(wù)的方式全揭秘(6種),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02Intelli IDEA安裝Scala插件并安裝Scala軟件和配置環(huán)境變量的詳細(xì)教程
這篇文章主要介紹了Intelli IDEA安裝Scala插件并安裝Scala軟件和配置環(huán)境變量的詳細(xì)教程,需要的朋友可以參考下2020-10-10SpringBoot攔截器實(shí)現(xiàn)登錄攔截的方法示例
這篇文章主要介紹了SpringBoot攔截器實(shí)現(xiàn)登錄攔截的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09SpringBoot之logback-spring.xml不生效的解決方法
這篇文章主要介紹了SpringBoot之logback-spring.xml不生效的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01springboot vue組件開發(fā)實(shí)現(xiàn)接口斷言功能
這篇文章主要為大家介紹了springboot+vue組件開發(fā)實(shí)現(xiàn)接口斷言功能,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05