Oracle使用Mybatis实现List批量插入数据

项目中会遇到这样的情况,查询出多条记录(一个List对象集合),一次性要插入多条数据到数据库中,下面就拿Data类来看看两种插入方法:

方法一:

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

<pre class="java" style="margin-top: 0px; margin-bottom: 10px; box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; font-size: 13px; padding: 9.5px; color: rgb(51, 51, 51); word-break: break-all; word-wrap: break-word; border: 1px solid rgb(204, 204, 204); border-radius: 4px; background-color: rgb(245, 245, 245);">for(Data d : ListData) {
dataMapper.insertSelective(d);
}
 
  这样做的后果就是效率严重低下,因为每次循环都要向数据库提交一次,数据少的时候看不出来,但是如果上千条,花费的时间就相当多了; 

方法二:

  Mybatis本身是很灵活的,因为可以自己在XML文件中编写sql进行操作,那就可以一次性将插入到数据库中,这样只用向数据库提交一次,性能也可以提高不少。此处需要注意,对于不同数据库,mapper.xml里的配置方式不一样,我用的是Oracle,oracle批量插入记录的书写方式跟sqlServer,MySql的不一样,下面来看一个Oracle例子:

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

int batchInsert(List<Data> datas);
  然后,在xxxMapper.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>

  说明一下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 
)

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




  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值