日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Spring訪問數(shù)據(jù)庫異常的處理方法

使用JDBC API時,很多操作都要聲明拋出java.sql.SQLException異常,通常情況下是要制定異常處理策略。而Spring的JDBC模塊為我們提供了一套異常處理機制,這套異常系統(tǒng)的基類是DataAccessException,它是RuntimeException的一種類型,那么就不用強制去捕捉異常了,Spring的異常體系如下:

專注于為中小企業(yè)提供成都做網(wǎng)站、網(wǎng)站建設服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)璧山免費做網(wǎng)站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了成百上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉變。

目前為止我們還沒有明確地處理Spring中JDBC模塊的異常。要理解它的異常處理機制,我們來做幾個測試??聪旅娴臏y試代碼:

 
 
 
 
  1.  public void insert(final Vehicle vehicle) {      
  2. String sql = "insert into vehicle  
  3. (ID,PLATE,CHASSIS,COLOR,WHEEL,SEAT) values  
  4. (:id,:plate,:chassis,:color,:wheel,:seat)";      
  5.     SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(      
  6.             vehicle);      
  7.     getSimpleJdbcTemplate().update(sql, parameterSource);      
  8. }     
  9.     public void insert(final Vehicle vehicle) {  
  10.         String sql = "insert into vehicle(ID,PLATE,CHASSIS,COLOR,WHEEL,SEAT) 
  11. values(:id,:plate,:chassis,:color,:wheel,:seat)";  
  12.         SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(  
  13.                 vehicle);  
  14.         getSimpleJdbcTemplate().update(sql, parameterSource);  
  15.     } 

 
 
 
 
  1.      public static void main(String[] args) {      
  2.  
  3.         ApplicationContext ctx = new ClassPathXmlApplicationContext(       
  4.  "classpath:org/ourpioneer/vehicle/spring/applicationContext.xml");      
  5.         VehicleDAO vehicleDAO = (VehicleDAO) ctx.getBean("vehicleDAO");      
  6.         Vehicle vehicle = new Vehicle("遼B-000000", "1A00000001", "RED", 4, 4);      
  7.         vehicle.setId(1);      
  8.             vehicleDAO.insert(vehicle);      
  9. }     
  10.     public static void main(String[] args) {  
  11.         ApplicationContext ctx = new ClassPathXmlApplicationContext(       
  12.  "classpath:org/ourpioneer/vehicle/spring/applicationContext.xml");  
  13.         VehicleDAO vehicleDAO = (VehicleDAO) ctx.getBean("vehicleDAO");  
  14.         Vehicle vehicle = new Vehicle("遼B-000000", "1A00000001", "RED", 4, 4);  
  15.         vehicle.setId(1);  
  16.             vehicleDAO.insert(vehicle);  

修改SQL語句,不使用自增主鍵的特性,并在這里設置重復的主鍵,那么運行程序,就會報出字段重復的異常。下面來捕捉這個異常:

 
 
 
 
  1. try {      
  2.     vehicleDAO.insert(vehicle);      
  3. } catch (DataAccessException e) {      
  4.     SQLException sqle = (SQLException) e.getCause();      
  5.     System.out.println("Error code: " + sqle.getErrorCode());      
  6.     System.out.println("SQL state: " + sqle.getSQLState());      
  7. }     
  8.         try {  
  9.             vehicleDAO.insert(vehicle);  
  10.         } catch (DataAccessException e) {  
  11.             SQLException sqle = (SQLException) e.getCause();  
  12.             System.out.println("Error code: " + sqle.getErrorCode());  
  13.             System.out.println("SQL state: " + sqle.getSQLState());  
  14.         } 

此時,我們就可以獲得錯誤碼和SQL狀態(tài)(不同的數(shù)據(jù)庫系統(tǒng)會有不同):

關于HSQL數(shù)據(jù)庫的錯誤碼可以到org.hsqldb.Trace類中查看,只要注意運行結果會有一個負號,而類中定義的是沒有負號的。這樣就知道了這個錯誤的具體含義,比如104:***約束驗證失敗。這就是我們故意設置的重復主鍵問題。

Spring的JDBC模塊為我們預定義了一些錯誤代碼,它存儲在org.springframework.jdbc.support包下的sql-error-codes.xml文件中,其中描述HSQL的內(nèi)容為:

 
 
 
 
  1.     
  2.          
  3.         HSQL Database Engine     
  4.          
  5.          
  6.         -22,-28     
  7.          
  8.          
  9.         -104     
  10.          
  11.          
  12.         -9     
  13.          
  14.          
  15.         -80     
  16.          
  17.      
  18.      
  19.          
  20.             HSQL Database Engine 
  21.          
  22.          
  23.             -22,-28 
  24.          
  25.          
  26.             -104 
  27.          
  28.          
  29.             -9 
  30.          
  31.          
  32.             -80 
  33.          
  34.      

其余數(shù)據(jù)庫的錯誤碼內(nèi)容也可以從這個文件之中獲得。下面我們來看看如何自定義異常處理。上面我們已經(jīng)知道在org.springframework.jdbc.support包下有sql-error-codes.xml文件,在Spring啟動時會自動讀取這個文件中的錯誤碼,它為我們預分類了一些錯誤碼,而我們可以加強它,來使用我們自定義的異常。首先,定義一個異常類,我們就來自定義一下前面的-104錯誤,就是HSQL的重復鍵的問題:

 
 
 
 
  1. package org.ourpioneer.vehicle.exception;      
  2. import org.springframework.dao.DataIntegrityViolationException;      
  3. public class VehicleDuplicateKeyException extends     
  4.         DataIntegrityViolationException {      
  5.     public VehicleDuplicateKeyException(String msg) {      
  6.         super(msg);      
  7.     }      
  8.     public VehicleDuplicateKeyException(String msg, Throwable cause) {      
  9.         super(msg, cause);      
  10.     }      
  11. }     
  12. package org.ourpioneer.vehicle.exception;  
  13. import org.springframework.dao.DataIntegrityViolationException;  
  14. public class VehicleDuplicateKeyException extends  
  15.         DataIntegrityViolationException {  
  16.     public VehicleDuplicateKeyException(String msg) {  
  17.         super(msg);  
  18.     }  
  19.     public VehicleDuplicateKeyException(String msg, Throwable cause) {  
  20.         super(msg, cause);  
  21.     }  

之后我們重新新建一個sql-error-codes.xml代碼,并將它放到類路徑的根目錄下,這樣Spring會發(fā)現(xiàn)它并使用我們自定義的文件,在配置中定義如下:

 
 
 
 
  1.      
  2.              
  3.              
  4.              
  5.                  
  6.                      
  7.                  
  8.              
  9.          
  10.     
  11.     class="org.springframework.jdbc.support.CustomSQLErrorCodesTranslation">     
  12.              
  13.         
  14.     value="org.ourpioneer.vehicle.exception.VehicleDuplicateKeyException" />     
  15.          
  16.  
  17.          
  18.          
  19.          
  20.              
  21.                  
  22.              
  23.          
  24.      
  25.     
  26.     class="org.springframework.jdbc.support.CustomSQLErrorCodesTranslation"> 
  27.          
  28.         
  29.     value="org.ourpioneer.vehicle.exception.VehicleDuplicateKeyException" /> 
  30.      

HSQL的bean的名稱不要改,并將useSqlStateForTranslation置為false,就可以使用我們自己定義的異常類了。在主函數(shù)中移除try/catch塊,啟動程序,我們就可以看到如下內(nèi)容:

從啟動信息中可以發(fā)現(xiàn)Spring發(fā)現(xiàn)了我們自定義的sql-error-codes.xml,并替換其中的HSQL數(shù)據(jù)庫處理部分,使用了我們定義的異常,模擬出主鍵重復的異常后,VehicleDuplicateKeyException就拋出了。除此之外,還可以實現(xiàn)SQLExceptionTranslator接口,并在JDBC模板中注入其實例來實現(xiàn)異??刂疲覀儊砜匆幌?,首先創(chuàng)建一個Translator類:

 
 
 
 
  1. package org.ourpioneer.vehicle.exception;      
  2. import java.sql.SQLException;      
  3. import org.springframework.dao.DataAccessException;      
  4. import org.springframework.jdbc.UncategorizedSQLException;      
  5. import org.springframework.jdbc.support.SQLExceptionTranslator;      
  6. public class VehicleDuplicateKeyTranslator implements SQLExceptionTranslator {      
  7.     public DataAccessException translate(String task, String sql,      
  8.             SQLException ex) {      
  9.         if (task == null) {      
  10.             task = "";      
  11.         }      
  12.         if (sql == null) {      
  13.         }      
  14.         if (ex.getErrorCode() == -104) {      
  15.             return new VehicleDuplicateKeyException(buildMessage(task, sql, ex));      
  16.         } else {      
  17.             return new UncategorizedSQLException(task, sql, ex);      
  18.         }      
  19.     }      
  20.     private String buildMessage(String task, String sql, SQLException ex) {      
  21.         return "數(shù)據(jù)庫操作異常:" + task + "; SQL [" + sql + "]; " + ex.getMessage();      
  22.     }      
  23. }     
  24. package org.ourpioneer.vehicle.exception;  
  25. import java.sql.SQLException;  
  26. import org.springframework.dao.DataAccessException;  
  27. import org.springframework.jdbc.UncategorizedSQLException;  
  28. import org.springframework.jdbc.support.SQLExceptionTranslator;  
  29. public class VehicleDuplicateKeyTranslator implements SQLExceptionTranslator {  
  30.     public DataAccessException translate(String task, String sql,  
  31.             SQLException ex) {  
  32.         if (task == null) {  
  33.             task = "";  
  34.         }  
  35.         if (sql == null) {  
  36.         }  
  37.         if (ex.getErrorCode() == -104) {  
  38.             return new VehicleDuplicateKeyException(buildMessage(task, sql, ex));  
  39.         } else {  
  40.             return new UncategorizedSQLException(task, sql, ex);  
  41.         }  
  42.     }  
  43.     private String buildMessage(String task, String sql, SQLException ex) {  
  44.         return "數(shù)據(jù)庫操作異常:" + task + "; SQL [" + sql + "]; " + ex.getMessage();  
  45.     }  

其中,要覆蓋translate方法,方法有三個參數(shù),task表示當前操作要進行的任務是什么,sql就是執(zhí)行的sql語句,ex表示SQLException,我們可以從中獲取異常信息,其處理代碼僅僅捕捉了錯誤碼為-104(HSQL數(shù)據(jù)庫)的錯誤,其余的配置信息可以根據(jù)需要來自行添加。之后要在Spring中重新配置它們:

 
 
 
 
  1. class="org.ourpioneer.vehicle.exception.VehicleDuplicateKeyTranslator">     
  2.      
  3.          
  4.          
  5.      
  6.      
  7.          
  8.      
  9.     
  10.     class="org.ourpioneer.vehicle.exception.VehicleDuplicateKeyTranslator"> 
  11.      
  12.          
  13.          
  14.      
  15.      
  16.          
  17.      

調(diào)整DAO實現(xiàn)類的代碼:

 
 
 
 
  1. public class VehicleDAOImpl extends SimpleJdbcDaoSupport implements VehicleDAO {      
  2.     …   …      
  3.     public void insert(final Vehicle vehicle) {      
  4.         String sql = "insert into vehicle(ID,PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(?,?,?,?,?,?)";      
  5.         getJdbcTemplate().update(sql, vehicle.getId(),vehicle.getPlate(),vehicle.getChassis(),vehicle.getColor(),vehicle.getWheel(),vehicle.getSeat());      
  6.     }      
  7. …   …      
  8. }     
  9. public class VehicleDAOImpl extends SimpleJdbcDaoSupport implements VehicleDAO {  
  10.     …   …  
  11.     public void insert(final Vehicle vehicle) {  
  12.         String sql = "insert into vehicle(ID,PLATE,CHASSIS,COLOR,WHEEL,SEAT) values(?,?,?,?,?,?)";  
  13.         getJdbcTemplate().update(sql, vehicle.getId(),vehicle.getPlate(),vehicle.getChassis(),vehicle.getColor(),vehicle.getWheel(),vehicle.getSeat());  
  14.     }  
  15. …   …  

為了進行測試,其它代碼可不用修改,這樣繼續(xù)運行測試程序,同時將sql-error-codes.xml文件從類路徑的根路徑下去除,就可以得到如下結果:

Spring的JDBC模塊在自定義異常處理上也非常靈活,可以選擇自己喜歡的方式來實現(xiàn)。希望對使用者有用,歡迎交流,下一部分開始介紹Spring的ORM。


文章題目:Spring訪問數(shù)據(jù)庫異常的處理方法
本文網(wǎng)址:http://www.dlmjj.cn/article/cdooped.html