zoukankan      html  css  js  c++  java
  • Oracle+Mybatis批量插入,更新和删除

    1、插入

    (1)第一种方式:利用<foreach>标签,将入参的list集合通过UNION ALL生成虚拟数据,从而实现批量插入(验证过)

     1 <insert id="insertBatchLaTContactRecord" parameterType="java.util.Map">
     2     <selectKey resultType="java.lang.Long" keyProperty="dto.id" order="BEFORE">
     3                 select seq_LA_T_CONTACT_RECORD.nextval as id from dual
     4     </selectKey>
     5             insert into la_t_contact_record
     6             (           
     7                     id                             ,
     8                     contract_id                    ,
     9                     contacter_add_name             ,
    10                     contacter_add_type             ,
    11                     contact_add_phone              ,
    12                     contact_add_home_address       ,
    13                     contact_add_work               ,
    14                     contact_add_work_address       ,
    15                     create_by                      ,
    16                     create_time                    ,
    17                     modify_by                      ,
    18                     modify_time                    ,
    19                     validate_state                 ,
    20                     sys_source                     ,
    21                     isquery                             
    22             )
    23       select  seq_LA_T_CONTACT_RECORD.NEXTVAL,A.*  from( 
    24     <foreach collection="list" item="dto" index="index" separator="UNION ALL">
    25         select 
    26                     #{dto.contractId,jdbcType=VARCHAR}
    27                     ,#{dto.contacterAddName,jdbcType=VARCHAR}
    28                     ,#{dto.contacterAddType,jdbcType=VARCHAR}
    29                     ,#{dto.contactAddPhone,jdbcType=VARCHAR}
    30                     ,#{dto.contactAddHomeAddress,jdbcType=VARCHAR}
    31                     ,#{dto.contactAddWork,jdbcType=VARCHAR}
    32                     ,#{dto.contactAddWorkAddress,jdbcType=VARCHAR}
    33                     ,#{dto.createBy,jdbcType=DECIMAL}
    34                     ,systimestamp
    35                     ,#{dto.modifyBy,jdbcType=DECIMAL}
    36                     ,#{dto.modifyTime,jdbcType=TIMESTAMP}
    37                     ,'1'
    38                     ,#{dto.sysSource,jdbcType=VARCHAR}
    39                     ,#{dto.isquery,jdbcType=VARCHAR}
    40         from dual
    41     </foreach>) A
    42 </insert>

       注意:入参必须是list集合,sql语句中没有values;

    (2)第二种方式:利用存储过程实现批量插入(验证过)

     1 <insert id="insertPlanRepaymentOtherfeeBatch" parameterType="java.util.List">
     2         begin
     3         <foreach collection="list" item="item" index="index">
     4             insert into lb_t_plan_repayment_otherfee
     5             (
     6             id                             ,
     7             key                            ,
     8             value                          ,
     9             term                           ,
    10             contract_id,
    11             PAY_ORDER,
    12             FEE_NAME,
    13             INTO_ID
    14             )
    15             values(SEQ_LB_T_PLAN_REPAY_OTHERFEE.nextval
    16             ,#{item.key,jdbcType=VARCHAR}
    17             ,#{item.value,jdbcType=VARCHAR}
    18             ,#{item.term,jdbcType=DECIMAL}
    19             ,#{item.contractId,jdbcType=VARCHAR}
    20             ,#{item.payOrder,jdbcType=DECIMAL}
    21             ,#{item.feeName,jdbcType=VARCHAR}
    22             ,#{item.intoId,jdbcType=VARCHAR}
    23             );
    24         </foreach>
    25         end;
    26     </insert>

      注意:入参仍然是list集合,sql中有values,本质是利用存储过程实现批量插入;

    (3)第三种方式:使用特殊的sql语句(网上搜到的,待验证) 

      参考博客:http://blog.csdn.net/w_y_t_/article/details/51416201

      

      下面这条sql语句可以实现一条语句批量插入!

    1 INSERT ALL   
    2   INTO USERINFO(userid,username) VALUES('1001','Tom')  
    3   INTO USERINFO(userid,username) VALUES('1002','Black')  
    4   INTO USERINFO(userid,username) VALUES('1003','Jetty')  
    5   INTO USERINFO(userid,username) VALUES('1004','Cat')  
    6 SELECT 1 FROM DUAL;  
    1 <insert id="batchInsertUser" parameterType="java.util.ArrayList">  
    2 INSERT ALL   
    3         <foreach collection="list" item="userList" index="index">  
    4             INTO USERINFO(userid,username) VALUES(#{userList.userid},#{userList.username})  
    5         </foreach>  
    6       SELECT 1 FROM DUAL  
    7 </insert>  

      注意:当list的size大于500时,会失败;

    2、更新

     (1)第一种方式:同样是利用存储过程(网上搜索的,还是上面那个博客)

     1 <update id="batchUpdateUser" parameterType="java.util.ArrayList">  
     2     <foreach collection="list" item="userlist" index="index" open="begin" close=";end;" separator=";">  
     3         UPDATE USERINFO T    
     4            <set>  
     5             T.USERID = #{userlist.userid,jdbcType=VARCHAR},  
     6             T.USERNAME = #{userlist.username,jdbcType=VARCHAR},  
     7            </set>  
     8          WHERE  
     9             T.USERID = #{userlist.userid,jdbcType=VARCHAR}  
    10     </foreach>  
    11 </update>  

    (2)第二种方式:利用条件实现(已验证)

    1 <update id="updateBatchByListStat" parameterType="java.util.Map">
    2     update la_t_advfinished t1
    3                set   t1.list_stat='07',
    4                t1.modify_time                    =systimestamp    
    5          where t1.id in(<foreach collection="ids" separator="," item="id">'${id}'</foreach>)
    6 </update>

      注意:同样可以使用or的条件实现,类似于下面删除的sql;

    3、删除

    与更新第二种方式类似

    1 <delete id="deleteAttractions" parameterType="java.util.List">
    2   delete from ATTRACTIONS
    3   <where>
    4   <foreach collection="list" index="index" item="item" open="(" separator="or" close=")">     
    5   id=#{item.id}
    6     </foreach>
    7   </where>
    8   </delete>
  • 相关阅读:
    Hadoop 单机搭建 Scala安装
    Hadoop 单机搭建 Hbase单机模式搭建
    Hadoop 单机搭建 hadoop单机搭建
    Linux shell 重定向学习笔记
    转:SQLServer中的GROUPING,ROLLUP和CUBE
    ueditor getshell漏洞重现及分析
    SQLServer禁用、启用外键约束
    转:Sql Server中清空所有数据表中的记录
    EF结合SqlBulkCopy实现高效的批量数据插入 |EF插件EntityFramework.Extended实现批量更新和删除
    12种开源Web安全扫描程序
  • 原文地址:https://www.cnblogs.com/dahaihh-2018/p/8259441.html
Copyright © 2011-2022 走看看