說一下Spring框架中使用jdbcTemplate實現多條sql語句的執行:
很多情況下我們需要處理一件事情的時候需要對多個表執行多個sql語句,比如淘寶下單時,我們確認付款時要對自己銀行賬戶的表里減去訂單所需的錢數,即需要更新銀行賬戶的表,同時需要更新淘寶訂單的表將訂單狀態改為“已付款”,這就需要先后執行多個sql(僅僅用於表達執行多的SQL的舉例說明,具體淘寶如何實現並不是很清楚~~~~~); 但如果這中間出現電腦斷網斷電等問題,僅將我們銀行賬戶的錢扣掉了,訂單狀態並沒有改,那我們是不是很慘,但實際上我們並沒有遇到這種情況對吧,下面我就來講一下如何使用Spring 中jdbcTemplate 實現執行多條sql語句,而不出現這種情況
1 @Test 2 public void 權限分配(){ 3 //1.客戶端復選框傳遞過來一個數組1,2 菜單的ID 4 Integer[] menus =new Integer[]{1,2}; 5 //2.聲明sql數組 6 String [] sql =new String [menus.length+1]; 7 //3.通過Role_id 200 刪除表中數據 8 sql[0] = "delete from role_link_menu where fk_role_id=200"; 9 //4新數據添加到中間表 10 for (int i=0;i<menus.length;i++) { 11 sql[i+1]="insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+"',200, "+menus[i]+")"; 12 } 13 jdbcTemplate.batchUpdate(sql); 14 }
前提我們已經連接好數據庫
這樣我們一共執行了3條SQL語句
1.delete from role_link_menu where fk_role_id=200
2.insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+"',200,1")";
3.insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+"',200,2")";
這期間任一條SQL語句出現問題都會回滾[**]會所有語句沒有執行前的最初狀態^_^
對比下面一組代碼,我們就可以發現其中不同
1 @Test 2 public void 權限分配單個處理() throws Exception{ 3 //1.通過Role_id 200 刪除表中數據 4 String sql = "delect from role_link_menu where fk_role_id=200"; 5 jdbcTemplate.update(sql); 6 //2.客戶端復選框傳遞過來一個數組1,2 菜單的id 7 Integer[] menus =new Integer[]{1,2}; 8 //3.新數據添加到中間表 9 for (int i=0;i<menus.length;i++) { 10 String menu_sql="insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+ "',200,"+menus[i]+")"; 11 if(i==1){ 12 throw new Exception("====="); 13 } 14 jdbcTemplate.update(menu_sql); 15 } 16 }
這里當i=1會出現異常程序終止,共執行了2條語句
1.delect from role_link_menu where fk_role_id=200
2.insert into role_link_menu(id,fk_role_id,fk_menu_id) values ('"+UUID.randomUUID().toString()+ "',200,1)";
下面一句不會執行,但之前這兩條執行完畢,就相當於本來我們要買啤酒喝炸雞,賬戶錢扣了,結果就只給了你一罐啤酒,是不是郁悶捏,啊哈,反正我不會開心
滴~~~
**注:
回滾:事務是一組組合成邏輯工作單元的操作,雖然系統中可能會出錯,但事務將控制和維護事務中每個操作的一致性和完整性。
例如,在將資金從一個帳戶轉移到另一個帳戶的銀行應用中,一個帳戶將一定的金額貸記到一個數據庫表中,同時另一個帳戶將相同的金額借記到另一個數據庫表中。由於計算機可能會因停電、網絡中斷等而出現故障,因此有可能更新了一個表中的行,但沒有更新另一個表中的行。如果數據庫支持事務,則可以將數據庫操作組成一個事務,以防止因這些事件而使數據庫出現不一致。如果事務中的某個點發生故障,則所有更新都可以回滾到事務開始之前的狀態。如果沒有發生故障,則通過以完成狀態提交事務來完成更新。【百度百科>.< 網址給你們:http://baike.baidu.com/view/709617.htm 】