项目中会遇到这样的情况,一次性要插入多条数据到数据库中,有两种插入方法:

方法一:

  Mybatis本身只支持逐条插入,比较笨的方法,就是遍历一个List,循环中逐条插入,比如下面这段代码

for(Data d : ListData) {
dataMapper.insertSelective(d);
}

    这样做的后果就是效率严重低下,因为每次循环都要向数据库提交一次,数据少的时候看不出来,但是如果上千条,花费的时间就相当多了

方法二:

  Mybatis本身是很灵活的,因为可以自己在XML文件中编写sql进行操作,那就可以一次性将插入到数据库中,这样只用向数据库提交一次,性能也可以提高不少。下面来看一个例子:

  首先,在DataMapper.java 接口类中加入接口:

int batchInsert(List<Data> datas);

  然后,在DataMapper.xml 中编写对应的实现sql,我使用的是oracle,如果是mysql或sqlserver,可能sql语句会略有区别吧:

<insert id="batchInsert"parameterType="java.util.List">
insert into DATA (ID, TEXT, STAUTS)
<foreach close=")"collection="list"item="item"index="index"open="("separator="union">
select
#{item.id,jdbcType=VARCHAR},
#{item.text,jdbcType=VARCHAR},
#{item.stauts,jdbcType=VARCHAR}
from dual
</foreach>
</insert>
  最后,在需要批量插入Data数据的地方调用接口:
dataMapper.batchInsert(ListData);

  

说明一下xml文件的实现,使用foreach标签,是用来拼接内部的字符串,item就相当于一个指针,用来遍历list中的对象,将每一个item的属性值复制给内部sql之后,用union拼接起来,一次性执行一个长的sql语句。   如果我们从后台打印sql执行语句的话,会看到这样的sql语句

insert into DATA (ID, TEXT, STAUTS)
(
select ?, ?, ? from dual union
select ?, ?, ? from dual union
select ?, ?, ? from dual
)

  

  相对于第一个方法,第二个方法的代码量要多出很多,但是从性能方面考虑,不管插入多少条数据,都只用向数据库提交一次,这样效率就会大幅提升。

如果id 是使用 seq 自增长的呢?

	<insert id="insertRoleMenu">
insert into ROLE_MENU_RELA (RM_ID, ROLE_ID, MENU_ID)
select ROLE_MENU_RELA_SEQ.nextval,a.* from (
<foreach collection="list" item="rela" index="index" separator="union" open="(" close=")">
select #{rela.roleId,jdbcType=DECIMAL}, #{rela.menuId,jdbcType=DECIMAL} from dual
</foreach>
) a
</insert>

  这里传入的参数为 List<ROLE_MENU_RELA> list

然而,如果我传入的对象role如下:

class role
{
int roleId;
List<menu> list;
}

那么要插入 role与menu 的关系表数据的方法:

<insert id="insertRoleMenu" parameterType="com.xxx.modules.sys.entity.Role">
begin
<foreach collection="menuList" item="menu" index="index">
insert into ROLE_MENU_RELA (RM_ID, ROLE_ID, MENU_ID) values
(BPMP_SYS_ROLE_MENU_RELA_SEQ.nextval, #{roleId,jdbcType=DECIMAL}, #{menu.menuId,jdbcType=DECIMAL});
</foreach>
end;
</insert>

将所有的sql 语句放入一个块中处理

参考链接:http://www.thinksaas.cn/topics/0/98/98721.html

基于Oracle的Mybatis 批量插入的更多相关文章

  1. oracle结合mybatis批量插入数据

    先上代码: controller: result = service.insertTRbXdhjLendYdData(params); service: List<TRbXdhjLendDTO& ...

  2. mybatis批量插入数据到oracle

    mybatis 批量插入数据到oracle报 ”java.sql.SQLException: ORA-00933: SQL 命令未正确结束“  错误解决方法 oracle批量插入使用 insert a ...

  3. 解决Oracle+Mybatis批量插入报错:SQL 命令未正确结束

    Mybatis批量插入需要foreach元素.foreach元素有以下主要属性: (1)item:集合中每一个元素进行迭代时的别名. (2)index:指定一个名字,用于表示在迭代过程中,每次迭代到的 ...

  4. mybatis批量插入oracle时报错:unique constraint (table name) violated

    mybatis批量插入oracle时报错:unique constraint (table name) violated,是因为插入的集合中有两条相同唯一约束的数据.

  5. oracle+mybatis批量插入踩坑记

    最近在项目中需要使用oracle+mybatis批量插入数据,因为自增主键,遇到问题,现记录如下: 一.常用的两种sql写法报错 1.insert ... values ... <insert ...

  6. Mybatis 批量插入数据

    --mybatis 批量插入数据 --1.Oracle(需要测试下是否支持MySQL) < insert id ="insertBatch" parameterType=&q ...

  7. 【mybatis批量插入】

    mybatis批量插入操作: MySQL:1.INSERT INTO TABLE_NAME(ID,NAME)VALUES(1,'张三'),(2,'李四')                  2.INS ...

  8. MyBatis批量插入性能及问题

    1.mybatis三种批量插入方式对比 2.Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案 3.Mybatis批量插入引发的血案 4.Oracle批量插入数据SQL语句太长出错

  9. springMVC 接收数组参数,mybatis 接收数组参数,mybatis批量插入/批量删除案例

    案例是给一个用户赋予多个权限,多个权限用其对应的主键 id 为参数,组成了 一个id数组,传给springMVC,然后springMVC传给mybatis,然后mybatis批量插入.其实类似的场景还 ...

随机推荐

  1. POJ2184 Cow Exhibition[DP 状态负值]

    Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12420   Accepted: 4964 D ...

  2. 01 Hibernate错题分析

    解析: 此题目考查的是对Hibernate中交叉连接的理解.HQL支持SQL风格的交叉连接查询,交叉连接适用于两个类之间没有定义任何关联时.在where字句中,通过属性作为筛选条件,如统计报表数据.使 ...

  3. extra增强延迟加载

    这种配置和配置为lazy=true是一样的,但它的好处在于调用size/contains等方法时,并不查询整个集合的数据,而是发送一条sql语句来处理,只有真正在使用时才全部去查询整个集合

  4. AFN 处理网络哪些事(轻松掌握AFN网络顶级框架)

    AFN 一.什么是AFN 全称是AFNetworking,是对NSURLConnection的一层封装 虽然运行效率没有ASI高,但是使用比ASI简单 在iOS开发中,使用比较广泛 AFN的githu ...

  5. XML操作类

        using System; using System.Data; using System.IO; using System.Xml; namespace DotNet.Utilities { ...

  6. 'gulp'不是内部或者外部命令,也不是可运行的程序或批处理文件

    1,在用户变量里新建变量 PATH: %USERPROFILE%\AppData\Roaming\npm(如果已有path变量,则在后面直接加上即可) 2,在系统环境变量里的path加上node.js ...

  7. 如何用 CSS 做到完全垂直居中

    本文将教你一个很有用的技巧——如何使用 CSS 做到完全的垂直居中.我们都知道 margin:0 auto; 的样式能让元素水平居中,而 margin: auto; 却不能做到垂直居中……直到现在.但 ...

  8. [LINK]OpenResty

    http://openresty.org/ http://www.tuicool.com/articles/M3yI3y http://www.oschina.net/question/28_6046 ...

  9. java:hibernate + oracle之坑爹的clob

    oracle + hibernate 环境,如果表中有 clob字段,hibernate的Entity类,如果Column注解打在私有成员上,则clob私有成员,首字母一定要按字母顺序排在最后,安全的 ...

  10. PhoneGap奇怪的现象:File FileTransfer download, 手机相册检测不到下载下来的图片(解决)

    我有个从服务器下载相片的功能在使用 File FileTransfer download api时,碰到了很奇怪的现象:图片已经从服务器里下载了,手机文件夹里也可以看到下载过来的图片,但是我的手机相册 ...