Oracle + Mybatis实现批量插入、更新和删除示例代码
程序员文章站
2023-12-13 08:58:28
前言
mybatis是web工程开发中非常常用的数据持久化的框架,通过该框架,我们非常容易的进行数据库的增删改查。数据库连接进行事务提交的时候,需要耗费的资源比较多,如果...
前言
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;
<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>
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。