最近看一個老項目,使用的Oracle數據庫,發現要使用MyBatis執行批量操作還是不太一樣。
下面我們來看一下,Oracle數據庫,如何使用MyBatis來批量插入和更新。
批量插入
因為Oracle和MySQL的insert還不太一樣,Oracle不能像MySQL直接語法插入多條:
INSERT INTO table_name(column1, column2, column3)
VALUES
(value1, value2, value3),
(value4, value5, value6),
(value7, value8, value9);
所以需要使用insert all來變通一下:
insert allinto table_name values(1,'張三',49)into table_name values(2,'李四',39)into table_name values(3,'王五',29)into table_name values(4,'趙六',19)into table_name values(5,'孫七',59)
select 1 from dual;
上面的table_name可以是不同的表。
簡單來說就是把插入語句放在insert all和select 1 from dual;之間
注意中間的插入語句沒有insert
在MyBatis中我們使用foreach拼裝一下,open就是insert all,中間是into 插入語句,close是select 1 from dual
注意最后沒有分號,除非你url中設置了allowMultiQueries=true才可以帶分號結尾,否則MyBatis執行會出錯。
下面是具體的示例:
<insert id="insertSelectiveList" parameterType="vip.meet.BusinessDateType"><foreach collection="list" item="item" index="index" separator="" open="insert all" close="select 1 from dual">into business_date_type<trim prefix="(" suffix=")" suffixOverrides=","><if test="item.pkId != null">PK_ID,</if><if test="item.fid != null">FID,</if><if test="item.rowIndex != null">ROW_INDEX,</if><if test="item.dataType != null">DATA_TYPE,</if><if test="item.lastModifyTime != null">LAST_MODIFY_TIME,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="item.pkId != null">#{item.pkId,jdbcType=NUMERIC},</if><if test="item.fid != null">#{item.fid,jdbcType=NUMERIC},</if><if test="item.rowIndex != null">#{item.rowIndex,jdbcType=NUMERIC},</if><if test="item.dataType != null">#{item.dataType,jdbcType=NUMERIC},</if><if test="item.lastModifyTime != null">#{item.lastModifyTime},</if></trim></foreach>
</insert>
批量更新
Oracle沒有批量更新的語句,怎么批量更新呢?
可以使用begin,end語句塊,可以把update語句放在begin和end之間執行。
BEGINUPDATE business_date_type SET price = 2.99 WHERE FID = 27210303266880;UPDATE business_date_type SET price = 4197276.99 WHERE FID = 27210303266880;
END;
在MyBatis中我們使用foreach拼裝一下,open就是begin,中間是update語句,close是;end;
close為啥是;end;呢,因為foreach的separator最后一個語句不會添加,所以少一個,需要補一個。
end后面的分號(;)是因為begin end;語法,這個分號不能省略,必須添加。
為什么有的不能有分號,有分號出錯,begin end又必須有分號,沒有分號出錯呢?
我想大概是因為,其他都是一個完整語句,begin end是一個語句塊,可能有多條語句,必須通過分號(;)來判斷結束吧。
<update id="updateList" parameterType="java.util.List"><foreach collection="list" item="item" index="index" open="begin" close=";end;" separator=";">update business_date_type<set><if test="item.dataType != null">DATA_TYPE = #{item.dataType,jdbcType=VARCHAR},</if><if test="item.lastModifyTime != null">LAST_MODIFY_TIME = #{item.lastModifyTime},</if></set>where FID = #{item.fid,jdbcType=NUMERIC}</foreach>
</update>