1. 程式人生 > >Oracle使用Mybatis實現List批量插入資料(轉載)

Oracle使用Mybatis實現List批量插入資料(轉載)

專案中會遇到這樣的情況,查詢出多條記錄(一個List物件集合),一次性要插入多條資料到資料庫中,下面就拿Data類來看看兩種插入方法:

方法一:

  Mybatis本身只支援逐條插入,比較笨的方法,就是遍歷一個List,迴圈中逐條插入,比如下面這段程式碼

[java] view plain copy print?
  1. <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) {  
  2. dataMapper.insertSelective(d);  
  3. }  
<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 介面類中加入介面:

[java] view plain
copy print?
  1. int batchInsert(List<Data> datas);  
int batchInsert(List<Data> datas);
  然後,在xxxMapper.xml 中編寫對應的實現sql,我使用的是oracle,如果是mysql或sqlserver,可能sql語句會略有區別吧:

[xml] view plain copy print?
  1. <insertid=”batchInsert”parameterType=”java.util.List”>
  2.  insert into DATA (ID, TEXT, STAUTS)   
  3.  <foreachclose=”)”collection=”list”item=”item”index=”index”open=”(“separator=”union”>
  4. select  
  5. #{item.id,jdbcType=VARCHAR},  
  6. #{item.text,jdbcType=VARCHAR},  
  7. #{item.stauts,jdbcType=VARCHAR}  
  8.  from dual   
  9. </foreach>
  10. </insert>
<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