spring中jdbcTemplate.batchUpdate的幾種使用情況
在我做批量插入的過程中,由于數據庫做了唯一約束,所以有些重復數據會出錯,在我的設想中,除出錯的數據,其它數據應該是都會插入的,但事實不是;
1,batchUpdate(String[] sqls)
這種的sql在于多樣化,可以是各種混合sql,在操作時,會一部分一部分的發(fā)送到數據庫去執(zhí)行,中途有某條sql報錯時,后面的sql則不會執(zhí)行,之前的sql則全部會執(zhí)行提交,可在數據庫看到變化;
暫時沒找到讓后面sql執(zhí)行的方法,搜了好久,都說不支持這種操作,都建議在sql之前做判錯處理或trycatch后,再將sql一條一條的執(zhí)行。
public void a (){
try {
String[] sql = new String[4];
sql[0] = "insert into TEST(id) values (1)";
sql[1] = "insert into TEST(id) values (2)";
sql[2] = "insert into TEST(id) values (1)";
sql[3] = "insert into TEST(id) values (3)";
jdbcTemplate.batchUpdate(sql);
} catch (DataAccessException e) {
e.printStackTrace();
}
}
在ID為主鍵的情況下,這個只會插入1和2,提示批處理中出現(xiàn)錯誤: ORA-00001: 違反唯一約束條件。
2,batchUpdate(String sql,List <Object[]> parms)
這種的sql在于效率,固定的sql,變化的參數,操作時間會極大減少,默認情況下,當中途有數據報錯時,會全部回滾,不提交,所以是全部插入或者全部不插入;
public void b (){
try {
String sql = "insert into TEST(id) values (?)";
List<Object[]> list = new ArrayList<>();
for (int i = 0; i < 4; i++) {
String[] sqls = new String[1];
sqls[0] = i +"";
if(i == 2){ // 增加一條異常數據
sqls[0] = i-1 +"";
}
list.add(sqls);
}
jdbcTemplate.batchUpdate(sql,list);
} catch (DataAccessException e) {
e.printStackTrace();
}
}
這個全部都不會插入,提示批處理中出現(xiàn)錯誤: ORA-00001: 違反唯一約束條件。
3,適用于我的解決方案
對sql處理處理了一下,對要插入的數據做了是否存在判斷,如果不存在,則插入;用not EXISTS 判斷要插入的數據或有主鍵約束或有唯一約束的數據是否存在;
public void b (){
try {
String[] sql = new String[2];
sql[0] = "insert into TEST(id) values (1)";
sql[1] = "insert into TEST(id) " +
"select '1' from dual where not EXISTS(SELECT id FROM TEST WHERE id = '1')";
sql[2] = "insert into TEST(id) values (2)";
jdbcTemplate.batchUpdate(sql);
} catch (DataAccessException e) {
e.printStackTrace();
}
}
會插入1和2。
到此這篇關于spring中jdbcTemplate.batchUpdate的幾種使用情況的文章就介紹到這了,更多相關spring jdbcTemplate.batchUpdate內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring Boot使用profile如何配置不同環(huán)境的配置文件
,springboot支持通過不同的profile來配置不同環(huán)境的配置,下面就大致介紹一下yml配置文件跟properties配置文件怎么使用profile配置不同環(huán)境的配置文件2018-01-01

