spring中jdbcTemplate.batchUpdate的幾種使用情況
在我做批量插入的過(guò)程中,由于數(shù)據(jù)庫(kù)做了唯一約束,所以有些重復(fù)數(shù)據(jù)會(huì)出錯(cuò),在我的設(shè)想中,除出錯(cuò)的數(shù)據(jù),其它數(shù)據(jù)應(yīng)該是都會(huì)插入的,但事實(shí)不是;
1,batchUpdate(String[] sqls)
這種的sql在于多樣化,可以是各種混合sql,在操作時(shí),會(huì)一部分一部分的發(fā)送到數(shù)據(jù)庫(kù)去執(zhí)行,中途有某條sql報(bào)錯(cuò)時(shí),后面的sql則不會(huì)執(zhí)行,之前的sql則全部會(huì)執(zhí)行提交,可在數(shù)據(jù)庫(kù)看到變化;
暫時(shí)沒(méi)找到讓后面sql執(zhí)行的方法,搜了好久,都說(shuō)不支持這種操作,都建議在sql之前做判錯(cuò)處理或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為主鍵的情況下,這個(gè)只會(huì)插入1和2,提示批處理中出現(xiàn)錯(cuò)誤: ORA-00001: 違反唯一約束條件。
2,batchUpdate(String sql,List <Object[]> parms)
這種的sql在于效率,固定的sql,變化的參數(shù),操作時(shí)間會(huì)極大減少,默認(rèn)情況下,當(dāng)中途有數(shù)據(jù)報(bào)錯(cuò)時(shí),會(huì)全部回滾,不提交,所以是全部插入或者全部不插入;
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){ // 增加一條異常數(shù)據(jù)
sqls[0] = i-1 +"";
}
list.add(sqls);
}
jdbcTemplate.batchUpdate(sql,list);
} catch (DataAccessException e) {
e.printStackTrace();
}
}
這個(gè)全部都不會(huì)插入,提示批處理中出現(xiàn)錯(cuò)誤: ORA-00001: 違反唯一約束條件。
3,適用于我的解決方案
對(duì)sql處理處理了一下,對(duì)要插入的數(shù)據(jù)做了是否存在判斷,如果不存在,則插入;用not EXISTS 判斷要插入的數(shù)據(jù)或有主鍵約束或有唯一約束的數(shù)據(jù)是否存在;
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();
}
}
會(huì)插入1和2。
到此這篇關(guān)于spring中jdbcTemplate.batchUpdate的幾種使用情況的文章就介紹到這了,更多相關(guān)spring jdbcTemplate.batchUpdate內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 源碼解析springbatch的job運(yùn)行機(jī)制
- spring?batch線上異常定位記錄
- Spring Batch 如何自定義ItemReader
- 詳解批處理框架之Spring Batch
- 手把手教你搭建第一個(gè)Spring Batch項(xiàng)目的步驟
- 基于Spring Batch向Elasticsearch批量導(dǎo)入數(shù)據(jù)示例
- Spring Batch入門(mén)教程篇
- Spring Batch讀取txt文件并寫(xiě)入數(shù)據(jù)庫(kù)的方法教程
- 使用Spring?Batch實(shí)現(xiàn)大數(shù)據(jù)處理的操作方法
相關(guān)文章
Java中的NumberFormatException異常原因以及解決方案詳解
這篇文章主要介紹了Java中的NumberFormatException異常原因以及解決方案詳解,NumberFormatException 是 Java 中的一個(gè)異常類,通常在字符串轉(zhuǎn)換為數(shù)字的過(guò)程中發(fā)生,它表示一個(gè)無(wú)效的數(shù)字格式,即字符串無(wú)法被正確解析為數(shù)字,需要的朋友可以參考下2024-02-02
RocketMQ NameServer保障數(shù)據(jù)一致性實(shí)現(xiàn)方法講解
這篇文章主要介紹了RocketMQ NameServer保障數(shù)據(jù)一致性實(shí)現(xiàn)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
springboot創(chuàng)建監(jiān)聽(tīng)和處理事件的操作方法
這篇文章主要介紹了springboot創(chuàng)建監(jiān)聽(tīng)和處理事件的操作方法,使用Spring Boot的事件機(jī)制來(lái)監(jiān)聽(tīng)和處理事件有多種優(yōu)勢(shì),本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2024-07-07
SpringBoot Session共享實(shí)現(xiàn)圖解
這篇文章主要介紹了SpringBoot Session共享實(shí)現(xiàn)圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
詳解SpringMVC中的@RequestMapping注解
這篇文章主要介紹了SpringMVC中@RequestMapping注解,@RequestMapping注解是一個(gè)用來(lái)處理請(qǐng)求地址映射的注解,可用于映射一個(gè)請(qǐng)求或一個(gè)方法,可以用在類或方法上,需要的朋友可以參考下2023-07-07
Java反射機(jī)制,反射相關(guān)API,反射API使用方式(反射獲取實(shí)體類字段名和注解值)
這篇文章主要介紹了Java反射機(jī)制,反射相關(guān)API,反射API使用方式(反射獲取實(shí)體類字段名和注解值),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

