精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring訪問數據庫異常的處理方法

開發 后端
今天我們將談談Spring訪問數據庫異常的處理方法,使用JDBC API時,很多操作都要聲明拋出java.sql.SQLException異常,通常情況下是要制定異常處理策略。

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

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

  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狀態(不同的數據庫系統會有不同):

 

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

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

  1. <bean id="HSQL" class="org.springframework.jdbc.support.SQLErrorCodes">    
  2.     <property name="databaseProductName">     
  3.         <value>HSQL Database Engine</value>     
  4.     </property>     
  5.     <property name="badSqlGrammarCodes">     
  6.         <value>-22,-28</value>     
  7.     </property>     
  8.     <property name="duplicateKeyCodes">     
  9.         <value>-104</value>     
  10.     </property>     
  11.     <property name="dataIntegrityViolationCodes">     
  12.         <value>-9</value>     
  13.     </property>     
  14.     <property name="dataAccessResourceFailureCodes">     
  15.         <value>-80</value>     
  16.     </property>     
  17. </bean>     
  18.     <bean id="HSQL" class="org.springframework.jdbc.support.SQLErrorCodes"> 
  19.         <property name="databaseProductName"> 
  20.             <value>HSQL Database Engine</value> 
  21.         </property> 
  22.         <property name="badSqlGrammarCodes"> 
  23.             <value>-22,-28</value> 
  24.         </property> 
  25.         <property name="duplicateKeyCodes"> 
  26.             <value>-104</value> 
  27.         </property> 
  28.         <property name="dataIntegrityViolationCodes"> 
  29.             <value>-9</value> 
  30.         </property> 
  31.         <property name="dataAccessResourceFailureCodes"> 
  32.             <value>-80</value> 
  33.         </property> 
  34.     </bean> 

其余數據庫的錯誤碼內容也可以從這個文件之中獲得。下面我們來看看如何自定義異常處理。上面我們已經知道在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會發現它并使用我們自定義的文件,在配置中定義如下: 

  1. <bean id="HSQL" class="org.springframework.jdbc.support.SQLErrorCodes">     
  2.         <property name="databaseProductName" value="HSQL Database Engine" />     
  3.         <property name="useSqlStateForTranslation" value="false" />     
  4.         <property name="customTranslations">     
  5.             <list>     
  6.                 <ref local="vehicleDuplicateKeyTranslation" />     
  7.             </list>     
  8.         </property>     
  9.     </bean>     
  10.     <bean id="vehicleDuplicateKeyTranslation"     
  11.     class="org.springframework.jdbc.support.CustomSQLErrorCodesTranslation">     
  12.         <property name="errorCodes" value="-104" />     
  13.         <property name="exceptionClass"     
  14.     value="org.ourpioneer.vehicle.exception.VehicleDuplicateKeyException" />     
  15.     </bean>     
  16. <bean id="HSQL" class="org.springframework.jdbc.support.SQLErrorCodes"> 
  17.         <property name="databaseProductName" value="HSQL Database Engine" /> 
  18.         <property name="useSqlStateForTranslation" value="false" /> 
  19.         <property name="customTranslations"> 
  20.             <list> 
  21.                 <ref local="vehicleDuplicateKeyTranslation" /> 
  22.             </list> 
  23.         </property> 
  24.     </bean> 
  25.     <bean id="vehicleDuplicateKeyTranslation" 
  26.     class="org.springframework.jdbc.support.CustomSQLErrorCodesTranslation"> 
  27.         <property name="errorCodes" value="-104" /> 
  28.         <property name="exceptionClass" 
  29.     value="org.ourpioneer.vehicle.exception.VehicleDuplicateKeyException" /> 
  30.     </bean> 

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

 

從啟動信息中可以發現Spring發現了我們自定義的sql-error-codes.xml,并替換其中的HSQL數據庫處理部分,使用了我們定義的異常,模擬出主鍵重復的異常后,VehicleDuplicateKeyException就拋出了。除此之外,還可以實現SQLExceptionTranslator接口,并在JDBC模板中注入其實例來實現異常控制,我們來看一下,首先創建一個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 "數據庫操作異常:" + 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 "數據庫操作異常:" + task + "; SQL [" + sql + "]; " + ex.getMessage();  
  45.     }  

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

  1. <bean id="vehicleDuplicateKeyTranslator"     
  2. class="org.ourpioneer.vehicle.exception.VehicleDuplicateKeyTranslator"></bean>     
  3. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">     
  4.     <property name="exceptionTranslator" ref="vehicleDuplicateKeyTranslator" />     
  5.     <property name="dataSource" ref="dataSource" />     
  6. </bean>     
  7. <bean id="vehicleDAO" class="org.ourpioneer.vehicle.dao.VehicleDAOImpl">     
  8.     <property name="jdbcTemplate" ref="jdbcTemplate" />     
  9. </bean>     
  10.     <bean id="vehicleDuplicateKeyTranslator" 
  11.     class="org.ourpioneer.vehicle.exception.VehicleDuplicateKeyTranslator"></bean> 
  12.     <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
  13.         <property name="exceptionTranslator" ref="vehicleDuplicateKeyTranslator" /> 
  14.         <property name="dataSource" ref="dataSource" /> 
  15.     </bean> 
  16.     <bean id="vehicleDAO" class="org.ourpioneer.vehicle.dao.VehicleDAOImpl"> 
  17.         <property name="jdbcTemplate" ref="jdbcTemplate" /> 
  18.     </bean> 

調整DAO實現類的代碼: 

  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. …   …  

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

 

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

原文鏈接:http://sarin.javaeye.com/blog/888458

【編輯推薦】

  1. Java持久化框架 DataNucleus 2.1發布
  2. 淺談Spring框架中的JDBC應用
  3. Spring框架的7個模塊
  4. 詳細介紹Spring框架
  5. 將Flex與Spring框架集成

 

責任編輯:彭凡 來源: Javaeye博客
相關推薦

2011-04-07 15:47:28

MySQL數據庫

2011-05-26 14:43:49

ORACLE數據庫異常處理

2011-03-03 11:07:57

Spring數據庫訪問ORM

2011-04-13 14:07:17

OracleSybase數據庫

2011-03-07 17:35:09

JavaACCESS數據庫

2011-07-12 16:41:14

mysql處理異常

2010-01-04 17:54:41

Silverligh訪

2011-08-05 14:02:17

MySQL數據庫異常處理

2011-06-24 15:57:35

SQL AzureDAC

2010-11-03 11:36:53

訪問DB2表

2011-08-10 16:01:11

OracleConstraint

2017-05-19 13:42:51

JavaSpring框架數據庫

2011-03-29 12:59:53

SilverlightWCF RIA Ser訪問數據庫

2010-06-04 14:59:06

MySQL數據庫

2011-05-19 11:33:38

數據庫訪問速度

2010-04-14 15:45:49

Oracle 數據庫

2011-05-17 14:46:38

Oracle數據庫故障

2011-08-03 15:38:43

ASP數據庫被掛木馬

2009-09-28 14:06:35

數據庫頁損壞

2009-08-25 16:01:32

C#.NET連接數據庫
點贊
收藏

51CTO技術棧公眾號

岛国毛片在线播放| 亚洲一区二区不卡视频| 日韩三级免费看| 欧美极品在线观看| 欧美日韩精品电影| 欧美一级视频在线播放| 国产一级在线| 国产精品88888| 日韩av电影国产| 日本a级片视频| 色哟哟精品丝袜一区二区| 欧美午夜片在线观看| 久久亚洲a v| 成人欧美亚洲| 成人av高清在线| 国产精品午夜一区二区欲梦| 国产精品第九页| 国产精品不卡| 亚洲欧美成人网| 日本一级大毛片a一| 久久久久久久性潮| 欧美视频一区二区三区…| 国产女主播av| 69av亚洲| 久久久国产午夜精品| 国产精品二区在线观看| 97超碰中文字幕| 老色鬼久久亚洲一区二区| 久久国产精品免费精品3p| 亚洲成人激情自拍| 好色先生视频污| 国产成人天天5g影院在线观看| 国产在线精品一区在线观看麻豆| 国产99久久久欧美黑人| 中文字幕在线观看免费视频| 欧美一区久久| 久久精品国产亚洲一区二区| 亚洲黄色免费视频| 午夜精品影视国产一区在线麻豆| 日韩一区二区三区在线观看| 色噜噜狠狠永久免费| 欧美成人a交片免费看| 姬川优奈aav一区二区| 人妻激情另类乱人伦人妻| 黄色网页在线免费看| 欧美国产乱子伦| 日韩在线导航| 成年人在线视频| 国产色综合一区| 欧美国产综合视频| 精品美女视频在线观看免费软件 | 激情五月俺来也| 欧美成人影院| 在线视频国产一区| 超碰在线97免费| 99久久er| 欧美人伦禁忌dvd放荡欲情| 亚洲无吗一区二区三区| 国产成人午夜性a一级毛片| 欧美日韩一区 二区 三区 久久精品| 成年人在线观看视频免费| 亚洲不卡系列| 欧美在线啊v一区| 尤物国产在线观看| 老司机亚洲精品一区二区| 日韩视频免费观看高清在线视频| 伊人久久久久久久久| 97成人在线| 日韩av在线直播| 我和岳m愉情xxxⅹ视频| 国产永久精品大片wwwapp| 在线成人中文字幕| 精品国产欧美日韩不卡在线观看| 亚洲欧美综合| 91成人天堂久久成人| 日本黄色一级视频| 麻豆国产一区二区| 99久久精品免费看国产一区二区三区 | 色综合视频一区二区三区日韩 | 日本三级免费网站| 中文字幕乱码在线播放| 欧美中文字幕一区二区三区| 一路向西2在线观看| 九九九精品视频| 91精品国产综合久久久久久久| 日日夜夜精品视频免费观看| 国产精伦一区二区三区| 亚洲女人天堂视频| 天天综合天天做| 中文一区在线| 国产欧美 在线欧美| 亚洲精品视频专区| 国产日韩欧美精品电影三级在线| 在线看视频不卡| 91超碰在线播放| 欧美伊人久久大香线蕉综合69| 手机精品视频在线| 网曝91综合精品门事件在线| 久久综合色影院| 国产又大又黄又粗| 国产精品一区二区在线播放| 久久福利电影| 国产成人午夜| 91福利视频网站| avtt中文字幕| 日韩精品免费| 91精品国产乱码久久久久久久久| 中文字幕一区二区三区免费看| 国产成人av一区二区三区在线| 日本不卡一区| www.51av欧美视频| 日韩一级完整毛片| wwwww黄色| 国产精品一二| 91蜜桃网站免费观看| 国产精品毛片一区二区三区四区| 亚洲一区二区免费视频| 思思久久精品视频| 精品av一区二区| 91av在线看| www.四虎在线观看| 亚洲免费在线视频| 亚洲视频一二三四| 精品免费在线| 国产不卡av在线免费观看| 丰满人妻一区二区三区无码av | 亚洲精品成人自拍| a欧美人片人妖| 亚洲福利视频网站| 久久国产露脸精品国产| 国产美女主播视频一区| 亚洲蜜桃av| 久久亚洲精品爱爱| 亚洲色图av在线| 成年人免费高清视频| 粉嫩av亚洲一区二区图片| 最新av在线免费观看| 日韩久久一区| 最近2019中文字幕第三页视频| 国产毛片aaa| 91色视频在线| 国产精品欧美激情在线观看| 国产精品videossex| 欧美韩国理论所午夜片917电影| 国产精品玖玖玖| 日韩毛片精品高清免费| 国产三级生活片| 综合色一区二区| 114国产精品久久免费观看| av免费在线免费| 精品少妇一区二区| 九九热国产视频| 成人av在线观| 成人av一级片| 久久综合影院| 国产色婷婷国产综合在线理论片a| 成人jjav| 欧美一级理论性理论a| 精品午夜福利视频| 99精品久久99久久久久| 美女福利视频在线| 欧美裸体在线版观看完整版| 国产女人18毛片水18精品| 免费在线毛片网站| 日韩欧美国产成人一区二区| 国产一级在线播放| 91网站在线观看视频| 国产男女激情视频| 91亚洲一区| 成人18视频| 久久青青视频| 久久精品99无色码中文字幕| 精品国产伦一区二区三区| 亚洲五月六月丁香激情| 2一3sex性hd| 日韩主播视频在线| 日本一道在线观看| 欧美一区 二区| 国产精品久久久久久久久久三级| 黄色片免费在线观看| 精品国精品自拍自在线| 亚洲国产成人无码av在线| 国产精品久久久爽爽爽麻豆色哟哟| 五月六月丁香婷婷| 国产亚洲精品久久久久婷婷瑜伽| 日本精品一区二区三区视频| 亚洲伊人伊成久久人综合网| 欧美激情极品视频| 国产视频第一区| 日韩一区二区影院| 99久久久无码国产精品免费蜜柚| 亚洲视频图片小说| 人妻在线日韩免费视频| 久久精品国产色蜜蜜麻豆| 亚洲人成无码网站久久99热国产| 国产一区二区三区天码| 97av影视网在线观看| 日本精品不卡| 久久久久久久亚洲精品| 91在线视频免费看| 亚洲黄色成人网| 国产人妻精品一区二区三区| 精品日本高清在线播放 | 手机在线不卡av| 欧美亚洲国产bt| 国产乡下妇女做爰视频| 国产精品久久久久久久第一福利| 黄色污在线观看| 国产一本一道久久香蕉| 午夜激情在线观看视频| 夜久久久久久| 亚洲国产一二三精品无码 | 亚洲人成毛片在线播放| 99久久久国产精品无码网爆 | 久久免费视频在线| 黄色精品免费看| 亚洲色图五月天| 少妇一级淫片免费看| 欧美一区二区观看视频| 综合久久中文字幕| 色综合久久综合网欧美综合网| 午夜69成人做爰视频| 中文字幕在线不卡| 妺妺窝人体色WWW精品| 成人免费av网站| 色欲无码人妻久久精品| 蜜臀va亚洲va欧美va天堂| 久久久久久久中文| 亚洲激情亚洲| 欧美高清中文字幕| 中文字幕一区二区三三| 伊人久久大香线蕉成人综合网| 欧美人妖在线| 欧美极品一区二区| 亚洲va久久久噜噜噜久久| 国产午夜精品一区| 精品欧美午夜寂寞影院| 国产另类自拍| 欧美变态网站| 国精产品一区二区| 欧洲亚洲一区二区三区| 国产麻豆一区二区三区在线观看| 77成人影视| 国产精品美女黄网| 国内露脸中年夫妇交换精品| 国产精品12| 老司机aⅴ在线精品导航| 成人欧美一区二区三区在线观看| 欧美视频精品全部免费观看| 99在线视频免费观看| 91精品久久久久久综合五月天| 97se亚洲综合| av男人一区| 国产在线精品二区| 亚洲免费专区| 亚洲午夜在线观看| 亚洲一区二区三区| 日韩精品在线中文字幕| 亚洲毛片一区| 国产精品无码一本二本三本色| 日本中文在线一区| 超碰成人在线播放| 国产99久久久久| 一区二区三区免费在线观看视频| 久久久久国产免费免费 | 四虎在线视频| 一区二区三区动漫| 国产视频一区二区| 国内外成人免费激情在线视频网站| 神马午夜在线视频| 国产精品美女视频网站| 免费精品一区二区三区在线观看| 国产精品区一区二区三在线播放 | 亚洲日本中文字幕| 精品国产99久久久久久| 欧美大秀在线观看| 周于希免费高清在线观看| 国产精品一区二区久久| 日韩成人视屏| 国产一区二区精品在线| 精品国产123区| 青青草视频在线视频| 亚洲深夜激情| 日本在线播放一区二区| 成人免费毛片片v| 懂色av蜜桃av| 亚洲国产日韩一级| 在线免费看91| 亚洲国产成人久久| 免费观看在线午夜影视| 久久人人看视频| 欧美成人家庭影院| 精品国产一区二区三区四区精华 | 日本一区二区成人| 精品无码av在线| 欧美日韩一二区| 日本波多野结衣在线| 最好看的2019年中文视频| 91禁在线看| 亚洲字幕在线观看| 成人免费看片39| 成人性免费视频| 精品一区二区三区在线观看国产| 久久无码人妻精品一区二区三区| 亚洲丝袜自拍清纯另类| 神马久久久久久久| 亚洲激情中文字幕| 91香蕉在线观看| 国产精品视频免费观看www| 久久91在线| 国产xxxx振车| 精品一区二区三区免费观看| 精品国产av无码| 狠狠色狠狠色综合日日小说| 亚洲av无码专区在线| xvideos亚洲人网站| 经典三级一区二区| 久久精品99久久| 精品福利电影| 欧美熟妇另类久久久久久多毛| 欧美极品另类videosde| 久久99国产综合精品免费| 精品福利视频一区二区三区| 91极品在线| 91亚洲精品视频| 91久久久精品国产| 天天干天天av| 国产精品国产三级国产a | 亚洲精品在线一区二区| 亚洲制服国产| 91超碰在线免费观看| 伊人久久大香线| 欧美熟妇另类久久久久久多毛| 综合av第一页| 国产口爆吞精一区二区| 精品国产网站地址| 精品国产一区二| 特级西西444| 国产91精品欧美| 久一视频在线观看| 亚洲国产精品高清久久久| 99热99re6国产在线播放| 国产高清自拍一区| 99国产精品私拍| 深爱五月激情网| 色偷偷久久人人79超碰人人澡| 欧美午夜黄色| 国产成人免费av电影| 精品久久综合| 狠狠干狠狠操视频| 亚洲精品写真福利| www.国产欧美| 97视频在线免费观看| 四虎5151久久欧美毛片| 国产精品无码av无码| 国产精品视频你懂的| 国产区精品在线| 久久久久久久一| 九九视频精品全部免费播放| 在线观看免费成人av| 亚洲丝袜美腿综合| 日日夜夜精品免费| 国产不卡av在线| 小说区亚洲自拍另类图片专区| 三级网站免费看| 偷拍亚洲欧洲综合| 国产毛片av在线| 91久久精品国产91性色| 亚洲黄色一区| 免费看黄色的视频| 欧美精品第1页| 波多野结依一区| 日本在线成人一区二区| 激情都市一区二区| 日韩欧美国产亚洲| 中文字幕视频一区二区在线有码| 日本成人精品| 日本一区二区黄色| 中文字幕一区二区日韩精品绯色| 性生交大片免费看女人按摩| 欧美自拍视频在线| 亚洲午夜精品一区 二区 三区| www.超碰97| 欧美欧美欧美欧美| www.综合| 伊人狠狠色丁香综合尤物| 99久久精品久久久久久清纯| 影音先锋国产资源| 91av在线免费观看视频| 91精品国产成人观看| 亚洲熟妇一区二区三区| 6080亚洲精品一区二区| 在线天堂资源| 日韩中文字幕亚洲精品欧美| 国产拍揄自揄精品视频麻豆| 成 人 黄 色 片 在线播放| 国产精品免费视频久久久| 亚洲三级影院| 神马午夜精品91| 亚洲欧美日韩一区二区在线|