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,#{dto.contacterAddType,#{dto.contactAddPhone,#{dto.contactAddHomeAddress,#{dto.contactAddWork,#{dto.contactAddWorkAddress,#{dto.createBy,jdbcType=DECIMAL},systimestamp,#{dto.modifyBy,#{dto.modifyTime,jdbcType=TIMESTAMP},'1',#{dto.sysSource,#{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,PAY_ORDER,FEE_NAME,INTO_ID ) values(SEQ_LB_T_PLAN_REPAY_OTHERFEE.nextval,#{item.key,#{item.value,#{item.term,#{item.contractId,#{item.payOrder,#{item.feeName,#{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,T.USERNAME = #{userlist.username,</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> 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。 您可能感兴趣的文章:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |