MySQL和Oracle批量插入SQL的通用寫法示例
舉個例子:
現在要批量新增User對象到數據庫USER表中
public class User{ //姓名 private String name; //年齡 private Integer age; //性別 private Integer sex }
大部分人對MySQL比較熟悉,可能覺得批量新增的SQL都是這樣寫,其實並不然。該寫法在MySQL中沒問題,而在Oracle中,這樣寫就會報錯。
MySQL寫法:
INSERT INTO USER (NAME,AGE,SEX) VALUES ('val1_1', 'val1_2', 'val1_3'), ('val2_1', 'val2_2', 'val2_3'), ('val3_1', 'val3_2', 'val3_3');
Oracle寫法:
//多次單條插入 INSERT INTO USER (NAME,AGE,SEX) VALUES ('val1_1', 'val1_2', 'val1_3'); INSERT INTO USER (NAME,AGE,SEX) VALUES ('val2_1', 'val2_2', 'val2_3'); INSERT INTO USER (NAME,AGE,SEX) VALUES ('val3_1', 'val3_2', 'val3_3'); //批量插入 INSERT ALL INTO USER (NAME,AGE,SEX) VALUES ('val1_1', 'val1_2', 'val1_3') INTO USER (NAME,AGE,SEX) VALUES ('val2_1', 'val2_2', 'val2_3') INTO USER (NAME,AGE,SEX) VALUES ('val3_1', 'val3_2', 'val3_3') SELECT 1 FROM DUAL;
可以發現Oracle的兩種寫法都比較的麻煩,批量插入也壓根沒有減少插入的列名。除此之外,另一個麻煩的事情就是,在企業開發中,一套軟件系統可能需要支持多套數據庫的,因此這條新增的操作,就得適配兩套數據庫,維護兩套SQL,大大地增加瞭開發成本。
那麼有沒有一種通用的寫法呢?答案是有的。
通用寫法:
INSERT INTO USER (NAME,AGE,SEX) select ('val1_1', 'val1_2', 'val1_3') from dual union all select ('val2_1', 'val2_2', 'val2_3') from dual union all select ('val3_1', 'val3_2', 'val3_3') from dual
這樣一來,既簡單又能少維護一套SQL,兩全其美。
下面是XML文件裡各種寫法的代碼。
<!--MySQL的批量插入--> <insert id="batchInsertUser" databaseId="mysql"> INSERT INTO USER (NAME,AGE,SEX) VALUES <foreach collection="userList" index="index" item="user" separator=","> (#{user.name},#{user.age},#{user.sex}) </foreach> </insert>
<!--Oracle的批量插入--> <insert id="batchInsertUser" databaseId="oracle"> BEGIN <foreach collection="userList" index="index" item="user" separator=";"> INSERT INTO USER (NAME,AGE,SEX) VALUES (#{user.name},#{user.age},#{user.sex}) </foreach> ;END; </insert>
仔細觀察MySQL和Oracle的寫法,因為MySQL支持上述在VALUES後面直接插入多條數據,因此。foreach標簽隻需要循環遍歷出VALUES後面()裡的內容即可;而Oracle因為不支持這種寫法因此需要循環遍歷整個INSERT語句。
<!--通用的批量插入--> <insert id="batchInsertUser" databaseId="mysql"> INSERT INTO USER (NAME,AGE,SEX) <foreach collection="userList" index="index" item="user" separator="union all"> SELECT (#{user.name},#{user.age},#{user.sex}) FROM DUAL </foreach> </insert>
總結
到此這篇關於MySQL和Oracle批量插入SQL的通用寫法的文章就介紹到這瞭,更多相關MySQL和Oracle批量插入SQL內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- mybatis使用oracle進行添加數據的方法
- postgresql如何兼容MySQL if函數
- 基於Java 利用Mybatis實現oracle批量插入及分頁查詢
- MyBatis批量插入/修改/刪除MySql數據
- mybatis update更新字段的使用操作