Mybatis是web工程開發中非常常用的資料持久化的架構,通過該架構,我們非常容易的進行資料庫的增刪改查。資料庫連接進行事務提交的時候,需要耗費的資源比較多,如果需要插入更新的資料比較多,而且每次事務只提交一條資料,會造成大型資料庫資源浪費,導致資料庫效能、系統效能大幅度下降。
關於mybatis的批量插入,網上的多數樣本多半是關於MySQL資料庫的,關於Oracle資料庫的例子比較少。個人在嘗試使用Mybatis進行Oracle資料庫的資料批量插入時,發現Mybatis完成的工作主要是組裝批量插入的SQL語句。我們只需要在Mybatis設定檔中拼裝出資料庫支援的SQL語句基本也就完成了批量插入的工作。
Mybatis結合Oracle資料庫進行批量資料插入,從Oracle資料庫角度來看,實際上就是通過單條SQL語句,插入多條資料。經過查詢得知,以下語句可以插入通過單條語句插入多條資料:
INSERT ALL INTO USERINFO(userid,username) VALUES('1001','Tom') INTO USERINFO(userid,username) VALUES('1002','Black') INTO USERINFO(userid,username) VALUES('1003','Jetty') INTO USERINFO(userid,username) VALUES('1004','Cat') SELECT 1 FROM DUAL;
我們現在需要做的就是通過Mybatis設定檔拼裝這樣格式的SQL即可完成資料批量插入。Mybatis提供了<foreach>標籤來進行迴圈控制,此時我們可以把使用者資訊組成的列表作為參數(parameterType)輸入,樣本如下:
<insert id="batchInsertUser" parameterType="java.util.ArrayList">INSERT ALL <foreach collection="list" item="userList" index="index"> INTO USERINFO(userid,username) VALUES(#{userList.userid},#{userList.username}) </foreach> SELECT 1 FROM DUAL</insert>
關於<foreach>標籤的使用,資料非常多,在此不再贅述。
完成資料的批量插入後,批次更新的思路也是一樣的,但是相比資料插入,更新要更簡單一些。具體做法,參考下面的例子,入參還是需要更新資訊的使用者組成的List:
<update id="batchUpdateUser" parameterType="java.util.ArrayList"><foreach collection="list" item="userlist" index="index" open="begin" close=";end;" separator=";">UPDATE USERINFO T <set>T.USERID = #{userlist.userid,jdbcType=VARCHAR},T.USERNAME = #{userlist.username,jdbcType=VARCHAR}, </set> WHERET.USERID = #{userlist.userid,jdbcType=VARCHAR}</foreach></update>
遇到的問題:本人在進行批量資料插入時,遇到一個問題,當入參List的size()比較大的時候,會導致插入失敗,經過反覆嘗試,發現list的size()在500以內的時候,大量操作沒有問題,具體原因還沒有找到,這點請大家指教。