国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

Java SE 6中JDBC 4.0的增強特性

瀏覽:76日期:2024-06-06 09:05:09
內(nèi)容: Java SE 6包含了對Java數(shù)據(jù)庫互連(JDBC)API的一些增強特性。這些增強特性的版本將定為JDBC version 4.0。JDBC新特性的目的是提供更簡單的設計和更好的開發(fā)體驗。本文將概述JDBC 4.0的增強特性和為企業(yè)級Java開發(fā)人員帶來的好處。我們將通過一個用Apache Derby作為后臺數(shù)據(jù)庫的貸款處理應用范例來探究JDBC的新特性。版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時請務必保留以下作者信息和鏈接作者:feichangcai;feichangcai原文:http://www.matrix.org.cn/resource/article/2006-11-19/Mustang+JDBC_c8c66f03-77c2-11db-bdce-bdc029e475a1.html關鍵字:Mustang;JDBCJava SE 6.0Java SE 6.0版以兼容性、穩(wěn)定性和品質(zhì)作為設計目標。本版本中有不少值得關注的增強特性,特別是JMX、web services、腳本語言支持(采用Rhino腳本引擎JSR 223把JavaScript技術(shù)與Java源碼進行集成)、數(shù)據(jù)庫連接、支持annotations和安全部分。另外,在JDBC API中還有不少新的特性,包括RowId支持和新增的SQLException子類。JDBC 4.0的特性得益于Mustang中的Java SE 服務提供商機制,Java開發(fā)人員再也不必用類似Class.forName()的代碼注冊JDBC驅(qū)動來明確加載JDBC。當調(diào)用DriverManager.getConnection()方法時,DriverManager類將自動設置合適的驅(qū)動程序。該特性向后兼容,因此無需對現(xiàn)有的JDBC代碼作任何改動。通過對Java應用程序訪問數(shù)據(jù)庫代碼的簡化,使得JDBC 4.0有更好的開發(fā)體驗。JDBC 4.0同時也提供了工具類來改進數(shù)據(jù)源和連接對象的管理,也改進了JDBC驅(qū)動加載和卸載機制。有了JDBC 4.0傳承自Java SE 5.0 (Tiger)版對元數(shù)據(jù)的支持功能,Java開發(fā)人員可用Annotations明確指明SQL查詢?;跇俗⒌腟QL查詢允許我們通過在Java代碼中使用Annotation關鍵字正確指明SQL查詢字符串。這樣,我們不必查看JDBC代碼和他所調(diào)用的數(shù)據(jù)庫兩份不同的文件。例如,用一個名為getActiveLoans()方法在貸款處理數(shù)據(jù)庫中獲取一個活躍貸款清單,你可以添加@Query(sql='SELECT * FROM LoanApplicationDetails WHERE LoanStatus = 'A'')標注來修飾該方法。并且,最終版的Java SE 6開發(fā)包(JDK 6)以及其相應的執(zhí)行期環(huán)境(JRE 6)會捆綁一個基于Apache Derby的數(shù)據(jù)庫。這使得Java開發(fā)人員無需下載、安裝和配置一款單獨的數(shù)據(jù)庫產(chǎn)品就能探究JDBC的新特性。JDBC 4.0中增加的主要特性包括:1. JDBC驅(qū)動類的自動加載2. 連接管理的增強3. 對RowId SQL類型的支持4. SQL的DataSet實現(xiàn)使用了Annotations5. SQL異常處理的增強6. 對SQL XML的支持 另外,對BLOB/CLOB 的改進支持以及對國際字符集的支持也是JDBC 4.0的特性。這些特性將在隨后章節(jié)中詳細討論。JDBC驅(qū)動自動加載在JDBC 4.0中,我們不必再使用Class.forName()方法明確加載JDBC驅(qū)動。當調(diào)用getConnection方法時,DriverManager會嘗試從初始化時已經(jīng)加載的JDBC驅(qū)動程序庫中選擇合適的驅(qū)動,以及他在當前應用的同一個類加載器中明確加載使用過的驅(qū)動。DriverManager中的getConnection和getDrivers方法已作了改進,以支持Java SE 服務提供商機制(SPM)。根據(jù)SPM,所謂服務就是一組廣為人知的接口和抽象類的集合,而服務提供商就是對某一服務的特定實現(xiàn)。SPM還指明了服務提供商的配置文件存放于META-INF/services目錄下。JDBC 4.0的驅(qū)動程序庫必須包含META-INF/services/java.sql.Driver文件。該文件包含對java.sql.Driver 實現(xiàn)的JDBC驅(qū)動文件名。例如,通過JDBC驅(qū)動連接Apache Derby數(shù)據(jù)庫,META-INF/services/java.sql.Driver將含有以下路徑:org.apache.derby.jdbc.EmbeddedDriver我們再來快速地看一下如何使用這一新特性加載一個JDBC驅(qū)動管理。以下顯示的是我們用以加載JDBC驅(qū)動的典型范例代碼。這里我們假設連接的是Apache Derby數(shù)據(jù)庫,因為該數(shù)據(jù)庫將在本文隨后的范例應用中用到: Class.forName('org.apache.derby.jdbc.EmbeddedDriver'); Connection conn = DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword);但在JDBC 4.0中,我們不必寫Class.forName()這一行,我們只需要調(diào)用getConnection()方法取得數(shù)據(jù)庫連接。請注意,僅在完全獨立的模式下可使用該方法取得數(shù)據(jù)庫的連接。如果你使用一些類似數(shù)據(jù)庫連接池等技術(shù)管理連接,那么代碼將有所不同。連接管理在JDBC 4.0之前,我們依靠JDBC URL來定義一個數(shù)據(jù)源連接。現(xiàn)在有了JDBC 4.0,我們只需為標準連接工廠機制提供一組參數(shù),就能獲取與任何數(shù)據(jù)源的連接。Connection和Statement接口增添的新方法為池環(huán)境中管理Statement對象提供了更好的連接狀態(tài)跟蹤機制和更大的靈活度。元數(shù)據(jù)工具(JSR-175)被用來管理活躍連接。我們還能獲得元數(shù)據(jù)信息,如:活躍連接狀態(tài),并能指明XA事務的某一連接是標準式(Connection,在獨立應用的情況下)、池式(PooledConnection)還是分布式(XAConnection)。該接口僅在諸如WebLogic、WebSphere和JBoss等Java EE應用服務器的事務管理中使用。RowId支持JDBC 4.0增加了RowID接口以支持ROWID數(shù)據(jù)類型,Oracle和DB2數(shù)據(jù)庫支持該數(shù)據(jù)類型。在你需要把大量缺少唯一標識符字段的查詢記錄放入一個不允許重復對象的Collection容器(如Hashtable)的情況下,RowId很有用。我們可以用ResultSet的getRowId()方法獲取RowId,用PreparedStatement的setRowId()方法在查詢中使用RowId。關于RowId對象需要記住的一件重要事項是,RowId值在數(shù)據(jù)源之間不可移植。當在PreparedStatement和ResultSet中單獨使用set或update方法時,需要想到指明數(shù)據(jù)源。因此,RowId對象不應被不同的Connection和ResultSet對象共享。DatabaseMetaData中的getRowIdLifetime()方法可被用來確定RowId對象的有效存活時間。該方法的可能返回值如表1所列:RowId值 描述ROWID_UNSUPPORTED Doesn't support ROWID data type.ROWID_VALID_OTHER Lifetime of the RowID is dependent on database vendor implementation.ROWID_VALID_TRANSACTION Lifetime of the RowID is within the current transaction as long as the row in the database table is not deleted.ROWID_VALID_SESSION Lifetime of the RowID is the duration of the current session as long as the row in the database table is not deleted.ROWID_VALID_FOREVER Lifetime of the RowID is unlimited as long as the row in the database table is not deleted.基于標注的SQL查詢JDBC 4.0對標注(Java SE 5新增)作了進一步規(guī)范和補充,他允許開發(fā)人員不必再寫大量代碼就能達到聯(lián)系SQL查詢和Java類的目的。并且,通過使用Generics(JSR 014)和元數(shù)據(jù)(JSR 175) API,我們只要指明查詢的輸入和輸出參數(shù)就能將SQL查詢與Java對象進行關聯(lián)。我們還可以將查詢結(jié)果捆綁在Java類上以加快查詢輸出的處理。將查詢對象置于Java對象之中,我們可以不必像往常一樣寫所有代碼。在Java代碼中指明SQL查詢,經(jīng)常用到兩種標注:Select標注Select標注用于在Java類中指明一個選擇查詢,使get方法能從數(shù)據(jù)庫表中取回數(shù)據(jù)。表2顯示的是Select標注的不同屬性及其作用:變量 類型 描述sql String SQL Select query string.value String Same as sql attribute.tableName String Name of the database table against which the sql will be invoked.readOnly, connected, scrollable Boolean Flags used to indicate if the returned DataSet is read-only or updateable, is connected to the back-end database, and is scrollable when used in connected mode respectively.allColumnsMapped Boolean Flag to indicate if the column names in the sql annotation element are mapped 1-to-1 with the fields in the DataSet.這里有一個應用Select標注從貸款數(shù)據(jù)庫中獲取所有活躍貸款的例子:interface LoanAppDetailsQuery extends BaseQuery { @Select('SELECT * FROM LoanDetais where LoanStatus = 'A'') DataSet getAllActiveLoans();}Sql標注同樣允許I/O參數(shù)(參數(shù)標記以一個問號后跟一個整型數(shù)據(jù)表示)。這里是一個參數(shù)化sql查詢的例子:interface LoanAppDetailsQuery extends BaseQuery { @Select(sql='SELECT * from LoanDetails where borrowerFirstName= ?1 and borrowerLastName= ?2') DataSet getLoanDetailsByBorrowerName(String borrFirstName, String borrLastName);}Update標注Update標注用于修飾Query接口方法以更新數(shù)據(jù)庫表中的一條或多條記錄。Update標注必須包含一個sql標注類型元素。這里是一個Update標注的例子:interface LoanAppDetailsQuery extends BaseQuery { @Update(sql='update LoanDetails set LoanStatus = ?1 where loanId = ?2') boolean updateLoanStatus(String loanStatus, int loanId);}SQL異常處理的增強特性異常處理是Java編程的一個重要部分,特別是對后臺關系數(shù)據(jù)庫進行連接或查詢時。SQLException是我們用以指出與數(shù)據(jù)庫相關錯誤的類。JDBC 4.0在SQLException處理中有不少增強。為了在處理SQLException時獲得更好的開發(fā)體驗,JDBC 4.0版作了如下增強:1. 新的SQLException子類2. 對因果關系的支持3. 對改進的for-each循環(huán)的支持新的SQLException類SQLException的新子類提供了一種方法,使Java開發(fā)人員能寫出更方便改動的錯誤處理代碼。JDBC 4.0介紹了兩個新的SQLException型別:• SQL non-transient exception • SQL transient exception Non-Transient Exception:除非修正引發(fā)SQLException異常的代碼,否則該異常在再次嘗試相同JDBC操作失敗后被拋出。表3顯示了JDBC 4.0新增的SQLNonTransientException異常子類(SQL 2003規(guī)范中定義了SQLState類的值):Exception class SQLState valueSQLFeatureNotSupportedException 0ASQLNonTransientConnectionException 08SQLDataException 22SQLIntegrityConstraintViolationException 23SQLInvalidAuthorizationException 28SQLSyntaxErrorException 42Transient Exception:當先前執(zhí)行失敗的JDBC操作在沒有任何應用級功能干涉的情況下可能成功執(zhí)行時,該異常被拋出。繼承自SQLTransientException的新異常如表4所列:Exception classSQLState valueSQLTransientConnectionException 08SQLTransactionRollbackException 40SQLTimeoutException None因果關系SQLException類現(xiàn)在支持Java SE鏈式異常機制(又稱因果工具),它使我們能在一個JDBC操作中處理多條SQLException異常(如果后臺數(shù)據(jù)庫支持多條異常特性)。這種情形發(fā)生在執(zhí)行一條可能會拋出多條SQLException異常的語句時。我們可以調(diào)用SQLException中的getNextException()方法在異常鏈中進行迭代。這里是一些處理getNextException()因果關系的范例代碼:catch(SQLException ex) { while(ex != null) { LOG.error('SQL State:' + ex.getSQLState()); LOG.error('Error Code:' + ex.getErrorCode()); LOG.error('Message:' + ex.getMessage()); Throwable t = ex.getCause(); while(t != null) { LOG.error('Cause:' + t); t = t.getCause(); } ex = ex.getNextException(); }}增強的For-Each環(huán)Java SE 5中,SQLException類通過實現(xiàn)Iterable接口,增加了for-each循環(huán)支持的特性。這個循環(huán)的軌跡將會包括SQLException和其異常成因。這里的代碼片斷展示了SQLException中增加的增強型for-each環(huán)特性。catch(SQLException ex) { for(Throwable e : ex ) { LOG.error('Error occurred: ' + e); }}對國際字符集轉(zhuǎn)換的支持以下是JDBC類處理國際字符集的新增特性:1. JDBC數(shù)據(jù)類型:新增NCHAR、NVARCHAR、LONGNVARCHAR和NCLOB數(shù)據(jù)類型。2. PreparedStatement:新增setNString、setNCharacterStream和setNClob方法。3. CallableStatement:新增getNClob、getNString和getNCharacterStream方法。4. ResultSet:ResultSet接口新增updateNClob、updateNString和updateNCharacterStream方法。對大對象(BLOBs and CLOBs)支持的改進以下是JDBC 4.0處理LOBs的新增特性:1. Connection:新增方法(createBlob()、createClob()和createNClob())以創(chuàng)建BLOB、CLOB和NCLOB對象新實例。2. PreparedStatement:新增方法setBlob()、setClob()和setNClob()以使用InputStream對象插入BLOB對象,使用Reader對象插入CLOB和NCLOB對象。3. LOBs:在Blob、Clob和NClob接口中新增方法(free())以釋放這些對象所持有的資源?,F(xiàn)在,讓我們來看一看java.sql和javax.jdbc包的新類,以及他們所提供的服務。JDBC 4.0 API:新類RowId (java.sql)正如先前所介紹的,該接口是對數(shù)據(jù)庫中SQL ROWID值的展示。ROWID是一種SQL內(nèi)建的數(shù)據(jù)類型,用來標識數(shù)據(jù)庫中的一行特定數(shù)據(jù)。ROWID經(jīng)常用于從表中返回查詢結(jié)果,而這些結(jié)果行往往缺少唯一ID字段。getRowId和setRowId等CallableStatement、PreparedStatement和ResultSet接口的方法允許程序員訪問SQL ROWID值。RowId接口還提供了一個方法(叫g(shù)etBytes())把ROWID值作為一個byte型數(shù)組返回。DatabaseMetaData接口有一個名為getRowIdLifetime的新方法,用以確定某一RowId對象的存活時間。RowId的存活時間范圍可以是如下三種類型:1. 創(chuàng)建RowId的數(shù)據(jù)庫事務持續(xù)時間2. 創(chuàng)建RowId的會話持續(xù)時間3. 數(shù)據(jù)庫對應的記錄還未被刪除的持續(xù)時間DataSet (java.sql)DataSet接口提供了對執(zhí)行SQL Query后所返回數(shù)據(jù)類型的安全檢查。DataSet還可以運行在連接或非連接模式。在連接模式下,DataSet類似于ResultSet的功能;而在非連接模式下,他類似于CachedRowSet的功能。由于DataSet繼承自List接口,因此我們能對查詢返回的記錄行進行迭代。對已有的類,JDBC 4.0也新增了不少方法。比如,Connection新增了createSQLXML和createSQLXML方法,ResultSet新增了getRowId方法。范例應用本文所示的范例應用是一個貸款處理應用軟件,他有一個貸款搜索頁面,用戶可以通過輸入貸款ID提交查詢表,以獲取貸款詳情。貸款搜索頁面調(diào)用一個控制器對象,而該對象又調(diào)用一個DAO對象訪問后臺數(shù)據(jù)庫,以取回貸款詳情。這些詳情包括貸款人、貸款數(shù)額、貸款截至日期等信息,并顯示在貸款詳情屏幕上。后臺數(shù)據(jù)庫中,我們有一個名為LoanApplicationDetails的表,來存儲貸款軟件的詳情。該范例應用的用例是通過指定貸款ID來獲取貸款詳情。當貸款已經(jīng)登記并將抵押物與利息掛鉤后,貸款詳情就可以被獲取。表5顯示了貸款處理應用軟件項目的詳情。Name ValueProject Name JdbcAppProject Directory c:devprojectsJdbcAppDB Directory c:devdbserversapachederbyJDK Directory c:devjavajdk_1.6.0IDE Directory c:devtoolseclipseDatabase Apache Derby 10.1.2.1JDK 6.0 (beta 2 release)IDE Eclipse 3.1Unit Testing JUnit 4Build Ant 1.6.5下表所列的是我們連接貸款詳情Apache Derby數(shù)據(jù)庫所需的JDBC參數(shù)。這些參數(shù)存放于一個名為derby.properties的文本文件中,并置于項目的etc/jdbc目錄下(見表6)。Name ValueJDBC Driver File LoanAppMETA-INFservicesjava.sql.driverDriver org.apache.derby.ClientDriverURL jdbc:derby:derbyDBUser Id user1Password user1請注意:Apache Derby數(shù)據(jù)庫提供了兩種JDBC驅(qū)動:嵌入式驅(qū)動(org.apache.derby.jdbc.EmbeddedDriver)和客戶端/服務器驅(qū)動(org.apache.derby.jdbc.ClientDriver)。我在范例應用中使用客戶端/服務器版驅(qū)動。以下是使用ij工具來啟動Derby數(shù)據(jù)庫服務器并創(chuàng)建新數(shù)據(jù)庫的命令。要啟動Derby網(wǎng)絡服務器,需開啟一個命令行窗口,并運行如下命令(請根據(jù)你本機的環(huán)境改寫DERBY_INSTALL和JAVA_HOME環(huán)境變量)。set DERBY_INSTALL=C:devdbserversdb-derby-10.1.2.1-binset JAVA_HOME=C:devjavajdk1.6.0set DERBY_INSTALL=C:devdbserversdb-derby-10.1.3.1-binset CLASSPATH=%CLASSPATH%;%DERBY_INSTALL%libderby.jar; %DERBY_INSTALL%libderbytools.jar; %DERBY_INSTALL%libderbynet.jar;cd %DERBY_INSTALL%frameworksNetworkServerbinstartNetworkServer.bat要連接數(shù)據(jù)庫服務器并創(chuàng)建測試數(shù)據(jù)庫,需開啟另一個命令行窗口并運行以下命令。請確保DERBY_INSTALL和JAVA_HOME環(huán)境變量符合你本機的環(huán)境。set JAVA_HOME=C:devjavajdk1.6.0set DERBY_INSTALL=C:devdbserversdb-derby-10.1.3.1-binset CLASSPATH=%DERBY_INSTALL%libderbyclient.jar; %DERBY_INSTALL%libderbytools.jar;.%JAVA_HOME%binjava org.apache.derby.tools.ijconnect 'jdbc:derby://localhost:1527/LoanDB;create=true';測試要編譯Java源代碼,classpath需包括derby.jar和junit4.jar文件,這兩個文件在項目的lib目錄下。Classpath還需包括etc、etc/jdbc和etc/log4j目錄,這樣應用程序才能訪問JDBC屬性文件和Log4J配置文件。我創(chuàng)建了一個Ant構(gòu)建腳本(在JdbcApp/build目錄下)來自動完成編譯和打包Java源代碼的工作。用于測試貸款詳情數(shù)據(jù)庫訪問對象的測試類名為LoanAppDetailsDAOTest。我們傳入貸款ID和貸款人參數(shù)就可以獲取貸款詳情。以下部分顯示了JDBC 4.0中自動加載JDBC驅(qū)動和基于標注的SQL查詢特性的代碼范例。JDBC驅(qū)動的自動加載BaseDAO抽象類有一個名為getConnection的方法用以獲得一個數(shù)據(jù)庫連接。以下代碼片斷顯示了該方法(注意,我們不必注冊JDBC驅(qū)動)。只要java.sql.Driver文件中有合適的驅(qū)動程序類名(org.apache.derby.jdbc.ClientDriver),JDBC驅(qū)動將被自動加載。protected Connection getConnection() throws DAOException { // Load JDBC properties first if (jdbcUrl == null || jdbcUser == null || jdbcPassword == null) { loadJdbcProperties(); } // Get Connection Connection conn = null; try { conn = DriverManager.getConnection(jdbcUrl, jdbcUser,jdbcPassword); } catch (SQLException sqle) { throw new DAOException('Error in getting a DB connection.',sqle); } return conn;}SQL標注LoanAppDetailsQuery接口有標注了的SQL查詢,用以獲取活躍貸款清單(criteria is loanstatus='A')和某貸款人的貸款詳情(在一個貸款人有多筆貸款的情況下)。在上文中,我們已經(jīng)了解過了這些SQL標注。這里的范例代碼顯示了我們?nèi)绾问褂脴俗碚{(diào)用已定義的SQL查詢。public DataSet getAllActiveLoans() throws Exception { // Get Connection Connection conn = getConnection(); LoanAppDetailsQuery query = null; DataSet loanDetails = null; query = QueryObjectFactory.createQueryObject( LoanAppDetailsQuery.class, conn); loanDetails = query.getAllActiveLoans(); return loanDetails;}public DataSet getLoanDetailsByBorrowerName( String borrFirstName, String borrLastName) throws Exception { // Get Connection Connection conn = getConnection(); LoanAppDetailsQuery query = null; DataSet loanDetails = null; query = QueryObjectFactory.createQueryObject( LoanAppDetailsQuery.class, conn); loanDetails = query.getLoanDetailsByBorrowerName( borrFirstName,borrLastName); return loanDetails;}結(jié)論JDBC 4.0在SQL方面為開發(fā)者提供了更好的開發(fā)體驗。JDBC 4.0的另一個目標是為API增加更豐富的工具以提供企業(yè)級JDBC特性管理JDBC資源。并且,JDBC 4.0 API還提供了JDBC驅(qū)動的移植方式,使其符合J2EE連接器架構(gòu)(JCA)規(guī)范。這為JDBC廠商提供了向JDBC連接器遷移的能力。在面向企業(yè)服務的架構(gòu)(SPA)中使用JDBC數(shù)據(jù)源,該移植方式很重要。在SOA中,JDBC數(shù)據(jù)源可被部署在另一個企業(yè)服務總線(ESB)架構(gòu)內(nèi),而不需要為JDBC數(shù)據(jù)源另寫一份ESB實現(xiàn)代碼。本文中,我們了解了RowId支持,JDBC驅(qū)動加載和基于標注的SQL等JDBC 4.0的增強特性。未來,JDBC 4.0還將增加更多特性以支持SQL:2003。請參閱特性文檔,以獲取更多有關JDBC 4.0特性的信息。ResourcesMatrix-與Java共舞Sample Application Code Srini Penchikala是Flagstar Bank的一位信息系統(tǒng)問題專家。 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd Java SE 6包含了對Java數(shù)據(jù)庫互連(JDBC)API的一些增強特性。這些增強特性的版本將定為JDBC version 4.0。JDBC新特性的目的是提供更簡單的設計和更好的開發(fā)體驗。本文將概述JDBC 4.0的增強特性和為企業(yè)級Java開發(fā)人員帶來的好處。我們將通過一個用Apache Derby作為后臺數(shù)據(jù)庫的貸款處理應用范例來探究JDBC的新特性。版權(quán)聲明:任何獲得Matrix授權(quán)的網(wǎng)站,轉(zhuǎn)載時請務必保留以下作者信息和鏈接作者:feichangcai;feichangcai
標簽: Java
相關文章:
主站蜘蛛池模板: 99久久99久久精品免费看子 | 国产日韩欧美综合一区二区三区 | 性做久久久久免费观看 | 精品中文字幕一区在线 | 欧美一级久久久久久久大片 | 成人亚洲综合 | 日韩在线一区二区 | 337p粉嫩日本亚洲大胆艺术照 | 欧美精品亚洲精品日韩一区 | 女人张开腿让男人桶个爽 | 成人做爰视频www在线观看 | 亚洲成年人免费网站 | 久久精品vr中文字幕 | 久久久欧美综合久久久久 | 成人18免费网站在线观看 | 成人性一级视频在线观看 | 深夜国产成人福利在线观看女同 | 国产精品黑丝 | rion美乳弹出来四虎在线观看 | 亚洲美女黄色片 | 老司机亚洲精品 | 久草视频在线免费 | 一区在线免费观看 | 久久精品国产亚洲网站 | 国产精品1区 | www.欧美成人 | 欧美精品一区二区在线观看播放 | 和老外3p爽粗大免费视频 | 日韩欧美中文字幕在线视频 | 成人免费视频一区 | 成人18网站| 免费一级毛片无毒不卡 | 久久国产精品国产精品 | 女人张开双腿让男人桶完整 | 人妖欧美一区二区三区四区 | 亚洲欧美日本国产综合在线 | 久久精品2 | 黄色片成年人 | ccyycom草草影院成人91 | 特级aa一级欧美毛片 | 精品国产香港三级 |