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,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>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

您可能感兴趣的文章:

  • oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
  • Oracle+Mybatis的foreach insert批量插入报错的快速解决办法
  • mybatis执行批量更新batch update 的方法(oracle,mysql两种)
  • Java实现mybatis批量插入数据到Oracle
  • MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)
时间: 2018-01-13

oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert

最近做项目遇到一个挺纠结的问题,由于业务的关系,DB的数据表无法确定,在使用过程中字段可能会增加,这样在insert时给我造成了很大的困扰. 先来看一下最终我是怎么实现的: <insert id="batchInsertLine" parameterType="HashMap"> <![CDATA[ INSERT INTO tg_fcst_lines(${lineColumn}) select result.*,sq_fcst_lines.next

Oracle+Mybatis的foreach insert批量插入报错的快速解决办法

最近做一个批量导入的需求,将多条记录批量插入数据库中. 解决思路:在程序中封装一个List集合对象,然后把该集合中的实体插入到数据库中,因为项目使用了MyBatis,所以打算使用MyBatis的foreach功能进行批量插入.期间遇到了"SQL 命令未正确结束 "的错误,最终解决,记录下来供以后查阅和学习. 首先,在网上参考了有关Mybatis的foreach insert的资料,具体如下: foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach

mybatis执行批量更新batch update 的方法(oracle,mysql两种)

Oracle和MySQL数据库的批量update在mybatis中配置不太一样: oracle数据库: <code class="hljs tcl" style=""><<span class="hljs-keyword" style="">update</span> id=<span class="hljs-string" style=""

Java实现mybatis批量插入数据到Oracle

最近项目中遇到一个问题:导入数据到后台并将数据插入到数据库中,导入的数据量有上万条数据,考虑采用批量插入数据的方式:  结合网上资料,写了个小demo,文章末尾附上demo下载地址 1.新建项目:项目目录结构如下图所示,添加相应的jar包 2.新建数据库表:ACCOUNT_INFO CREATE TABLE ACCOUNT_INFO ( "ID" NUMBER(12) NOT NULL , "USERNAME" VARCHAR2(64 BYTE) NULL , &q

MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)

一.mybatis批量插入数据到Oracle中的两种方式: 第一种: <insert id="addList" parameterType="java.util.List" useGeneratedKeys="false"> INSERT ALL <foreach item="item" index="index" collection="list"> INTO

mybatis foreach批量插入数据:Oracle与MySQL区别介绍

下面给大家介绍mybatis foreach批量插入数据:Oracle与MySQL不同点: •主要不同点在于foreach标签内separator属性的设置问题: •separator设置为","分割时,最终拼接的代码形式为:insert into table_name (a,b,c) values (v1,v2,v3) ,(v4,v5,v6) ,... •separator设置为"union all"分割时,最终拼接的代码形式为:insert into table

深入SqlServer2008 数据库同步的两种方式(Sql JOB)的分析介绍

下面介绍的就是数据库同步的两种方式: 1.SQL JOB的方式  sql Job的方式同步数据库就是通过SQL语句,将一个数据源中的数据同步到目标数据库中.特点是它可以灵活的通过SQL的方式进行数据库之间的同步操作.可以在制定的时间时间作为任务计划自动执行.缺点是需要写SQL来进行操作.既然是数据库之间的同步就涉及到数据库之间的连接.建立连接是同步的第一步.SQL Server建立连接可以通过系统存储过程建立[是否还有其他方式,我还不清楚].存储过程有以下几个:sp_droplinkedsrvl

SqlServer2008 数据库同步的两种方式(发布、订阅使用方法)

上篇中说了通过SQL JOB的方式对数据库的同步,这一节作为上一节的延续介绍通过发布订阅的方式实现数据库之间的同步操作.发布订阅份为两个步骤:1.发布.2订阅.首先在数据源数据库服务器上对需要同步的数据进行发布,然后在目标数据库服务器上对上述发布进行订阅.发布可以发布一张表的部分数据,也可以对整张表进行发布.下面分别介绍发布.订阅的过程. 1.发布.发布需要用实际的服务器名称,不能使用服务器的IP地址进行.能发布的信息包括[表].[存储过程].[用户函数]如果使用IP会有错误,如下图: 具体发布

MyBatis批量插入数据过程解析

在程序中封装了一个List集合对象,然后需要把该集合中的实体插入到数据库中,由于项目使用了Spring+MyBatis的配置,所以打算使用MyBatis批量插入,由于之前没用过批量插入,在网上找了一些资料后最终实现了,把详细过程贴出来. 实体类TrainRecord结构如下: public class TrainRecord implements Serializable { private static final long serialVersionUID = -12069604621179

Python操作MySQL数据库的两种方式实例分析【pymysql和pandas】

本文实例讲述了Python操作MySQL数据库的两种方式.分享给大家供大家参考,具体如下: 第一种 使用pymysql 代码如下: import pymysql #打开数据库连接 db=pymysql.connect(host='1.1.1.1',port=3306,user='root',passwd='123123',db='test',charset='utf8') cursor=db.cursor()#使用cursor()方法获取操作游标 sql = "select * from tes

详解MyBatis批量插入数据Mapper配置文件的写法

对于MyBatis配置文件的用法一直不是很熟悉,之前一直是使用注解来开发的,但是注解也有不好的地方就是如果数据库的表结构发生变化在代码中修改起来很麻烦. 其实批量插入很简单,这里做些简要的说明.请看配置文件的写法: <insert id="insertAll" parameterType="java.util.List" useGeneratedKeys="true"> <selectKey resultType="l

Android批量插入数据到SQLite数据库的方法

Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知.因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度. 有时需要把一些数据内置到应用中,常用的有以下几种方式: 1.使用db.execSQL(sql) 这里是把要插入的数据拼接成可执行的sql语句,然后调用db.execSQL(sql)方法执行插入. public void inertOrUpdateDateBatch(List<

Mybatis批量插入数据返回主键的实现

响应效果(id为主键): { "data": [ {"studentName": "张三","classNo": "一班","id": 111}, {"studentName": "李四","classNo": "二班","id": 112}, {"studentName&quo