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

项目中会遇到这样的情况,一次性要插入多条数据到数据库中,下面就拿Data类来看看两种插入方法:

 

方法一:

  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 
) 

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

 

 

 

 

你可能感兴趣的:(java,oracle,sql,mybatis)