文章轉載自:https://www.thinksaas.cn/group/topic/98721/
項目中會遇到這樣的情況,一次性要插入多條資料到資料庫中,下面就拿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 )
相對於第一個方法,第二個方法的代碼量要多出很多,但是從效能方面考慮,不管插入多少條資料,都只用向資料庫提交一次,這樣效率就會大幅提升。