spring中jdbcTemplate.batchUpdate的幾種使用情況
在我做批量插入的過程中,由于數(shù)據(jù)庫做了唯一約束,所以有些重復(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ù)庫去執(zhí)行,中途有某條sql報(bào)錯(cuò)時(shí),后面的sql則不會(huì)執(zhí)行,之前的sql則全部會(huì)執(zhí)行提交,可在數(shù)據(jù)庫看到變化;
暫時(shí)沒找到讓后面sql執(zhí)行的方法,搜了好久,都說不支持這種操作,都建議在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,適用于我的解決方案
對sql處理處理了一下,對要插入的數(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot使用profile如何配置不同環(huán)境的配置文件
,springboot支持通過不同的profile來配置不同環(huán)境的配置,下面就大致介紹一下yml配置文件跟properties配置文件怎么使用profile配置不同環(huán)境的配置文件2018-01-01Java?NIO緩沖區(qū)Buffer基礎(chǔ)教程示例
這篇文章主要介紹了Java?NIO緩沖區(qū)Buffer基礎(chǔ)教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10RabbitMQ 實(shí)現(xiàn)延遲隊(duì)列的兩種方式詳解
很多場景下我們都需要延遲隊(duì)列。這篇文章主要以RabbitMQ為例來和大家聊一聊延遲隊(duì)列的玩法。文中的代碼具有一定的學(xué)習(xí)價(jià)值,感興趣的同學(xué)可以了解一下2021-12-12