精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品成人av久久| 不卡中文字幕在线观看| 天堂中文资源在线| 视频在线观看国产精品| 亚洲视频在线观看视频| 三级在线免费看| 国产精品刘玥久久一区| eeuss鲁片一区二区三区在线观看| 久久琪琪电影院| 亚洲第一视频区| 久久爱www.| 黑人巨大精品欧美一区二区一视频 | 国产特黄级aaaaa片免| 国产成人免费精品| 午夜精品久久一牛影视| 亚洲精品在线视频观看| 刘亦菲毛片一区二区三区| 久久天堂成人| 欧美激情免费看| 一级片视频免费看| 丁香婷婷成人| 91麻豆精品国产自产在线 | 日韩你懂的在线观看| 欧美日韩黄色一级片| 国内精品久久久久久野外| 99视频有精品| www 成人av com| 波多野结衣视频观看| 在线国产日韩| xxx欧美精品| 日本一级免费视频| 久久久久97| 欧美一区二区三区小说| 亚洲色图 在线视频| 日本三级一区| 一区二区成人在线| 中文字幕超清在线免费观看| 青青草在线播放| www.欧美色图| 97人人模人人爽人人少妇| 中文字幕av片| 久久男女视频| 8090成年在线看片午夜| 久久精品国产亚洲av高清色欲| 99国产**精品****| 色香阁99久久精品久久久| 成年人网站免费看| 日韩理论电影中文字幕| 精品999久久久| 老司机av网站| 日本免费一区二区视频| 欧美一级日韩免费不卡| 91国内在线播放| 欧美日韩视频免费看| 欧美性色黄大片手机版| 无码内射中文字幕岛国片| 美女日韩欧美| 91福利在线导航| 天天碰免费视频| 欧美日韩精品免费观看视欧美高清免费大片| 天天综合色天天综合色h| 僵尸世界大战2 在线播放| 国产精品蜜臀| 午夜久久久久久久久| 国产中文字幕二区| 亚洲女同志freevdieo| 欧美性猛交xxxx富婆| 久久国产乱子伦免费精品| 欧美男女交配| 欧美日韩中字一区| 中文字幕在线视频一区二区三区 | 国产九色精品| 天天综合网在线| 91亚洲精品一区二区乱码| 鲁鲁视频www一区二区| 毛片在线播放网站| 中文字幕高清不卡| 中文字幕中文字幕99| a级毛片免费观看在线| 亚洲午夜精品在线| 久久9精品区-无套内射无码| 88xx成人永久免费观看| 精品视频一区 二区 三区| 91插插插影院| 国偷自产视频一区二区久| 亚洲男人天堂网| 亚洲AV成人无码网站天堂久久| 亚洲自拍偷拍网| 国内精品久久久久久久| 午夜精品免费观看| 国产乱子轮精品视频| 国产伦精品一区| 川上优的av在线一区二区| 亚洲欧美在线另类| 男人的天堂狠狠干| 久久er热在这里只有精品66| 日韩女优av电影在线观看| 欧美成人午夜精品免费| 国产精品videosex性欧美| 久久久亚洲欧洲日产国码aⅴ| 91精品国产高清一区二区三密臀| 久热成人在线视频| 国产精品一区二区免费看| youjizz在线播放| 亚洲午夜久久久久| 日韩中文字幕a| 久久久久观看| 久久国产精品免费视频| 日本三级小视频| 国内精品写真在线观看| 精品一卡二卡三卡四卡日本乱码 | 精品中文一区| 欧美日韩第一页| 亚洲图片欧美日韩| 成人黄页毛片网站| 在线日韩av永久免费观看| 成入视频在线观看| 91精品国产综合久久久蜜臀粉嫩 | 亚洲欧美区自拍先锋| 国产成人无码a区在线观看视频| 欧美极品在线| 亚洲欧美一区二区三区四区| 欧美日韩在线视频免费| 日韩av在线免费观看不卡| 国产精品一区二区三区观看| 国产网友自拍视频导航网站在线观看 | 精品国产免费人成电影在线观看四季 | 欧美成人午夜77777| 欧美人在线视频| 中文字幕久久久久| 国产亚洲欧美日韩日本| 成年人观看网站| 7777精品| 色综合天天狠天天透天天伊人| 中文字幕在线观看高清| 99精品视频在线播放观看| 国产免费xxx| 日韩三级成人| 少妇激情综合网| www.久久视频| 国产亚洲短视频| 国产aaa一级片| 日日狠狠久久偷偷综合色| 欧美国产中文字幕| 亚洲AV无码乱码国产精品牛牛 | 国产又大又长又粗又黄| 国外成人福利视频| 亚洲网站在线播放| 无码视频在线观看| 久久久99免费| 九色在线视频观看| 九热爱视频精品视频| 5278欧美一区二区三区| 色就是色亚洲色图| 欧美性猛交xxxx乱大交3| 黄瓜视频污在线观看| 日韩电影在线免费看| 日韩欧美在线观看强乱免费| 日韩欧美一区二区三区在线观看 | 国产真人做爰视频免费| 日本伊人精品一区二区三区观看方式 | 久久久精品麻豆| 成人影院天天5g天天爽无毒影院| 国产精品视频地址| 草莓福利社区在线| 欧美v日韩v国产v| 日本中文字幕网| 久久男人中文字幕资源站| 久久久久久久少妇| 999久久久免费精品国产| 91久久中文字幕| 韩国日本一区| 亚洲理论在线a中文字幕| 中文字幕天堂在线| 亚洲欧美另类久久久精品2019| 少妇愉情理伦片bd| 国产亚洲激情| 亚洲国产精品123| 精品国模一区二区三区欧美| 国产69精品久久久久9| 黄色毛片在线观看| 欧美精品日韩一本| 五月天婷婷网站| 久久精品视频免费| 男女污污视频网站| 国产精品日本| 国产麻豆电影在线观看| 黄色成人美女网站| 国产精品久久久精品| 中文字幕有码在线观看| 国产视频精品va久久久久久| 亚洲熟女乱色一区二区三区久久久| 综合av第一页| 97人妻精品一区二区三区免| 麻豆久久久久久| 日韩一级性生活片| 欧美日韩一区二区三区视频播放| 亚洲free嫩bbb| 欧美天堂视频| 久久91超碰青草是什么| 国产在线一二三区| 欧美va亚洲va香蕉在线 | 日韩一区二区精品在线观看| 久久草视频在线| 中文字幕一区二区三区乱码在线| 国产伦精品一区二区三区88av| 秋霞午夜av一区二区三区| 国产精品国三级国产av| 波多野结衣的一区二区三区| 国产精品视频免费一区| 色综合一区二区日本韩国亚洲| 午夜精品蜜臀一区二区三区免费| 在线观看完整版免费| 日韩av中文字幕在线免费观看| 91精品视频免费在线观看| 高跟丝袜一区二区三区| 久久一级黄色片| 国产精品理论在线观看| 成人午夜福利一区二区| 成人夜色视频网站在线观看| 久久黄色片网站| 老司机午夜免费精品视频| 国产欧美日韩网站| 欧美日本一区| mm131午夜| 欧美a级成人淫片免费看| 美女主播视频一区| 国产精品xxxav免费视频| 97久草视频| 国产日韩一区二区三免费高清| 国产精品久久久久久久久久ktv | 午夜欧美精品| 丰满女人性猛交| 久久日文中文字幕乱码| 色综合666| 国产在线日韩精品| 欧美视频1区| 性人久久久久| 精品高清视频| 欧美日韩一本| 久久国产精品高清| 亚欧日韩另类中文欧美| 精品视频导航| 婷婷成人影院| 亚洲激情视频网站| 成人黄色片免费| 精品国产一区二区三区不卡蜜臂| 亚洲一区二区三区视频播放| 亚洲精品69| 亚洲a成v人在线观看| 日韩三级av高清片| 99re国产| 精品亚洲精品| 欧美国产一区二区在线| 九九视频免费观看视频精品| 青青草成人网| 成人羞羞网站入口免费| 亚洲欧美日韩不卡| 欧美激情第8页| 成人性生活视频免费看| 在线午夜精品| 亚洲中文字幕无码不卡电影| 日韩av一级片| 91日韩精品视频| 国产99精品视频| 三叶草欧洲码在线| 国产欧美日韩亚州综合| 免费成人美女女在线观看| 亚洲欧美电影一区二区| 国产一级片免费| 欧美日韩国产一区中文午夜| 日本黄色中文字幕| 欧美日韩高清影院| 亚洲大尺度视频| 欧美视频二区| 亚洲一区二区免费在线| 婷婷综合国产| 精品视频一区在线| 日韩久久综合| 欧美狂野激情性xxxx在线观| 亚洲一区二区伦理| 国产三级三级看三级| 国产高清在线观看免费不卡| 欧美精品黑人猛交高潮| 国产精品美女一区二区在线观看| 中文字幕手机在线观看| 精品久久久久久久久中文字幕| 天天天天天天天干| 日韩亚洲欧美高清| 男女网站在线观看| 日韩三级成人av网| 在线高清av| 91久久精品国产91久久性色| 精品精品国产毛片在线看| 亚洲v国产v在线观看| 欧美在线观看天堂一区二区三区| 97成人在线免费视频| 免费精品视频在线| 性久久久久久久久久久| 国产精品久久久久久久久久久免费看 | 欧美激情欧美狂野欧美精品| 美脚恋feet久草欧美| 亚洲精品日产aⅴ| 国产欧美日韩| 日韩一级性生活片| 国内精品伊人久久久久av影院| 国产精品亚洲无码| 亚洲综合一区在线| 中文字幕人妻一区二区在线视频 | 户外极限露出调教在线视频| 九九久久综合网站| 99欧美精品| 久久99精品久久久久子伦| 欧美不卡在线| xxx国产在线观看| 91麻豆国产精品久久| 欧美日韩在线视频免费| 欧美日韩精品欧美日韩精品一 | 国产欧美一区二区精品仙草咪| 欧美黄色免费在线观看| 欧美日韩亚洲高清一区二区| 亚洲 欧美 激情 另类| 色综合久久中文字幕综合网小说| 欧美aaa大片视频一二区| 精品无码久久久久久久动漫| 欧美天天视频| 午夜诱惑痒痒网| 国产精品每日更新在线播放网址| 国产日产精品一区二区三区| 亚洲精品在线免费观看视频| 97超碰在线公开在线看免费| 91精品久久久久久久久| 成人三级视频| 毛葺葺老太做受视频| 91麻豆国产在线观看| 久久久国产精品成人免费| 亚洲的天堂在线中文字幕| 日本片在线观看| 亚洲自拍偷拍一区| 伊人久久大香线蕉综合四虎小说| 在线观看日本一区二区| 国产精品美日韩| 91国内精品视频| 最近日韩中文字幕中文| 91精品国产经典在线观看| 日韩欧美三级一区二区| 日本视频中文字幕一区二区三区| 黄色在线观看av| 日韩欧美在线播放| 男人天堂网在线| 国产成人精品网站| 成人羞羞动漫| 免费一区二区三区在线观看| 国产精品国产成人国产三级| 91国内精品久久久| 欧美大胆a视频| 成午夜精品一区二区三区软件| 日本国产中文字幕| 成人av在线影院| 女人十八岁毛片| 亚洲性xxxx| 久久婷婷五月综合色丁香| 一区二区视频在线播放| 国内精品免费**视频| 久久久精品99| 日韩精品久久久久久福利| 婷婷综合六月| 一区二区三区四区五区视频 | 69xxx免费视频| 精品久久久久久久久国产字幕| 三区在线视频| 国产精品一久久香蕉国产线看观看| 999精品色在线播放| 91超薄肉色丝袜交足高跟凉鞋| 五月天丁香久久| 国产高清免费在线播放| 91免费欧美精品| 日韩网站在线| 国产在线综合视频| 日韩视频123| 亚洲人体影院| 中文字幕一区综合| 99久久免费精品| 中文字幕在线观看免费| 久久久久久伊人| 精品日韩毛片| 2018国产精品| 91国产视频在线观看| 97caopron在线视频| 欧美一区二区三区在线播放| 精品一区二区日韩| 国产综合精品视频| 久久久黄色av| 亚洲精品小区久久久久久| 精品国产鲁一鲁一区二区三区| 亚洲高清不卡在线观看| 最新真实国产在线视频| 国产伦精品一区二区三区高清版 | 影音先锋日韩在线| 丰满少妇在线观看资源站|