日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

jdbc pdf_JDBC教程– ULTIMATE指南(PDF下载)

發(fā)布時(shí)間:2023/12/3 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jdbc pdf_JDBC教程– ULTIMATE指南(PDF下载) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

jdbc pdf

在本文中,我們提供了全面的JDBC教程(Java數(shù)據(jù)庫(kù)連接性),這是Oracle提供的API,允許程序員處理Java應(yīng)用程序中的不同數(shù)據(jù)庫(kù):它允許開(kāi)發(fā)人員建立與數(shù)據(jù)庫(kù)的連接,定義特定客戶端如何訪問(wèn)給定的客戶端。數(shù)據(jù)庫(kù),提供了用于讀取,插入,更新和刪除數(shù)據(jù)庫(kù)中數(shù)據(jù)條目的機(jī)制,并負(fù)責(zé)處理由不同SQL語(yǔ)句組成的事務(wù)。

在本文中,我們將解釋主要的JDBC組件,例如語(yǔ)句,結(jié)果集或存儲(chǔ)過(guò)程。


JDBC需要程序員可能要使用的不同數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序。

我們將對(duì)此進(jìn)行詳細(xì)說(shuō)明,并提供一些示例。

JDBC從一開(kāi)始就與Java一起出現(xiàn)。 第一個(gè)發(fā)行版于1997年2月隨JDK 1.1一起發(fā)布,此后,JDBC一直是Java的重要組成部分。 包含JDBC的主要軟件包是http://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html和http://docs.oracle.com/javase/8/ docs / api / javax / sql / package-summary.html 。

有關(guān)最新的JDBC版本(4.2)及其開(kāi)發(fā)和維護(hù)的所有信息,可以在JSR 221中找到。

本文顯示的所有示例都是使用Java 8更新0_25和Eclipse SDK版本Luna 4.4實(shí)現(xiàn)的。 在本文末尾,您可以下載所有這些示例以及更多示例!

目錄

1.組成 2.連接 3.數(shù)據(jù)類型 4.驅(qū)動(dòng)程序 5.數(shù)據(jù)庫(kù) 6.結(jié)果集 7.存儲(chǔ)過(guò)程 8.陳述 9.批處理命令 10.交易 11. CRUD命令 12. Java 8 13.基于JDBC構(gòu)建的Sql庫(kù) 14.單元測(cè)試 15.總結(jié) 16.下載 17.鏈接

1.組成

JDBC API允許程序員和Java應(yīng)用程序與數(shù)據(jù)庫(kù)進(jìn)行交互。 它支持執(zhí)行不同SQL語(yǔ)句并處理來(lái)自不同數(shù)據(jù)源的結(jié)果。

在本節(jié)中,我們將嘗試總結(jié)并列出每個(gè)Java應(yīng)用程序中最重要的JDBC組件,所有這些組件將在下一章中進(jìn)行詳細(xì)說(shuō)明。

  • 首先,Java應(yīng)用程序需要?jiǎng)?chuàng)建和建立特定數(shù)據(jù)庫(kù)的連接。 使用驅(qū)動(dòng)程序管理器(例如,接口java.sql.DriverManager一個(gè)實(shí)例)或直接通過(guò)JDBC數(shù)據(jù)源完成此操作。 為此,可以使用接口javax.sql.DataSource 。 如前所述,我們將在下一章中更詳細(xì)地解釋這些組件。
  • 一旦與數(shù)據(jù)庫(kù)連接,就可以使用java.sql.Connection執(zhí)行CRUD(創(chuàng)建,讀取,更新,刪除)SQL語(yǔ)句或操作。 這些說(shuō)明將在本教程中進(jìn)行解釋。
  • 為了執(zhí)行這些操作,程序員可以使用基于java.sql.Statement和java.sql.PreparedStatement的類。 最后幾次在多次執(zhí)行同一條語(yǔ)句時(shí)效率更高,并提供了我們將在本教程中列出的其他好處。
    JDBC接口連接提供了創(chuàng)建語(yǔ)句實(shí)例的機(jī)制:
PreparedStatement countriesStatement = connection.prepareStatement("UPDATE COUNTRIES SET NAME = ? WHERE ID = ?"); countriesStatement.setString(1, "Spain"); countriesStatement.setInt(2, 123456789);
  • 諸如插入,更新或刪除之類的操作將返回修改后的行數(shù),而不會(huì)返回其他任何內(nèi)容:
// countriesStatement belongs to the class Statement, returning number of updated rows int n = countriesStatement.executeUpdate();
  • 選擇操作(查詢)以java.sql.ResultSet內(nèi)部的行java.sql.ResultSet返回結(jié)果。 按名稱或數(shù)字檢索行; 結(jié)果元數(shù)據(jù)也可用:
// countriesStatement belongs to the class Statement ResultSet rs = countriesStatement.executeQuery("SELECT NAME, POPULATION FROM COUNTRIES"); //rs contains the results in rows plus some metadata ...
  • 通常,JDBC使用連接池來(lái)管理連接。 連接池(例如C3P0或DBCP)有不同的實(shí)現(xiàn)。 這些是JDBC連接組,在需要時(shí)從應(yīng)用程序使用或借用它們,并在任務(wù)完成時(shí)釋放。 關(guān)于如何在JDBC中使用和配置連接池的文檔很多,可以在以下鏈接中找到很好的教程: http://docs.oracle.com/cd/E13222_01/wls/docs81/ConsoleHelp/jdbc_connection_pools.html 。
  • 使用JDBC時(shí),還可以使用其他功能:存儲(chǔ)過(guò)程,可調(diào)用語(yǔ)句,批處理……所有這些功能都將在本教程中進(jìn)行描述。

2.連接

為了連接到數(shù)據(jù)庫(kù),我們需要使用java.sql.Connection對(duì)象。 我們可以使用java.sql.DriverManager類的getConnection()方法來(lái)完成此操作。 此方法接收數(shù)據(jù)庫(kù)主機(jī)和憑據(jù)作為參數(shù)。

此代碼段顯示了如何為本地MySQL數(shù)據(jù)庫(kù)創(chuàng)建連接。

//MySQL driver is loaded Class.forName( "com.mysql.jdbc.Driver" ); //Connection object is created using the db host and credentials Connection connect = DriverManager.getConnection("jdbc:mysql://localhost/countries?"+ "user=root&password=root" );

連接對(duì)象允許程序員執(zhí)行以下操作:

  • JDBC語(yǔ)句的創(chuàng)建:可以使用連接對(duì)象來(lái)創(chuàng)建Statement , PreparedStatement或CallableStatement實(shí)例,這些實(shí)例提供執(zhí)行不同SQL語(yǔ)句的方法。 這是創(chuàng)建PreparedStatement的示例:
//the connection conn is used to create a prepared statement with the given sql operation PreparedStatement updateStmt = conn.prepareStatement( sql );

該語(yǔ)句可以執(zhí)行作為參數(shù)傳遞的sql更新。

  • 提供了提交或回滾給定事務(wù)的可能性。 JDBC連接支持兩種不同的工作方式: autocommit=true和autocommit=false 。 第一個(gè)將所有事務(wù)直接提交到數(shù)據(jù)庫(kù),第二個(gè)需要特殊的命令來(lái)提交或回滾事務(wù)。 我們將在本教程的相關(guān)章節(jié)中看到更多詳細(xì)信息。 以下代碼段顯示了如何更改JDBC連接的自動(dòng)提交模式:
//it changes the mode to auto commit=false connect.setAutoCommit( false );
  • 可能獲取有關(guān)已使用數(shù)據(jù)庫(kù)的元信息。
  • 其他選項(xiàng),例如批處理,存儲(chǔ)過(guò)程等。

我們將詳細(xì)解釋所有這些功能,目前最好知道什么是JDBC連接以及使用JDBC連接可以完成的操作。

3.數(shù)據(jù)類型

JDBC將Java數(shù)據(jù)類型轉(zhuǎn)換為適當(dāng)?shù)腏DBC類型,然后再在數(shù)據(jù)庫(kù)中使用它們。 Java和JDBC數(shù)據(jù)類型之間存在默認(rèn)映射,該映射提供了數(shù)據(jù)庫(kù)實(shí)現(xiàn)和驅(qū)動(dòng)程序之間的一致性。

下表包含這些映射:

SQL JDBC / Java 二傳手 吸氣劑
VARCHAR java.lang.String setString getString
焦炭 java.lang.String setString getString
LONGVARCHAR java.lang.String setString getString
比特 布爾值 setBoolean getBoolean
數(shù)字 大十進(jìn)制 setBigDecimal getBigDecimal
天音 字節(jié) setByte getByte
小靈通 setShort getShort
整數(shù) 整型 setInt getInt
比金特 長(zhǎng) setLong getLong
真實(shí) 浮動(dòng) setFloat getFloat
浮動(dòng) 浮動(dòng) setFloat getFloat
setDouble getDouble
VARBINARY 字節(jié)[] setBytes getBytes
二進(jìn)制 字節(jié)[] setBytes getBytes
日期 java.sql.Date 設(shè)置日期 getDate
時(shí)間 java.sql.Time 設(shè)置時(shí)間 getTime
時(shí)間戳 java.sql.Timestamp setTimestamp getTimestamp
CLOB java.sql.Clob setClob getClob
BLOB java.sql.Blob setBlob getBlob
陣列 java.sql.Array setARRAY getARRAY
參考 java.sql.Ref SetRef getRef
結(jié)構(gòu) java.sql.Struct SetStruct getStruct

在SQL和Java中,空值的處理方式有所不同。 在Java中使用SQL空值進(jìn)行處理時(shí),最好遵循一些最佳做法,例如避免使用基本類型,因?yàn)樗鼈儾荒転榭?#xff0c;但可以轉(zhuǎn)換為默認(rèn)值,例如int為0,布爾值為false等。

取而代之的是,建議對(duì)原始類型使用包裝器類。 ResultSet類包含一個(gè)名為wasNull()的方法,在這些情況下非常有用。 這是一個(gè)用法示例:

Statement stmt = conn.createStatement( ); String sql = "SELECT NAME, POPULATION FROM COUNTRIES"; ResultSet rs = stmt.executeQuery(sql);int id = rs.getInt(1); if( rs.wasNull( ) ) {id = 0; }

4.驅(qū)動(dòng)程序

JDBC驅(qū)動(dòng)程序管理器java.sql.DriverManager是JDBC API的最重要元素之一。 它是處理JDBC驅(qū)動(dòng)程序列表的基本服務(wù)。 它包含允許Java應(yīng)用程序連接到所需JDBC驅(qū)動(dòng)程序的機(jī)制和對(duì)象。 它負(fù)責(zé)管理不同類型的JDBC數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序。 總結(jié)驅(qū)動(dòng)程序管理器的主要任務(wù)是了解可用驅(qū)動(dòng)程序的列表,并處理特定選定驅(qū)動(dòng)程序和數(shù)據(jù)庫(kù)之間的連接。

此類中最常用的方法是DriverManager.getConnetion() 。 此方法建立與數(shù)據(jù)庫(kù)的連接。

這是一個(gè)用法示例:

// Create the connection with the default credentials java.sql.Connection conn = DriverManager.getConnection("jdbc:hsqldb:mem:mydb", "SA", "" );

我們可以使用DriverManager.registerDriver().方法注冊(cè)驅(qū)動(dòng)程序DriverManager.registerDriver(). :

new org.hsqldb.jdbc.JDBCDriver(); DriverManager.registerDriver( new org.hsqldb.jdbc.JDBCDriver() );

我們還可以通過(guò)調(diào)用Class.forName()方法來(lái)加載驅(qū)動(dòng)程序:

// Loading the HSQLDB JDBC driver Class.forName( "org.hsqldb.jdbc.JDBCDriver" );...// connection to JDBC using mysql driver Class.forName( "com.mysql.jdbc.Driver" );

主要區(qū)別在于方法registerDriver()需要驅(qū)動(dòng)程序在編譯時(shí)可用,加載驅(qū)動(dòng)程序類不需要驅(qū)動(dòng)程序在編譯時(shí)可用。 在JDBC 4之后,不需要真正調(diào)用這些方法,并且應(yīng)用程序不需要單獨(dú)注冊(cè)驅(qū)動(dòng)程序,也不需要加載驅(qū)動(dòng)程序類。 也建議不要使用registerDriver()方法手動(dòng)注冊(cè)驅(qū)動(dòng)程序。

DriverManager類的其他有趣方法是getDriver(String url) ,它嘗試通過(guò)給定的字符串查找驅(qū)動(dòng)程序,而getDrivers()返回先前已在Driver Manager中注冊(cè)的所有驅(qū)動(dòng)程序的枚舉:

Enumeration drivers = DriverManager.getDrivers(); while( drivers.hasMoreElements() ) {Driver driver = drivers.nextElement();System.out.println( driver.getClass() ); }

5.數(shù)據(jù)庫(kù)

JDBC支持大量數(shù)據(jù)庫(kù)。 它使用不同的驅(qū)動(dòng)程序來(lái)抽象其差異和工作方式。 DriverManager類負(fù)責(zé)加載正確的數(shù)據(jù)庫(kù),在加載正確的數(shù)據(jù)庫(kù)之后,用于訪問(wèn)數(shù)據(jù)庫(kù)以查詢和修改數(shù)據(jù)的代碼將保持(或多或少)不變。

這是JDBC(在Oracle中正式注冊(cè))受支持的數(shù)據(jù)庫(kù)的列表: http : //www.oracle.com/technetwork/java/index-136695.html 。

在本章中,我們將展示如何使用不同的數(shù)據(jù)庫(kù):MySQL和HSQLDB。 第一個(gè)是程序員眾所周知的且已被廣泛使用,第二個(gè)是HSQLDB,它是一個(gè)非常有用的測(cè)試數(shù)據(jù)庫(kù),具有內(nèi)存功能。 我們將看到如何同時(shí)使用這兩種方法,并且會(huì)發(fā)現(xiàn),除了加載適當(dāng)?shù)腏DBC驅(qū)動(dòng)程序之外,應(yīng)用程序的其余部分保持不變:

MySQL示例:

public static void main( String[] args ) throws ClassNotFoundException, SQLException{// connection to JDBC using mysql driverClass.forName( "com.mysql.jdbc.Driver" );Connection connect = DriverManager.getConnection("jdbc:mysql://localhost/countries?"+ "user=root&password=root" );selectAll( connect );// close resources, in case of exception resources are not properly cleared ...}/*** select statement and print out results in a JDBC result set* * @param conn* @throws SQLException*/private static void selectAll( java.sql.Connection conn ) throws SQLException{Statement statement = conn.createStatement();ResultSet resultSet = statement.executeQuery( "select * from COUNTRIES" );while( resultSet.next() ){String name = resultSet.getString( "NAME" );String population = resultSet.getString( "POPULATION" );System.out.println( "NAME: " + name );System.out.println( "POPULATION: " + population );}}

內(nèi)存中(HSQLDB)示例:

public static void main( String[] args ) throws ClassNotFoundException, SQLException{// Loading the HSQLDB JDBC driverClass.forName( "org.hsqldb.jdbc.JDBCDriver" );// Create the connection with the default credentialsjava.sql.Connection conn = DriverManager.getConnection( "jdbc:hsqldb:mem:mydb", "SA", "" );// Create a table in memoryString countriesTableSQL = "create memory table COUNTRIES (NAME varchar(256) not null primary key, POPULATION varchar(256) not null);";// execute the statement using JDBC normal StatementsStatement st = conn.createStatement();st.execute( countriesTableSQL );// nothing is in the database because it is just in memory, non persistentselectAll( conn );// after some insertions, the select shows something different, in the next execution these// entries will not be thereinsertRows( conn );selectAll( conn );}.../*** select statement and print out results in a JDBC result set* * @param conn* @throws SQLException*/private static void selectAll( java.sql.Connection conn ) throws SQLException{Statement statement = conn.createStatement();ResultSet resultSet = statement.executeQuery( "select * from COUNTRIES" );while( resultSet.next() ){String name = resultSet.getString( "NAME" );String population = resultSet.getString( "POPULATION" );System.out.println( "NAME: " + name );System.out.println( "POPULATION: " + population );}}

正如我們?cè)谧詈蟮某绦蛑锌吹降哪菢?#xff0c; selectAll方法的代碼完全相同,只是JDBC驅(qū)動(dòng)程序的加載和連接創(chuàng)建發(fā)生了變化。 您可以想象在不同環(huán)境下工作時(shí),它的功能多么強(qiáng)大。 HSQLDB版本的代碼還包含負(fù)責(zé)創(chuàng)建內(nèi)存數(shù)據(jù)庫(kù)并插入一些行的代碼,但這只是出于顯示和清晰目的,可以用不同的方式完成。

6.結(jié)果集

類java.sql.ResultSet表示數(shù)據(jù)庫(kù)表的結(jié)果集。 通常創(chuàng)建它; 通過(guò)執(zhí)行SQL查詢(使用Statement或PreparedStatement的select語(yǔ)句)。 它包含數(shù)據(jù)行,數(shù)據(jù)存儲(chǔ)在該行中。 這些數(shù)據(jù)可以通過(guò)索引(以1開(kāi)頭)或?qū)傩悦Q進(jìn)行訪問(wèn):

// creating the result setResultSet resultSet = statement.executeQuery( "select * from COUNTRIES" );// iterating through the results rowswhile( resultSet.next() ){// accessing column values by index or nameString name = resultSet.getString( "NAME" );int population = resultSet.getInt( "POPULATION" );System.out.println( "NAME: " + name );System.out.println( "POPULATION: " + population );// accessing column values by index or nameString name = resultSet.getString( 1 );int population = resultSet.getInt( 2 );System.out.println( "NAME: " + name );System.out.println( "POPULATION: " + population );}

如前所示,ResultSets包含用于獲取不同Java類型的列值的getter方法。 它還包含一個(gè)指向當(dāng)前數(shù)據(jù)行的光標(biāo)。 最初,光標(biāo)指向第一行之前。 next方法將光標(biāo)移動(dòng)到下一行: java.sql.ResultSet.next() 。

可以使用默認(rèn)屬性(例如僅向前移動(dòng)且不可更新的光標(biāo))創(chuàng)建ResultSets。 如果程序員想使用其他類型的屬性,則可以在創(chuàng)建Statement時(shí)指定,以便通過(guò)更改傳遞的參數(shù)來(lái)生成結(jié)果集:

/** * indicating result sets properties that will be created from this statement: type, * concunrrency and holdability */ Statement statement = conn.createStatement( ResultSet. TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE, ResultSet.CLOSE_CURSORS_AT_COMMIT );

使用這種結(jié)果集,可以在兩個(gè)方向上移動(dòng)光標(biāo),并為此目的使用結(jié)果集將新數(shù)據(jù)更新或插入數(shù)據(jù)庫(kù)中。

7.存儲(chǔ)過(guò)程

在本章中,我們將解釋什么是存儲(chǔ)過(guò)程以及如何在JDBC中使用它們。 對(duì)于示例,我們將使用基于MySQL的存儲(chǔ)過(guò)程。

存儲(chǔ)過(guò)程是SQL語(yǔ)句集,作為執(zhí)行邏輯單元的一部分并執(zhí)行定義的任務(wù)。 當(dāng)封裝一組要在數(shù)據(jù)庫(kù)上執(zhí)行的操作時(shí),它們非常有用。

首先,我們將在MySQL數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)過(guò)程,以下腳本將幫助我們完成此任務(wù):

delimiter //CREATE PROCEDURE spanish (OUT population_out INT)BEGINSELECT COUNT(*) INTO population_out FROM countries;END//delimiter ;CALL simpleproc(@a);

基本上,以上腳本創(chuàng)建了一個(gè)名為Spanish的過(guò)程,該過(guò)程具有一個(gè)類型為int且沒(méi)有輸入?yún)?shù)的輸出屬性。 該過(guò)程返回?cái)?shù)據(jù)庫(kù)中所有國(guó)家的計(jì)數(shù)。

一旦創(chuàng)建了過(guò)程,就可以從Java應(yīng)用程序中使用它。為了調(diào)用存儲(chǔ)過(guò)程,我們需要使用接口java.sql.CallableStatement特殊語(yǔ)句,這些語(yǔ)句允許程序員執(zhí)行存儲(chǔ)過(guò)程,以指示輸出屬性和要使用的輸入?yún)?shù)。 在我們的簡(jiǎn)單示例中,僅配置了輸出屬性。 這是一個(gè)例子:

CallableStatement callableStatement = null;// the procedure should be created in the databaseString spanishProcedure = "{call spanish(?)}";// callable statement is usedcallableStatement = connect.prepareCall( spanishProcedure );// out parameters, also in parameters are possible, not in this casecallableStatement.registerOutParameter( 1, java.sql.Types.VARCHAR );// execute using the callable statement method executeUpdatecallableStatement.executeUpdate();// attributes are retrieved by indexString total = callableStatement.getString( 1 );System.out.println( "amount of spanish countries " + total );

我們可以理解如何使用java.sql.PreparedStatement.executeUpdate()方法指示如何將過(guò)程的輸出存儲(chǔ)在何處以及如何執(zhí)行該過(guò)程。 大多數(shù)數(shù)據(jù)庫(kù)都支持存儲(chǔ)過(guò)程,但是它們的語(yǔ)法和行為可能有所不同,因此,根據(jù)存儲(chǔ)過(guò)程的數(shù)據(jù)庫(kù),處理存儲(chǔ)過(guò)程的Java應(yīng)用程序可能會(huì)有所不同。

8.陳述

如本教程中已經(jīng)提到的,JDBC使用接口java.sql.Statement來(lái)執(zhí)行不同SQL查詢和操作,例如插入,更新或刪除。 這是基本接口,包含所有基本方法,例如java.sql.Statement.executeQuery(String)或java.sql.Statement.executeUpdate(String) 。

當(dāng)程序員不需要多次執(zhí)行相同的查詢或不需要對(duì)查詢和語(yǔ)句進(jìn)行參數(shù)化時(shí),建議使用此接口的實(shí)現(xiàn)。 通常,我們可以說(shuō)此接口適合于執(zhí)行DDL語(yǔ)句(創(chuàng)建,更改,刪除)。 這些語(yǔ)句通常不會(huì)多次執(zhí)行,并且不需要支持不同的參數(shù)。

如果程序員在重復(fù)SQL查詢或參數(shù)化時(shí)需要更高的效率,則應(yīng)使用java.sql.PreparedStatement 。 該接口繼承了前面提到的基本語(yǔ)句接口,并提供了參數(shù)設(shè)置。 由于此功能,此接口可更安全地防止SQL注入攻擊。 這是一段代碼,顯示了此接口的示例:

System.out.println( "Updating rows for " + name + "..." );String sql = "UPDATE COUNTRIES SET POPULATION=? WHERE NAME=?";PreparedStatement updateStmt = conn.prepareStatement( sql );// Bind values into the parameters. updateStmt.setInt( 1, 10000000 ); // population updateStmt.setString( 2, name ); // name// update prepared statement using executeUpdate int numberRows = updateStmt.executeUpdate();System.out.println( numberRows + " rows updated..." );

使用準(zhǔn)備好的語(yǔ)句的另一個(gè)好處是可以通過(guò)使用setObject()方法來(lái)處理非標(biāo)準(zhǔn)對(duì)象。 這是一個(gè)例子:

PreparedStatement updateStmt2 = conn.prepareStatement( sql );// Bind values into the parameters using setObject, can be used for any kind and type of// parameter.updateStmt2.setObject( 1, 10000000 ); // populationupdateStmt2.setObject( 2, name ); // name// update prepared statement using executeUpdatenumberRows = updateStmt2.executeUpdate();System.out.println( numberRows + " rows updated..." );updateStmt2.close();

就像在與存儲(chǔ)過(guò)程有關(guān)的章節(jié)中提到的那樣,為此目的可以使用另一個(gè)接口,它稱為java.sql.CallableStatement并擴(kuò)展了PreparedStatement。

9.批處理命令

JDBC提供了批量執(zhí)行SQL語(yǔ)句列表的可能性,也就是說(shuō),可以全部執(zhí)行。 程序員使用代碼的方式取決于語(yǔ)句的類型,但總體思路是相同的。 在下一個(gè)代碼片段中,顯示了如何對(duì)java.sql.Statement使用批處理:

Statement statement = null;statement = connect.createStatement();// adding batchs to the statement statement.addBatch( "update COUNTRIES set POPULATION=9000000 where NAME='USA'" ); statement.addBatch( "update COUNTRIES set POPULATION=9000000 where NAME='GERMANY'" ); statement.addBatch( "update COUNTRIES set POPULATION=9000000 where NAME='ARGENTINA'" );// usage of the executeBatch method int[] recordsUpdated = statement.executeBatch();int total = 0; for( int recordUpdated : recordsUpdated ) {total += recordUpdated; }System.out.println( "total records updated by batch " + total );

并使用java.sql.PreparedStatement :

String sql = "update COUNTRIES set POPULATION=? where NAME=?";PreparedStatement preparedStatement = null;preparedStatement = connect.prepareStatement( sql );preparedStatement.setObject( 1, 1000000 );preparedStatement.setObject( 2, "SPAIN" );// adding batchespreparedStatement.addBatch();preparedStatement.setObject( 1, 1000000 );preparedStatement.setObject( 2, "USA" );// adding batchespreparedStatement.addBatch();// executing all batchsint[] updatedRecords = preparedStatement.executeBatch();int total = 0;for( int recordUpdated : updatedRecords ){total += recordUpdated;}System.out.println( "total records updated by batch " + total );

我們可以看到,這些區(qū)別基本上是使用SQL查詢參數(shù)的方式以及如何構(gòu)建查詢的,但是在一行上執(zhí)行多個(gè)語(yǔ)句的想法是相同的。 在第一種情況下,使用方法java.sql.Statement.executeBatch() ,在第二種情況下使用java.sql.PreparedStatement.addBatch()和java.sql.Statement.executeBatch() 。

10.交易

JDBC支持事務(wù),并包含實(shí)現(xiàn)基于事務(wù)的應(yīng)用程序的方法和功能。 我們將在本章中列出最重要的那些。

  • java.sql.Connection.setAutoCommit(boolean) :此方法接收布爾值作為參數(shù),如果為true(這是默認(rèn)行為),則所有SQL語(yǔ)句將自動(dòng)保存在數(shù)據(jù)庫(kù)中。 如果為false,將不會(huì)自動(dòng)保留更改,這將通過(guò)使用java.sql.Connection.commit()方法來(lái)完成。
  • java.sql.Connection.commit() 。 僅當(dāng)自動(dòng)提交設(shè)置為false或禁用時(shí),才可以使用此方法。 也就是說(shuō),它僅適用于非自動(dòng)提交模式。 執(zhí)行此方法時(shí),自上次提交/回滾以來(lái)的所有更改都將保留在數(shù)據(jù)庫(kù)中。
  • java.sql.Connection.rollback() 。 僅當(dāng)禁用自動(dòng)提交時(shí),才可以使用此方法。 它撤消或還原當(dāng)前事務(wù)中完成的所有更改。

這是一個(gè)用法示例,在此示例中,我們可以看到如何使用setAutoCommit(false)方法禁用自動(dòng)提交模式。 調(diào)用commit()時(shí),所有更改都將commit()并且使用rollback()方法將當(dāng)前事務(wù)更改rollback() :

Class.forName( "com.mysql.jdbc.Driver" ); Connection connect = null; try {// connection to JDBC using mysql driverconnect = DriverManager.getConnection( "jdbc:mysql://localhost/countries?"+ "user=root&password=root" );connect.setAutoCommit( false );System.out.println( "Inserting row for Japan..." );String sql = "INSERT INTO COUNTRIES (NAME,POPULATION) VALUES ('JAPAN', '45000000')";PreparedStatement insertStmt = connect.prepareStatement( sql );// insert statement using executeUpdateinsertStmt.executeUpdate( sql );connect.rollback();System.out.println( "Updating row for Japan..." );// update statement using executeUpdate -> will cause an error, update will not be// executed becaues the row does not existsql = "UPDATE COUNTRIES SET POPULATION='1000000' WHERE NAME='JAPAN'";PreparedStatement updateStmt = connect.prepareStatement( sql );updateStmt.executeUpdate( sql );connect.commit();} catch( SQLException ex ) {ex.printStackTrace();//undoes all changes in current transactionconnect.rollback(); } finally {connect.close(); }

11. CRUD命令

CRUD來(lái)自創(chuàng)建,讀取,更新和刪除。 JDBC支持所有這些操作和命令,在本章中,我們將展示執(zhí)行所有這些操作的Java代碼的不同片段:

創(chuàng)建語(yǔ)句。 可以使用JDBC創(chuàng)建數(shù)據(jù)庫(kù),這是創(chuàng)建內(nèi)存數(shù)據(jù)庫(kù)的示例:

// Create a table in memory String countriesTableSQL = "create memory table COUNTRIES (NAME varchar(256) not null primary key, POPULATION varchar(256) not null);";// execute the statement using JDBC normal Statements Statement st = conn.createStatement(); st.execute( countriesTableSQL );

插入語(yǔ)句。 JDBC支持插入。 程序員可以使用普通SQL語(yǔ)法,并將它們傳遞給JDBC提供的不同的語(yǔ)句類,例如Statement , PreparedStatement或CallableStatement 。 以下是幾個(gè)示例:

Statement insertStmt = conn.createStatement();String sql = "INSERT INTO COUNTRIES (NAME,POPULATION) VALUES ('SPAIN', '45Mill')"; insertStmt.executeUpdate( sql );sql = "INSERT INTO COUNTRIES (NAME,POPULATION) VALUES ('USA', '200Mill')"; insertStmt.executeUpdate( sql );sql = "INSERT INTO COUNTRIES (NAME,POPULATION) VALUES ('GERMANY', '90Mill')"; insertStmt.executeUpdate( sql );

這些語(yǔ)句返回插入的行數(shù)。 這同樣適用于update語(yǔ)句,這是如何更新數(shù)據(jù)庫(kù)中的一組行的示例:

System.out.println( "Updating rows for " + name + "..." );Statement updateStmt = conn.createStatement();// update statement using executeUpdateString sql = "UPDATE COUNTRIES SET POPULATION='10000000' WHERE NAME='" + name + "'";int numberRows = updateStmt.executeUpdate( sql );System.out.println( numberRows + " rows updated..." );

輸出為:

Updating rows for SPAIN... 4 rows updated...

選擇對(duì)帳單。 可以使用JDBC語(yǔ)句執(zhí)行任何(幾乎)種類SQL查詢。 這是一個(gè)非常簡(jiǎn)單的示例,該示例讀取給定表的所有行并在標(biāo)準(zhǔn)控制臺(tái)中將它們打印出來(lái):

Statement statement = conn.createStatement();ResultSet resultSet = statement.executeQuery( "select * from COUNTRIES" );while( resultSet.next() ) {String name = resultSet.getString( "NAME" );String population = resultSet.getString( "POPULATION" );System.out.println( "NAME: " + name );System.out.println( "POPULATION: " + population ); }

其輸出為(取決于數(shù)據(jù)庫(kù)狀態(tài)):

NAME: GERMANY POPULATION: 90Mill NAME: SPAIN POPULATION: 45Mill NAME: USA POPULATION: 200Mill

刪除語(yǔ)句。 最后,JDBC支持刪除行以及刪除表和其他SQL元素。 這是一個(gè)片段,顯示刪除具有特定條件的所有行(在這種情況下,名稱必須為“ JAPAN”):

System.out.println( "Deleting rows for JAPAN..." ); String sql = "DELETE FROM COUNTRIES WHERE NAME='JAPAN'"; PreparedStatement deleteStmt = connect.prepareStatement( sql );// delete statement using executeUpdate int numberRows = deleteStmt.executeUpdate( sql );System.out.println( numberRows + " rows deleted..." );

Delete語(yǔ)句返回受影響的行數(shù),在這種情況下,輸出將是(取決于數(shù)據(jù)庫(kù)狀態(tài)):

Deleting rows for JAPAN... 0 rows deleted...

這些例子都是非常簡(jiǎn)單的例子。 它們是出于學(xué)習(xí)目的而編寫的,但是您可以想象,只需更改傳遞給executeQuery()或executeUpdate()方法的參數(shù),就可以執(zhí)行更復(fù)雜SQL查詢。

12. Java 8

Java 8不包含與JDBC或JDBC框架相關(guān)的任何重大更改。 但是,在使用JDBC時(shí),可以應(yīng)用Java 8的多種功能,效果非常好。 我們將展示其中的一些。 例如,有可能以與過(guò)去非常不同的方式執(zhí)行選擇查詢。 這是一個(gè)沒(méi)有Java 8功能的情況下的示例,它與本文中所有示例中的操作大致相同:

// we always need to write this code System.out.println( "using Java 7" ); // connection to JDBC using mysql driver Class.forName( "com.mysql.jdbc.Driver" ); Connection connect = DriverManager.getConnection( "jdbc:mysql://localhost/countries?"+ "user=root&password=root" );// select query PreparedStatement statement = connect.prepareStatement( "select * from COUNTRIES" ); ResultSet resultSet = statement.executeQuery();// iterating results while( resultSet.next() ) {// access via nameObject name = resultSet.getObject( 1 );Object population = resultSet.getObject( 2 );System.out.println( "Name: " + name );System.out.println( "Population: " + population ); }// close resources, in case of exception resources are not properly cleared resultSet.close(); statement.close(); connect.close();

這是一個(gè)使用Lambdas的相同版本。

// select method is called and lambda expression is provided, this expression will be used // in the handle method of the functional interface select( connect, "select * from COUNTRIES", ( resultSet ) -> {System.out.println( resultSet.getObject( 1 ) );System.out.println( resultSet.getObject( 2 ) ); } );

上面顯示的這段代碼包含一個(gè)select方法調(diào)用,其中第一個(gè)參數(shù)是Connection對(duì)象,第二個(gè)參數(shù)是SQL查詢,第三個(gè)參數(shù)是Lambda表達(dá)式。 該Lambda表達(dá)式接收一個(gè)參數(shù)( ResultSet實(shí)例)并打印出其前兩個(gè)屬性,但是使用Lambda表達(dá)式主體中的該結(jié)果集可以完成任何操作。 這是select()方法的實(shí)現(xiàn):

public static void select( Connection connect, String sql, ResultSetHandler handler ) throws SQLException{PreparedStatement statement = connect.prepareStatement( sql );try (ResultSet rs = statement.executeQuery()){while( rs.next() ){handler.handle( rs );}}}

和功能接口ResultSetHandler :

@FunctionalInterface public interface ResultSetHandler {/*** This method will be executed by the lambda expression* * @param resultSet* @throws SQLException*/public void handle( ResultSet resultSet ) throws SQLException;}

我們?cè)谶@里可以看到,使用某些Java 8新功能時(shí),代碼更加清晰,而且大大減少了(或沒(méi)有減少)。

13.基于JDBC構(gòu)建的Sql庫(kù)

幾個(gè)著名的Java庫(kù)使用JDBC來(lái)構(gòu)建它們的API。 在本節(jié)中,我們將列出其中一些:

  • HSQLDB(超級(jí)SQL數(shù)據(jù)庫(kù))是一種關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),可提供內(nèi)存和持久性存儲(chǔ)。 它具有JDBC驅(qū)動(dòng)程序(如某些示例所示)。 它具有非持久性功能,并且?guī)缀踔С炙蠸QL核心功能,因此對(duì)于測(cè)試目的非常有用。 有關(guān)更多信息,請(qǐng)?jiān)L問(wèn)http://hsqldb.org/
  • DBUnit是JUnit的擴(kuò)展。 當(dāng)涉及數(shù)據(jù)庫(kù)時(shí),它對(duì)于單元測(cè)試非常有用。 該框架負(fù)責(zé)測(cè)試之間的數(shù)據(jù)庫(kù)狀態(tài),并在測(cè)試時(shí)抽象出幾個(gè)數(shù)據(jù)庫(kù)屬性。 要下載源代碼和更多文檔,請(qǐng)?jiān)L問(wèn)http://www.dbunit.org
  • DBUtils是一個(gè)Apache Commons庫(kù),旨在簡(jiǎn)化JDBC的使用。 該庫(kù)包含的一些功能包括:清理資源,減少代碼量,更輕松和自動(dòng)填充結(jié)果集。 該庫(kù)小巧,透明且快速,應(yīng)由希望直接使用JDBC的開(kāi)發(fā)人員使用。 使用此庫(kù)需要Java 1.6或更高版本。 有關(guān)更多文檔,請(qǐng)?jiān)L問(wèn)http://commons.apache.org/proper/commons-dbutils/
  • Spring Data還包含與JDBC相關(guān)的模塊。 它被稱為Spring Data JDBC Extensions。 它提供了對(duì)JDBC最常用功能的支持。 它提供了用于處理Oracle數(shù)據(jù)庫(kù)的特殊功能。 如果您想了解有關(guān)此庫(kù)的更多信息,請(qǐng)?jiān)L問(wèn)http://projects.spring.io/spring-data-jdbc-ext/
  • JOOQ是使用JDBC的公司數(shù)據(jù)倉(cāng)庫(kù)中非常有趣的框架。 它從SQL數(shù)據(jù)庫(kù)生成Java代碼,并提供API以建立JDBC連接,查詢數(shù)據(jù)并以簡(jiǎn)單的方式處理結(jié)果。 有關(guān)更多信息,請(qǐng)?jiān)L問(wèn)其git hub帳戶: https : //github.com/jOOQ/jOOL 。

14.單元測(cè)試

當(dāng)涉及到單元測(cè)試和數(shù)據(jù)庫(kù)時(shí),總是存在幾個(gè)問(wèn)題:

  • 我們使用什么環(huán)境進(jìn)行測(cè)試?
  • 我們是否用真實(shí)數(shù)據(jù)進(jìn)行測(cè)試?
  • 還是我們使用合成的生成數(shù)據(jù)?
  • 如果沒(méi)有適當(dāng)?shù)膽{據(jù),我們?nèi)绾螠y(cè)試數(shù)據(jù)庫(kù)?

幾個(gè)庫(kù)可以幫助我們完成這些任務(wù)。 在本章中,我們將列出其中一些并提供一些有用的鏈接,在這些鏈接中可以找到更多信息:

  • DBUnit:如前所述,DBUnit是一個(gè)與Junit協(xié)作的測(cè)試框架。 有關(guān)更多信息,請(qǐng)?jiān)L問(wèn)http://dbunit.org
  • TestNG:此測(cè)試框架涵蓋許多測(cè)試場(chǎng)景,例如單元測(cè)試,功能測(cè)試,集成測(cè)試等。它基于注釋。 有關(guān)此框架的更多信息,請(qǐng)?jiān)L問(wèn)其網(wǎng)站: http : //testng.org/doc/index.html
  • JOOQ。 該框架提供了JDBC模擬和測(cè)試功能。 它是非常有據(jù)可查的,易于使用。 有關(guān)更多信息,請(qǐng)?jiān)L問(wèn)http://jooq.org

15.總結(jié)

JDBC(Java數(shù)據(jù)庫(kù)連接性)是用于Java與大量數(shù)據(jù)庫(kù)和數(shù)據(jù)源(從基于SQL的數(shù)據(jù)庫(kù)到Excel電子表格)之間的數(shù)據(jù)庫(kù)連接性的標(biāo)準(zhǔn)API。 在本教程中,我們?cè)噲D解釋JDBC體系結(jié)構(gòu)以及如何使用它。 我們列出了JDBC使用的主要組件,并且列出了一些用于廣泛使用的數(shù)據(jù)庫(kù)(例如MySql)的驅(qū)動(dòng)程序。

要記住的最重要的幾點(diǎn)是:

  • 驅(qū)動(dòng)程序是使Java應(yīng)用程序能夠與數(shù)據(jù)庫(kù)一起使用的組件。 JDBC需要每個(gè)特定數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序。 可以在http://www.oracle.com/technetwork/java/index-136695.html上找到JDBC可用驅(qū)動(dòng)程序的列表。
  • 每次都將SQL語(yǔ)句直接發(fā)送到數(shù)據(jù)庫(kù)服務(wù)器。 JDBC包含一種稱為PreparedStatement的機(jī)制,該機(jī)制具有預(yù)定的執(zhí)行路徑,該機(jī)制可提高效率并更好地利用資源。
  • 結(jié)果集是用于查詢中的行的表示形式。
  • 存儲(chǔ)過(guò)程是組合在一起的一組SQL語(yǔ)句,可以按名稱調(diào)用它們,而無(wú)需分別調(diào)用它們。
  • 事務(wù)是一組SQL語(yǔ)句。 當(dāng)調(diào)用commit()或rollback()時(shí),事務(wù)結(jié)束。 這種分組允許不同的并行工作。
  • CRUD命令是create , read , update和delete命令。 JDBC提供了執(zhí)行這些命令的機(jī)制。

本教程包含一些與Java 8有關(guān)的與JDBC有關(guān)的新可能性的信息,例如JOOQ。 我們還提到了一些使用JDBC實(shí)現(xiàn)的重要庫(kù),例如Spring-Data或Apache DBUtils。

16.下載JDBC教程源代碼

下載
您可以在此處下載本教程的完整源代碼: jdbc_ultimate_tutorial 。

17.鏈接

除了本文所指向的所有鏈接和資源之外,如果您想了解有關(guān)JDBC API及其功能和機(jī)制的更多信息,可以在Oracle官方網(wǎng)站上找到最新的最佳信息源:

  • http://docs.oracle.com/javase/8/docs/api/javax/sql/package-summary.html
  • http://docs.oracle.com/javase/8/docs/api/javax/sql/package-summary.html

翻譯自: https://www.javacodegeeks.com/2015/02/jdbc-tutorial.html

jdbc pdf

總結(jié)

以上是生活随笔為你收集整理的jdbc pdf_JDBC教程– ULTIMATE指南(PDF下载)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

亚洲视频 一区 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 毛片基地黄久久久久久天堂 | 中文字幕精品一区二区三区电影 | 成人免费视频观看 | 在线成人免费 | 久久av免费电影 | 日韩电影一区二区三区在线观看 | 欧美一级片免费在线观看 | 69国产精品成人在线播放 | 国产精品18p | 久久免费视频4 | 日韩欧美高清一区二区三区 | 久久手机视频 | 又黄又刺激的视频 | 国产综合香蕉五月婷在线 | 精品免费 | 97人人澡人人添人人爽超碰 | 精品一区二区三区久久久 | 99免费在线视频观看 | 一区二区中文字幕在线播放 | 婷婷视频在线播放 | 久久高清| 色插综合| 久久亚洲欧美日韩精品专区 | 色狠狠综合 | a黄色一级片| 日韩网站免费观看 | 色狠狠一区二区 | 久久视讯 | 最近中文字幕高清字幕免费mv | 日日摸日日爽 | 中文字幕日韩国产 | 久久久久久久综合色一本 | 在线播放国产一区二区三区 | 精品久久久一区二区 | 狠狠插狠狠操 | 欧美午夜精品久久久久 | 日本一区二区高清不卡 | 操操操综合 | 国产精品男女视频 | 精品国产1区二区 | 成人av在线直播 | 久久久久久久久久国产精品 | 国产区免费在线 | 999视频在线观看 | 免费久久片 | 2023天天干 | 日韩av成人在线观看 | 久久久性 | 黄色91在线| 久久精品亚洲一区二区三区观看模式 | 96av视频 | www.久草.com | 99热精品免费观看 | 在线观看黄色国产 | 欧美色噜噜噜 | 日韩在线高清免费视频 | 日本中文字幕网址 | av天天澡天天爽天天av | 99爱在线 | 久艹视频在线免费观看 | 射射射综合网 | 日韩在线首页 | 亚洲人人精品 | 国产精品第10页 | 狠狠操综合网 | 欧美视频国产视频 | 精品国产中文字幕 | 一区三区视频在线观看 | 在线免费色视频 | 麻豆视频在线免费观看 | 亚洲国产mv | 婷婷六月天丁香 | 91成品人影院 | 97色狠狠| 亚洲综合色视频在线观看 | 爱情影院aqdy鲁丝片二区 | 一级黄色免费 | 97精品在线 | 91午夜精品 | 久久五月婷婷丁香 | 久久99国产一区二区三区 | 欧美激情第八页 | 丁香国产视频 | 中文字幕日韩av | 欧美 日韩 成人 | 欧美ⅹxxxxxx| 精品在线观看视频 | 国产群p视频 | 国产成人av电影在线观看 | 超碰在线9| 日日干日日 | 中文字幕第一 | 亚洲一区欧美激情 | 免费在线国产精品 | 狠狠干 狠狠操 | 欧美日韩免费一区二区 | 深爱激情av | 天天操天天草 | 国产xx视频| 免费看的国产视频网站 | 999久久精品 | 中文字幕免费高清在线观看 | 一区二区三区在线观看 | www.com.日本一级 | 久久免费视频3 | 国产精品毛片一区二区 | 99在线观看| 激情综合色播五月 | 久艹视频免费观看 | 日韩国产欧美在线视频 | 久久极品| 91av视频观看| 97超碰人人澡人人爱 | 久热色超碰 | 中文十次啦 | 久久人人爽爽人人爽人人片av | 久久免费视频国产 | 色欲综合视频天天天 | 国产精品成人自产拍在线观看 | 久久日本视频 | 激情视频在线高清看 | 国产亚洲精品久久 | 日本69hd| 99久久爱 | 久草| 在线观看日本高清mv视频 | 国产成人一区二区三区久久精品 | 午夜精品福利一区二区三区蜜桃 | 91视频91蝌蚪 | 在线播放国产一区二区三区 | 精品九九久久 | 在线视频第一页 | 一区二区三区四区五区在线 | 色狠狠综合天天综合综合 | 91av在线播放视频 | 精品视频在线免费观看 | 国产日韩精品久久 | 久久视频在线观看免费 | 综合色狠狠 | 久久久久国产a免费观看rela | 午夜婷婷在线播放 | 天天插日日射 | 在线观看岛国 | av电影免费在线看 | 国产成人亚洲精品自产在线 | 在线观看中文字幕一区二区 | 精品久久久网 | 色婷婷狠狠| 久久精品国产免费观看 | 在线观看91视频 | 国产成人精品国内自产拍免费看 | 欧美日韩aaaa| av黄色国产| 国产美女精品久久久 | 国产久草在线观看 | 国产免费一区二区三区网站免费 | 国产91在线观看 | 中文字幕在线播放第一页 | 天天干人人| av成人免费在线 | 日韩视频中文字幕在线观看 | 精品一二三区视频 | av不卡免费看 | 国产五月天婷婷 | 中文字幕亚洲综合久久五月天色无吗'' | 在线v片免费观看视频 | 99久久久免费视频 | 欧美激情视频在线观看免费 | 日狠狠| 五月天激情综合 | 特及黄色片 | 伊人狠狠色丁香婷婷综合 | 久久国产影院 | 永久免费毛片 | 国产精品国产三级国产专区53 | 国产五十路毛片 | 高清免费在线视频 | 成人精品久久久 | 国产九九热 | 国产精品久久毛片 | 欧美精品一区在线发布 | 国产成人黄色av | 国产精品一区二区吃奶在线观看 | 夜夜操夜夜干 | 国产精品亚洲视频 | 免费看成人av | 国产又粗又猛又黄又爽 | 国产在线观看你懂得 | 天天亚洲| 亚洲日韩欧美一区二区在线 | 亚洲成人免费观看 | 亚洲欧美日韩精品久久奇米一区 | 亚洲 欧洲 国产 精品 | 久久艹精品| 9999亚洲| 91av社区| 久久精品中文字幕少妇 | 亚洲精品一区二区在线观看 | 午夜精品久久久久久久爽 | 亚洲 综合 国产 精品 | 成人av网站在线播放 | www.天天综合| 午夜在线观看影院 | 久久精品在线免费观看 | 97视频资源 | 成人av电影在线播放 | 久久99国产精品久久99 | 久草在| 国产91精品高清一区二区三区 | 免费观看黄 | 涩av在线| 一区二区观看 | 国产亚洲精品免费 | 中文在线a√在线 | 久久伊人免费视频 | 国产精品原创在线 | 99热9 | 在线精品亚洲 | 亚洲视频综合在线 | 91爱爱视频 | 五月天久久狠狠 | 久青草视频 | 黄色网址a | 亚洲2019精品 | 在线看国产 | 久久蜜桃av | 久久深夜福利免费观看 | 国产成人久久精品 | 国产精品99免视看9 国产精品毛片一区视频 | 免费av小说 | 最新av免费在线观看 | 99久久久久免费精品国产 | 超碰免费公开 | 9999毛片| 六月激情久久 | 久久免费在线观看视频 | 又色又爽又黄 | 天天综合91 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 精品久久电影 | 欧美性生活免费看 | 亚洲精品国产第一综合99久久 | 免费久久网 | 狠狠躁日日躁狂躁夜夜躁 | 国产精品高清免费在线观看 | 99久久婷婷国产综合精品 | 91自拍视频在线观看 | 热久久影视 | 国产99久久久国产 | 中文字幕久久精品 | 99精品黄色片免费大全 | 中文字幕在线视频精品 | 国产v视频 | 国产 一区二区三区 在线 | 人人爽人人做 | 在线看v片成人 | 亚洲精品高清一区二区三区四区 | 一区二区三区四区五区在线 | 99re亚洲国产精品 | www.夜夜操| 在线视频观看国产 | 亚洲精品国产成人av在线 | 免费成人在线网站 | 国产免费资源 | 99热只有精品在线观看 | 国产99免费 | 成人av午夜| 欧美有色| 99精彩视频在线观看免费 | 欧美国产三区 | 欧美日韩精品在线免费观看 | 亚洲综合精品在线 | 人人插人人舔 | 日韩夜夜爽 | 精品久久亚洲 | 国产精品永久免费视频 | 在线观看av片 | 91大神精品视频在线观看 | 国产一级在线播放 | 五月天亚洲激情 | 91污污视频在线观看 | 美女久久网站 | 久草在| 成人毛片网| 中文字幕在线视频一区二区 | 在线观看涩涩 | 四虎免费在线观看视频 | 在线天堂中文在线资源网 | 国产最新91 | 久久亚洲私人国产精品va | 亚洲国产精品视频 | 国产在线无 | 国产在线自 | 天天做天天看 | 国产精品 9999 | 久久综合影音 | 亚洲 精品在线视频 | 久久综合中文字幕 | 美女黄视频免费看 | 婷婷丁香色综合狠狠色 | 国产高清中文字幕 | www.久艹| 免费国产亚洲视频 | 色在线视频| 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 黄色毛片在线看 | 日韩亚洲国产中文字幕 | 日韩视频免费 | 精品一区二区在线免费观看 | 午夜成人免费电影 | 久久男人免费视频 | 三级av网 | 日日摸日日 | 在线免费观看麻豆 | 亚洲片在线 | 国产精品久久久久久久毛片 | 99久热在线精品视频 | 天天做日日做天天爽视频免费 | 91禁在线看| 日韩免费大片 | 精品一区 在线 | 国模视频一区二区三区 | 欧美激情视频久久 | 在线国产中文字幕 | 久久免费视频播放 | 国产精品美女久久久久久 | 99这里只有久久精品视频 | 激情欧美一区二区免费视频 | 色综合色综合久久综合频道88 | 日韩丝袜在线观看 | 97精品国产手机 | 欧美色精品天天在线观看视频 | 国产一级视频在线免费观看 | 天天色天天艹 | 中文在线字幕免 | 成人av教育 | 久久久久久久久久免费视频 | 免费看黄色小说的网站 | 五月婷婷六月丁香激情 | 欧美日本在线视频 | 欧洲一区二区在线观看 | 国产精品刺激对白麻豆99 | 玖玖玖精品 | 久久99欧美 | 日韩在线观看小视频 | 成人av资源网 | 欧洲在线免费视频 | 三上悠亚在线免费 | 四虎永久免费网站 | 免费看的国产视频网站 | 丝袜美腿在线 | www黄色大片 | 中文字幕在线免费播放 | 亚洲欧美婷婷六月色综合 | 久久午夜色播影院免费高清 | 亚洲一区精品二人人爽久久 | 精品久久1| 免费碰碰 | 国产一区在线视频播放 | 日韩videos高潮hd | 亚洲在线视频观看 | 91在线视频观看免费 | 国产视频高清 | 91综合久久一区二区 | 国产一区不卡在线 | 在线免费亚洲 | 91桃色视频 | 国产精品综合久久久久 | 欧美男女爱爱视频 | 国内精品久久久久 | 亚洲视频网站在线观看 | 一区二区三区免费在线观看视频 | 中文字幕在线视频第一页 | 久久伊人婷婷 | 国产在线一区观看 | 久久午夜国产精品 | 久久九九免费视频 | 在线观看黄污 | 日韩a在线 | 久久久国产一区二区三区四区小说 | 永久免费的啪啪网站免费观看浪潮 | 免费观看国产精品视频 | 国产日韩欧美中文 | 最近中文字幕大全中文字幕免费 | 日韩在线高清免费视频 | 中文字幕欧美日韩va免费视频 | 成人小视频在线观看免费 | 黄色一级在线观看 | 免费精品在线 | 九九在线国产视频 | 天天色天天色天天色 | 欧美大片第1页 | 天天操天天摸天天射 | 欧美性爽爽 | 色av男人的天堂免费在线 | av在线免费网站 | 最新日韩视频在线观看 | 免费av观看网站 | 狠狠操狠狠干2017 | 欧美 亚洲 另类 激情 另类 | 天天爽综合网 | 天天操狠狠操网站 | 日韩精品中文字幕有码 | 国产日产精品一区二区三区四区的观看方式 | 99r在线视频| 国产在线v| 伊人手机在线 | 国产精品24小时在线观看 | 国产一级免费观看视频 | 午夜视频一区二区 | 国产精品99久久久久久久久久久久 | 91在线资源| 国产精品亚洲片在线播放 | 黄污视频网站大全 | 中文字幕制服丝袜av久久 | 激情综合网五月 | 91精品在线免费观看视频 | 久久免费电影网 | 日日夜夜天天 | 国产成人在线免费观看 | 婷婷伊人综合 | 免费一级特黄毛大片 | 91成年人在线观看 | 四虎免费在线观看视频 | 美女国内精品自产拍在线播放 | www.久草视频 | 六月激情久久 | 黄色官网在线观看 | 久久中国精品 | 又湿又紧又大又爽a视频国产 | 日本在线观看视频一区 | 91插插插免费视频 | 九色porny真实丨国产18 | 99久久999久久久精玫瑰 | 特级西西444www大精品视频免费看 | 亚洲精品一区中文字幕乱码 | 怡春院av| 午夜三级理论 | 人人人爽| 亚洲免费av网站 | 在线91色| 中文字幕一区二区三 | 制服丝袜天堂 | 国产精品成人免费 | 国产精品扒开做爽爽的视频 | h视频在线看| 99在线免费观看视频 | 伊人五月天 | 亚洲精品456在线播放第一页 | 日本韩国精品在线 | 亚洲一区精品人人爽人人躁 | 欧洲av不卡 | 首页中文字幕 | 一区二区精品久久 | 91亚洲精品在线观看 | 丁香婷婷色综合亚洲电影 | 久久精品网站视频 | 婷婷视频导航 | 国产又黄又爽无遮挡 | 婷婷六月综合亚洲 | 久久国产精品一国产精品 | 日韩av伦理片 | 国产亚洲字幕 | 日韩免费在线网站 | 国产男女爽爽爽免费视频 | 国产精品情侣视频 | 色在线国产 | 狠狠狠色丁香婷婷综合激情 | 中文字幕在线观看完整 | 五月婷婷综合网 | 久草视频播放 | 国产视频在线免费 | 欧美日韩久久不卡 | 国内99视频| 在线欧美中文字幕 | 在线色亚洲 | 国产九色91 | 欧美三级在线播放 | 日韩欧美有码在线 | 欧美网站黄色 | 亚洲高清av在线 | 欧美日韩一区二区三区在线观看视频 | 一区二区三区不卡在线 | 国产在线a视频 | 日本精品一区二区在线观看 | 中文字幕在线观看视频一区 | 国产91精品欧美 | 中文在线8新资源库 | 欧美久久九九 | 天堂黄色片 | 久草在线免费播放 | 成人黄色大片在线免费观看 | 欧美精品v国产精品v日韩精品 | 欧美日韩精| 日日夜夜免费精品 | 日日夜夜天天操 | 日av免费 | 一区二区影视 | 免费看黄的视频 | 国产精品2018 | 韩国av一区二区三区在线观看 | www九九热 | 中文在线免费一区三区 | 久久人操 | 91精品视频网站 | 欧美日产一区 | 久久久久久久久久久久国产精品 | 午夜精品久久 | 久久精选视频 | 欧美日韩国产成人 | 91丨九色丨国产丨porny精品 | av福利在线播放 | 日韩免费视频在线观看 | 狠狠色噜噜狠狠 | 韩日av一区二区 | 国产精品美女免费看 | 在线日韩中文字幕 | 中文字幕一区二区三区久久蜜桃 | 婷婷丁香狠狠爱 | 国产视频在线观看一区二区 | 久久全国免费视频 | 国产亚洲在线 | 天天插天天干天天操 | 天天天天天天干 | 天天色天天骑天天射 | 六月天综合网 | 成年人黄色免费网站 | 天天在线操 | 欧美性黑人 | 六月丁香激情网 | 手机av在线不卡 | 五月婷婷深开心 | 在线观看精品视频 | 国产少妇在线观看 | 久久99久国产精品黄毛片入口 | 国产手机免费视频 | 欧美久久综合 | 久艹视频在线免费观看 | 国产成人av一区二区三区在线观看 | 久久美女免费视频 | 99精品视频一区二区 | 日日夜夜噜噜噜 | 欧美性黑人 | 国产韩国精品一区二区三区 | 欧美永久视频 | 成人在线观看免费视频 | 最近2019好看的中文字幕免费 | 欧美一级免费在线 | 亚洲黄色片 | 欧美日韩中文在线观看 | 天天操人人干 | 国产黄 | 久草在线观看 | 色综合久久综合 | 五月天精品视频 | 国产这里只有精品 | 97国产情侣爱久久免费观看 | 亚洲免费精品视频 | 在线天堂中文在线资源网 | 日韩欧美99 | 色婷婷成人网 | www.黄色 | 亚洲精品福利在线观看 | 国产精品va在线观看入 | 日韩黄在线观看 | 亚洲乱码精品久久久久 | 毛片播放网站 | 久久国产一区二区三区 | 99久久久成人国产精品 | 九九久久久久99精品 | 精品影院一区二区久久久 | 久久这里只有精品1 | 黄色精品视频 | 久久的色| 久操中文字幕在线观看 | 91最新网址在线观看 | 在线你懂的视频 | 日韩免费视频 | 狠狠色丁香久久婷婷综合_中 | 国产精品国产三级国产 | 国产视频1区2区3区 久久夜视频 | 亚洲春色综合另类校园电影 | 色视频在线观看 | 在线v片免费观看视频 | 91视频在线免费观看 | 亚洲欧美日韩精品久久久 | 91亚洲精品久久久蜜桃网站 | a黄色片在线观看 | 免费精品人在线二线三线 | av在线官网 | 黄色一级免费网站 | 嫩嫩影院理论片 | 国内精品视频一区二区三区八戒 | 黄色在线网站噜噜噜 | 精品国产一二三 | 91精品国产综合久久久久久久 | 精品毛片久久久久久 | 少妇av片 | 日韩久久网站 | 国产精品视频永久免费播放 | 日日干夜夜干 | 久久国产精品一区二区三区四区 | 91精品1区2区| 福利一区在线视频 | 久久9999久久免费精品国产 | 欧美日韩大片在线观看 | 中文字幕在线看视频国产 | 欧美贵妇性狂欢 | 免费电影播放 | 国产高清综合 | 久久99热这里只有精品 | 中文字幕在线影院 | 日韩中文字幕a | 精品国产一区二区三区在线 | 夜夜躁狠狠躁日日躁视频黑人 | 91丨九色丨蝌蚪丨对白 | 亚洲高清视频在线 | 精品国产伦一区二区三区观看体验 | 国产精品久久久免费看 | 久久在线免费观看 | 91中文字幕网 | 免费污片 | 日韩视频一区二区三区 | 亚洲欧洲成人精品av97 | 欧美电影在线观看 | 国产精品久久久区三区天天噜 | 看片的网址 | 日本精品视频网站 | av网在线观看 | 伊人超碰在线 | 狠狠干夜夜操 | 久久精品播放 | 在线免费观看国产精品 | 中文字幕在线观看视频一区 | 日日摸日日添日日躁av | 免费观看www小视频的软件 | 国产精品久久久久久a | 国产美女网 | 国产福利91精品一区 | 日日干夜夜操视频 | 色资源中文字幕 | 51久久成人国产精品麻豆 | 1024久久 | 久久国产精品一区二区三区四区 | 日韩精品久久久久 | 日韩城人在线 | 视频在线在亚洲 | 狠狠操狠狠干天天操 | 国产精品av免费在线观看 | 99精品国产在热久久下载 | 成人av直播 | 狠狠插狠狠干 | 99视频国产在线 | 国产一区二区三区黄 | 91 在线视频播放 | 久久高清免费视频 | 亚洲欧美日本一区二区三区 | 久久精品五月 | 精品国产欧美 | 91私密视频 | 国产首页 | 成人资源在线播放 | 久草在线视频中文 | 久久影院一区 | 亚洲永久国产精品 | 全黄网站 | 黄色小说视频在线 | 高清中文字幕 | 国产成人精品久久久久 | 视频成人| 天天天干天天射天天天操 | 久久99日韩| 热久久国产精品 | 精品一区二区免费 | 天天色.com | 欧美精品亚洲精品 | 久久久久久毛片精品免费不卡 | 精品女同一区二区三区在线观看 | 日韩在线视频播放 | 国产精品中文久久久久久久 | 中文字幕888| 17videosex性欧美 | 国产视频在线观看一区 | 久久视频免费看 | 国产成人精品一区二区在线 | 色婷婷精品大在线视频 | 九九九毛片 | 成人视屏免费看 | 国产中文字幕亚洲 | 日日碰狠狠躁久久躁综合网 | 制服丝袜在线91 | 99精品国产免费久久久久久下载 | 欧美婷婷色 | 在线观看不卡视频 | 国产成人精品久久久久蜜臀 | 丁香婷婷在线 | 日韩美在线 | 午夜视频欧美 | 最近日本中文字幕a | 天天在线免费视频 | 久久精品成人欧美大片古装 | 中文字幕国产一区二区 | 999国内精品永久免费视频 | 91精品在线免费观看 | 麻豆国产精品视频 | 国产精品第一页在线观看 | 国产亚洲精品成人av久久ww | 国产精品成人一区二区三区吃奶 | 国产免费亚洲 | 精品国产自在精品国产精野外直播 | 99精品国产免费久久久久久下载 | 久久成人综合 | www色网站 | 国产麻豆视频网站 | 国产一区二区观看 | 精品女同一区二区三区在线观看 | 日韩精品一区二区三区中文字幕 | 黄影院| 美女黄视频免费 | 91欧美在线 | 国产91探花| 四虎成人免费观看 | 欧美精品一区二区免费 | 免费成人在线观看 | 成人国产一区二区 | 久久香蕉电影 | 69国产成人综合久久精品欧美 | av 一区二区三区 | 国产精品入口a级 | 日韩精品一区二区三区在线视频 | 91九色国产| 国产精华国产精品 | 91av免费看 | 99久久精品国产观看 | 欧美九九视频 | 中文字幕色站 | 久久国内视频 | 日韩欧美高清一区二区 | 在线观看91 | 91入口在线观看 | 超碰精品在线观看 | 99久久精品免费看国产麻豆 | 这里只有精品视频在线观看 | 在线 视频 一区二区 | 国内精品久久久久影院一蜜桃 | 亚洲精品国 | 在线视频免费观看 | 日韩av中文在线观看 | 免费看一级片 | 免费 在线 中文 日本 | 日韩在线观看中文 | 麻豆视频在线免费 | 国产aa精品 | 国产黄色在线观看 | 国产高清黄色 | 国模精品一区二区三区 | 中文字幕在线播放第一页 | 国语精品免费视频 | 国产一区视频在线观看免费 | 久久久免费观看完整版 | 色福利网站 | 久久免费视频一区 | 粉嫩av一区二区三区免费 | 91看毛片 | 91麻豆精品国产91久久久无限制版 | 欧美日韩视频在线播放 | 最近免费中文视频 | 欧洲精品一区二区 | 中文字幕高清免费日韩视频在线 | 亚洲精品456在线播放乱码 | 99视频在线看 | 97手机电影网 | 久久综合色天天久久综合图片 | 亚洲影音先锋 | 亚洲专区欧美 | 欧美国产精品久久久久久免费 | www..com毛片 | 夜色资源站wwwcom | 成人一级片视频 | 国产69精品久久久久99尤 | 国产成人精品免高潮在线观看 | www.午夜| 久草精品视频在线看网站免费 | zzijzzij亚洲日本少妇熟睡 | 少妇av网 | 在线观看日韩视频 | 欧美日韩成人一区 | 亚洲高清视频在线 | 久久蜜臀一区二区三区av | 久久久久亚洲精品中文字幕 | 国产一二三四在线观看视频 | 欧美a√在线 | 丁香九月婷婷 | 欧美日产一区 | 天天爱综合| 91桃色视频 | www色综合| 国产高清视频免费最新在线 | 人人爽人人搞 | 激情婷婷色 | 在线观看第一页 | 在线观看的av网站 | 色综合天天综合在线视频 | 色天天综合网 | 精品视频一区在线观看 | 欧美伦理一区二区三区 | 欧美性大战久久久久 | 日日夜夜精品视频天天综合网 | av黄色亚洲 | 国产精品久久人 | 欧美黄网站| 国产精品久久久久久久久久免费 | 91久久国产自产拍夜夜嗨 | 91爱爱网址| 97在线免费 | 51精品国自产在线 | 国产色视频123区 | 国产精品99久久免费观看 | 国产日产精品一区二区三区四区的观看方式 | 91亚色免费视频 | 天堂成人在线 | 国产一级h| 国产精品黄网站在线观看 | 欧美日韩精品在线播放 | 国产一区二区在线视频观看 | 国产成人精品一区二区三区免费 | 黄色www | 午夜精品一二三区 | 四虎影视国产精品免费久久 | 日日干av | 福利一区二区三区四区 | 亚洲理论在线观看 | 亚洲国产精品成人va在线观看 | 男女激情麻豆 | 日韩 精品 一区 国产 麻豆 | 婷婷中文字幕综合 | 久久国产视频网 | 日韩中文字幕亚洲一区二区va在线 | 五月婷婷激情网 | 99热 精品在线 | 久久伦理网 | 97视频免费在线看 | 97在线精品| 狠狠色丁香久久婷婷综合丁香 | 欧美伦理电影一区二区 | 爱爱av网| 九九视频在线播放 | 久久综合九色 | 国产精品久久久久影院 | 贫乳av女优大全 | 精品久久久久亚洲 | 久青草电影 | 国产在线观看不卡 | 五月婷婷亚洲 | 国产91在线播放 | 国内精品久久天天躁人人爽 | 黄色在线免费观看网站 | 日本中出在线观看 | 婷婷六月丁香激情 | 久久99久久99久久 | 中文字幕成人在线 | 国产精品夜夜夜一区二区三区尤 | 又黄又刺激的网站 | 中文字幕精品三区 | 午夜男人影院 | 成人在线观看av | 欧美人操人 | 久草精品视频在线播放 | 国产视频999| 日韩高清成人在线 | 日本成人免费在线观看 | 国产精品69av | 不卡电影免费在线播放一区 | 久久亚洲精品国产亚洲老地址 | 五月婷婷伊人网 | 天天操天天色天天射 | 99精品欧美一区二区三区黑人哦 | 亚洲免费专区 | 欧美亚洲专区 | 97精产国品一二三产区在线 | 精品亚洲国产视频 | 亚洲一级性 | 99热精品在线观看 | 97超碰国产在线 | 亚洲a成人v | 精品播放 | 在线播放日韩av | 伊人首页| 成人中文字幕在线观看 | 日韩av在线一区二区 | 久久成人一区 | 日韩91av| 欧美视频日韩 | 国产伦理精品一区二区 | 色在线高清 | 国产色妞影院wwwxxx | 2020天天干夜夜爽 | 天天干中文字幕 | 香蕉影视app | 久久久美女 | 免费精品国产va自在自线 | 人成免费网站 | 一区二区成人国产精品 | 黄色的视频网站 | 国产a国产 | 麻豆视频免费版 | 国产黑丝袜在线 | 久草在线手机观看 | 激情深爱.com | 午夜国产影院 | 婷婷丁香九月 | 麻豆精品视频在线 | 久久久99久久 | 伊人激情综合 | 亚洲免费观看在线视频 | 中文字幕免费在线看 | 国产成人久久精品77777综合 | 黄色av一区二区 | 在线国产精品视频 | 欧美激情综合色 | 久久久久久国产一区二区三区 | 成年人黄色免费看 | 九九九九九九精品 | 国产系列在线观看 | 婷婷色狠狠 | japanesefreesex中国少妇 | 亚洲另类久久 | 成片免费观看视频大全 | 亚洲精品免费在线观看视频 | 成人一区二区三区在线观看 | 国产精品久久久久久久久久妇女 | 日本精品一区二区三区在线播放视频 | 操夜夜操 | 在线中文字幕电影 | 国产在线第三页 | 免费av成人在线 | 2021国产精品 | 开心丁香婷婷深爱五月 | 成人理论电影 | 成人免费中文字幕 | 四虎在线视频 | 日韩欧美在线高清 | 日韩精品免费在线观看视频 | 亚洲国产精品一区二区久久hs | 国产精品s色 | 国产精品国产亚洲精品看不卡15 | 五月婷婷在线视频观看 | 欧洲一区二区在线观看 | 免费在线观看av的网站 | 在线播放日韩av | 成人一区二区三区在线观看 | 中文字幕刺激在线 | 天天操天天干天天操天天干 | 国产精品一区二区电影 | 九九国产精品视频 | 最近中文字幕免费视频 | 中文字幕999 | 欧美一进一出抽搐大尺度视频 | 一区二区三区在线免费播放 | 99久久精品免费看国产免费软件 | 尤物九九久久国产精品的分类 | 欧美在线视频一区二区三区 | 久99久精品视频免费观看 | 狠狠色噜噜狠狠狠狠2022 | free,性欧美| 日韩在线视频一区二区三区 | 国产精品一区二区三区四 | 日日干av| 色狠狠久久av五月综合 | 亚洲精品在线看 | 国产精品二区三区 | 九九热只有精品 | 9在线观看免费 | 91人人爽久久涩噜噜噜 | 91粉色视频| 中文免费在线观看 | 一区二区三区久久精品 | 久草91视频 | 日韩av网站在线播放 | 1024手机基地在线观看 | 免费看黄色大全 | 91九色蝌蚪在线 | 国产午夜精品福利视频 | 日本黄色免费大片 | 人人澡人人添人人爽一区二区 | 超碰97在线资源 | 国产日本高清 | 午夜av影院 | 久久久久久久久黄色 | 精品一区二区综合 | 国产99久| 日韩三级视频在线看 | 欧美亚洲免费在线一区 | 最近最新mv字幕免费观看 | 日韩av电影免费观看 | www.黄色片网站 |