舉個例子:
現在要批量新增User對象到數據庫USER表中
1
2
3
4
5
6
7
8
|
public class User { //姓名 private String name ; //年齡 private Integer age; //性別 private Integer sex } |
大部分人對MySQL比較熟悉,可能覺得批量新增的SQL都是這樣寫,其實并不然。該寫法在MySQL中沒問題,而在Oracle中,這樣寫就會報錯。
MySQL寫法:
1
2
3
4
5
6
|
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寫法:
1
2
3
4
5
6
7
8
9
10
11
|
//多次單條插入 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,大大地增加了開發成本。
那么有沒有一種通用的寫法呢?答案是有的。
通用寫法:
1
2
3
4
|
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文件里各種寫法的代碼。
1
2
3
4
5
6
7
8
9
|
<! --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 > |
1
2
3
4
5
6
7
8
9
10
11
|
<! --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語句。
1
2
3
4
5
6
7
8
9
10
|
<!--通用的批量插入--> <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內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/whileGreatHair/p/15533379.html