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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDBC入门

發(fā)布時間:2023/12/10 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDBC入门 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1 概述

在Java中,數(shù)據(jù)庫存取技術可分為如下幾類:

  • JDBC直接訪問數(shù)據(jù)庫
  • JDO技術(Java Data Object)
  • 第三方O/R工具,如Hibernate, Mybatis 等
    JDBC是java訪問數(shù)據(jù)庫的基石,JDO, Hibernate等只是更好的封裝了JDBC。

1.1 什么是JDBC

JDBC(Java Database Connectivity)是一個獨立于特定數(shù)據(jù)庫管理系統(tǒng)(DBMS)、通用的SQL數(shù)據(jù)庫存取和操作的公共接口(一組API),定義了用來訪問數(shù)據(jù)庫的標準Java類庫,使用這個類庫可以以一種標準的方法、方便地訪問數(shù)據(jù)庫資源
JDBC為訪問不同的數(shù)據(jù)庫提供了一種統(tǒng)一的途徑 ,為開發(fā)者屏蔽了一些細節(jié)問題。
JDBC的目標是使Java程序員使用JDBC可以連接任何提供了JDBC驅(qū)動程序的數(shù)據(jù)庫系統(tǒng),這樣就使得程序員無需對特定的數(shù)據(jù)庫系統(tǒng)的特點有過多的了解,從而大大簡化和加快了開發(fā)過程。

2 JDBC程序編寫步驟

  • 注冊驅(qū)動
  • 獲取連接
  • 執(zhí)行增刪改查
  • 釋放資源

2.1 演示完整步驟

準備工作:引入JDBC驅(qū)動程序

驅(qū)動程序由數(shù)據(jù)庫提供商提供下載。 MySQL的驅(qū)動下載地址:http://dev.mysql.com/downloads/
以此點擊Connector/J→選擇Platform Independent→下載.zip文件→下載好的zip里的jar就是要的jar

  • (1)把mysql-connector-java-8.0.21.jar拷貝到項目中l(wèi)ib目錄中

  • (2)添加到項目的類路徑下
    在驅(qū)動jar上右鍵–>Build Path–>Add to Build Path

注意:如果是Dynamic Web Project(動態(tài)的web項目)話,則是把驅(qū)動jar放到WebContent(有的開發(fā)工具叫WebRoot)目錄中的WEB-INF目錄中的lib目錄下即可

(一)加載并注冊驅(qū)動

加載并注冊驅(qū)動:
加載驅(qū)動,把驅(qū)動類加載到內(nèi)存
注冊驅(qū)動,把驅(qū)動類的對象交給DriverManager管理,用于后面創(chuàng)建連接等使用。

  • 1、Class.forName( )
DriverManager.registerDriver(new Driver());//這是舊方法 Class.forName("com.mysql.cj.jdbc.Driver");//這是新方法

因為 Driver 接口的驅(qū)動程序類都包含了靜態(tài)代碼塊,在這個靜態(tài)代碼塊中,會調(diào)用 DriverManager.registerDriver() 方法來注冊自身的一個實例,所以可以換一種方式來加載驅(qū)動。(即只要想辦法讓驅(qū)動類的這段靜態(tài)代碼塊執(zhí)行即可注冊驅(qū)動類,而要讓這段靜態(tài)代碼塊執(zhí)行,只要讓該類被類加載器加載即可)

調(diào)用 Class 類的靜態(tài)方法 forName(),向其傳遞要加載的 JDBC 驅(qū)動的類名
//通過反射,加載與注冊驅(qū)動類,解耦合(不直接依賴)
Class.forName(“com.mysql.jdbc.Driver”);

  • 2、服務提供者框架(例如:JDBC的驅(qū)動程序)自動注冊(有版本要求)
    符合JDBC 4.0規(guī)范的驅(qū)動程序包含了一個文件META-INF/services/java.sql.Driver,在這個文件中提供了JDBC驅(qū)動實現(xiàn)的類名。例如:mysql-connector-java-5.1.40-bin.jar文件中就可以找到java.sql.Driver文件,用文本編輯器打開文件就可以看到:com.mysql.jdbc.Driver類。

    JVM的服務提供者框架在啟動應用時就會注冊服務,例如:MySQL的JDBC驅(qū)動就會被注冊,而原代碼中的Class.forName(“com.mysql.jdbc.Driver”)仍然可以存在,但是不會起作用。
    但是注意mysql-connector-java-5.0.8-bin.jar版本的jar中沒有,如下

(二)獲取數(shù)據(jù)庫鏈接

可以通過 DriverManager 類建立到數(shù)據(jù)庫的連接Connection:
DriverManager 試圖從已注冊的 JDBC 驅(qū)動程序集中選擇一個適當?shù)尿?qū)動程序。

- public static Connection getConnection(String url) - public static Connection getConnection(String url,String user, String password) - public static Connection getConnection(String url,Properties info)其中Properties info通常至少應該包括 "user" 和 "password" 屬性

例如:

Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/girls?serverTimezone=UTC","root","root");

JDBC URL 用于標識一個被注冊的驅(qū)動程序,驅(qū)動程序管理器通過這個 URL 選擇正確的驅(qū)動程序,從而建立到數(shù)據(jù)庫的連接。JDBC URL的標準由三部分組成,各部分間用冒號分隔。
jdbc:<子協(xié)議>:<子名稱>

  • 協(xié)議:JDBC URL中的協(xié)議總是jdbc
  • 子協(xié)議:子協(xié)議用于標識一個數(shù)據(jù)庫驅(qū)動程序
  • 子名稱:一種標識數(shù)據(jù)庫的方法。子名稱可以依不同的子協(xié)議而變化,用子名稱的目的是為了定位數(shù)據(jù)庫提供足夠的信息
    例如:

    MySQL的連接URL編寫方式:
jdbc:mysql://主機名稱:mysql服務端口號/數(shù)據(jù)庫名稱?參數(shù)=值&參數(shù)=值 jdbc:mysql://localhost:3306/testdb jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf8(如果JDBC程序與服務器端的字符集不一致,會導致亂碼,那么可以通過參數(shù)指定服務器端的字符集) jdbc:mysql://localhost:3306/testdb?user=root&password=123456 "jdbc:mysql://localhost:3306/girls?serverTimezone=UTC","root","root"

MySQL的連接URL之利用properties文件
在src下新建一個文件:jdbc.properties

(三)操作或訪問數(shù)據(jù)庫

數(shù)據(jù)庫連接被用于向數(shù)據(jù)庫服務器發(fā)送命令和 SQL 語句,并接受數(shù)據(jù)庫服務器返回的結(jié)果。
其實一個數(shù)據(jù)庫連接就是一個Socket連接。
在 java.sql 包中有 3 個接口分別定義了對數(shù)據(jù)庫的調(diào)用的不同方式:

  • Statement:用于執(zhí)行靜態(tài) SQL 語句并返回它所生成結(jié)果的對象。
  • PrepatedStatement:SQL 語句被預編譯并存儲在此對象中,然后可以使用此對象多次高效地執(zhí)行該語句。
  • CallableStatement:用于執(zhí)行 SQL 存儲過程

3.1Statement

通過調(diào)用 Connection 對象的 createStatement() 方法創(chuàng)建該對象
該對象用于執(zhí)行靜態(tài)的 SQL 語句,并且返回執(zhí)行結(jié)果
Statement 接口中定義了下列方法用于執(zhí)行 SQL 語句:
- int excuteUpdate(String sql):執(zhí)行更新操作INSERT、UPDATE、DELETE,返回值為被改變的行數(shù)
- ResultSet excuteQuery(String sql):執(zhí)行查詢操作SELECT

executeUpdate
package mysql;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;import com.mysql.jdbc.Driver;public class sqltest {public static void main(String[] args) throws SQLException, ClassNotFoundException {//1 加載驅(qū)動//DriverManager.registerDriver(new Driver());Class.forName("com.mysql.cj.jdbc.Driver");//2.獲取連接Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/girls?serverTimezone=UTC","root","root");//3.執(zhí)行增刪改查//3-1 編寫sql語句String sql="UPDATE boys SET boyName='盧本偉' where id=1";//3-2 獲取執(zhí)行sql語句的執(zhí)行對象Statement statement= connection.createStatement();//3-3 使用命令對象指向sql語句int update=statement.executeUpdate(sql);//這一句只能增刪改,返回受影響行數(shù)//3-4處理執(zhí)行結(jié)果System.out.println(update>0?"yes":"no");//4 關閉連接,后開先關閉,對稱statement.close();connection.close();}}
ResultSet

通過調(diào)用 Statement 對象的 excuteQuery() 方法創(chuàng)建該對象
ResultSet 對象以邏輯表格的形式封裝了執(zhí)行數(shù)據(jù)庫操作的結(jié)果集,ResultSet 接口由數(shù)據(jù)庫廠商實現(xiàn)
ResultSet 對象維護了一個指向當前數(shù)據(jù)行的游標,初始的時候,游標在第一行之前一行,可以通過 ResultSet 對象的 next() 方法移動到下一行
ResultSet 接口的常用方法:

  • boolean next()
  • getXxx(String columnLabel):columnLabel使用 SQL AS 子句指定的列標簽。如果未指定 SQL AS 子句,則標簽是列名稱
  • getXxx(int index) :索引從1開始

package mysql;import java.sql.Connection; import java.sql.Date; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;import com.mysql.jdbc.Driver;public class sqltest {public static void main(String[] args) throws SQLException, ClassNotFoundException {//1 加載驅(qū)動//DriverManager.registerDriver(new Driver());Class.forName("com.mysql.cj.jdbc.Driver");//2.獲取連接Connection connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/girls?serverTimezone=UTC","root","root");//3.執(zhí)行增刪改查//3-1 編寫sql語句String sql="select id,name,sex,borndate from beauty";//3-2 獲取執(zhí)行sql語句的執(zhí)行對象Statement statement= connection.createStatement();//3-3 使用命令對象指向sql語句ResultSet set=statement.executeQuery(sql);boolean flag= set.next();int id = set.getInt("id");String name = set.getString("name");String sex = set.getString("sex");Date date = set.getDate("borndate");System.out.println(id+"\t"+name+"\t"+sex+"\t"+date);//4 關閉連接,后開先關閉,對稱set.close();statement.close();connection.close();}}

3.2 PrepatedStatement

可以通過調(diào)用 Connection 對象的 preparedStatement(String sql) 方法獲取 PreparedStatement 對象
PreparedStatement 接口是 Statement 的子接口,它表示一條預編譯過的 SQL 語句

  • PreparedStatement 對象所代表的 SQL 語句中的參數(shù)用問號(?)來表示,調(diào)用 PreparedStatement 對象的 setXxx() 方法來設置這些參數(shù). setXxx() 方法有兩個參數(shù),第一個參數(shù)是要設置的 SQL 語句中的參數(shù)的索引(從 1 開始),第二個是設置的 SQL 語句中的參數(shù)的值
  • ResultSet executeQuery()執(zhí)行查詢,并返回該查詢生成的 ResultSet 對象。
  • int executeUpdate():執(zhí)行更新,包括增、刪、改


↑來驗證賬戶密碼會導致sql注入問題,因為如果兩個參數(shù)中含有’ "等符號,會出現(xiàn)語法錯誤


↑就可以避免sql注入問題

2.2 封裝JDBCUtils.java

因為很多步驟都是重復的,所以可以將重復的操作封裝起來

import java.io.FileInputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties;/*** 此類是封裝JDBC連接的工具類* * 功能:* 1、獲取連接* 2、釋放資源**/ public class JDBCUtils {static String user;static String password;static String url;static String driver;static{try {Properties info = new Properties();info.load(new FileInputStream("src\\jdbc.properties"));user = info.getProperty("user");password = info.getProperty("password");url = info.getProperty("url");driver = info.getProperty("driver");//1.注冊驅(qū)動Class.forName(driver);} catch (Exception e) {throw new RuntimeException(e);}}/*** 功能:獲取可用的連接對象* @return 連接* @throws Exception*/public static Connection getConnection(){try {return DriverManager.getConnection(url, user, password);} catch (Exception e) {throw new RuntimeException(e);}}/*** 功能:釋放資源* @param set* @param statement* @param connection* @throws Exception*/public static void close(ResultSet set,Statement statement,Connection connection){try {if (set!=null) {set.close();//如果是查詢操作,需要關閉set,否則這里傳個null}if (statement!=null) {statement.close();}if (connection!=null) {connection.close();}} catch (SQLException e) {throw new RuntimeException(e);}}}

至此以下為完整步驟

3 JDBC事務

package com.atguigu.jdbc2;import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException;import org.junit.Test;import com.atguigu.jdbc1.JDBCUtils;/*** 此類用于演示JDBC中的事務* @author liyuting* * 使用步驟:* 1、開啟新事務* 取消隱式事務自動提交的功能* setAutoCommit(false);* 2、編寫組成事務的一組sql語句* * 3、結(jié)束事務* commit();提交* rollback();回滾* * 細節(jié):* 要求開啟事務的連接對象和獲取命令的連接對象必須是同一個!否則事務無效* * * * * * 案例:轉(zhuǎn)賬案例* 張三豐給滅絕轉(zhuǎn)5000* **/ public class TestTransaction {//不用事務@Testpublic void testNoTransaction() throws Exception{//1.獲取連接Connection connection = JDBCUtils.getConnection();//2.執(zhí)行sql語句PreparedStatement statement = connection.prepareStatement("update account set balance = ? where stuname=?");//操作1:張三豐的錢-5000statement.setDouble(1, 5000);statement.setString(2, "張三豐");statement.executeUpdate();int i = 1/0;//模擬異常//操作2:張三豐的錢-5000statement.setDouble(1, 15000);statement.setString(2, "滅絕師太");statement.executeUpdate();//3.釋放資源JDBCUtils.close(null, statement, connection);}//使用事務@Testpublic void testTransaction(){Connection connection = null;PreparedStatement statement = null;try {//1.獲取連接connection = JDBCUtils.getConnection();//①事務的使用步驟1:開啟事務,意思是取消每條語句自動commitconnection.setAutoCommit(false);//②事務的使用步驟2:編寫sql語句,并且執(zhí)行statement = connection.prepareStatement("update account set balance = ? where stuname=?");//操作1:張三豐的錢-5000statement.setDouble(1, 5000);statement.setString(2, "張三豐");statement.executeUpdate();// int i = 1/0;//模擬異常//操作2:張三豐的錢-5000statement.setDouble(1, 15000);statement.setString(2, "滅絕師太");statement.executeUpdate();//③事務的使用步驟3:結(jié)束事務connection.commit();} catch (SQLException e) {try {//回滾事務connection.rollback();} catch (SQLException e1) {e1.printStackTrace();}}finally{JDBCUtils.close(null, statement, connection);}}}

4 批處理

當需要成批插入或者更新記錄時??梢圆捎肑ava的批量更新機制,這一機制允許多條語句一次性提交給數(shù)據(jù)庫批量處理。通常情況下比單獨提交處理更有效率。
JDBC的批量處理語句包括下面兩個方法:

  • addBatch():添加需要批量處理的SQL語句或參數(shù)
  • executeBatch():執(zhí)行批量處理語句;
  • clearBatch():清空批處理包的語句
    分為兩種情況:
  • 多條SQL語句的批量處理;
  • 一個SQL語句的批量傳參;
  • 5 Blob類型數(shù)據(jù)

    MySQL中,BLOB是一個二進制大型對象,是一個可以存儲大量數(shù)據(jù)的容器,它能容納不同大小的數(shù)據(jù)。能夠存
    MySQL的四種BLOB類型(除了在存儲的最大信息量上不同外,他們是等同的)
    實際使用中根據(jù)需要存入的數(shù)據(jù)大小定義不同的BLOB類型。
    需要注意的是:如果存儲的文件過大,數(shù)據(jù)庫的性能會下降

    package com.atguigu.jdbc2;import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;import org.junit.Test;import com.atguigu.jdbc1.JDBCUtils;/*** 此類用于演示Blob類型數(shù)據(jù)的存取* @author liyuting* 相關API:* * setBlob(占位符索引,InputStream對象)* getBlob(列索引或列名)* getBinaryStream(列索引或列名)* */ public class TestBlob {//存圖片@Testpublic void testSave() throws SQLException, Exception{//1.獲取連接Connection connection = JDBCUtils.getConnection();//2.執(zhí)行修改語句PreparedStatement statement = connection.prepareStatement("update beauty set photo=? where id = 1");statement.setBlob(1, new FileInputStream("src\\6.jpg"));int update = statement.executeUpdate();//3.關閉連接JDBCUtils.close(null, statement, connection);}//讀圖片@Testpublic void testRead() throws SQLException, Exception{//1.獲取連接Connection connection = JDBCUtils.getConnection();//2.執(zhí)行修改語句PreparedStatement statement = connection.prepareStatement("select photo from beauty where id = 1");ResultSet set = statement.executeQuery();if(set.next()){//方式1: // Blob blob = set.getBlob("photo"); // InputStream binaryStream = blob.getBinaryStream();//方式2:InputStream inputStream = set.getBinaryStream("photo");FileOutputStream fos = new FileOutputStream("src\\beauty.jpg");int len;byte[] b = new byte[1024];while((len=inputStream.read(b))!=-1){fos.write(b,0,len);}fos.close();inputStream.close();}//3.關閉連接JDBCUtils.close(null, statement, connection);} }

    6 數(shù)據(jù)庫連接池

    (1)數(shù)據(jù)庫連接池的必要性
    不使用數(shù)據(jù)庫連接池存在的問題:

    • 普通的JDBC數(shù)據(jù)庫連接使用 DriverManager 來獲取,每次向數(shù)據(jù)庫建立連接的時候都要將 Connection 加載到內(nèi)存中,再驗證IP地址,用戶名和密碼(得花費0.05s~1s的時間)。需要數(shù)據(jù)庫連接的時候,就向數(shù)據(jù)庫要求一個,執(zhí)行完成后再斷開連接。這樣的方式將會消耗大量的資源和時間。數(shù)據(jù)庫的連接資源并沒有得到很好的重復利用.若同時有幾百人甚至幾千人在線,頻繁的進行數(shù)據(jù)庫連接操作將占用很多的系統(tǒng)資源,嚴重的甚至會造成服務器的崩潰。
    • 對于每一次數(shù)據(jù)庫連接,使用完后都得斷開。否則,如果程序出現(xiàn)異常而未能關閉,將會導致數(shù)據(jù)庫系統(tǒng)中的內(nèi)存泄漏,最終將導致重啟數(shù)據(jù)庫。
    • 這種開發(fā)不能控制被創(chuàng)建的連接對象數(shù),系統(tǒng)資源會被毫無顧及的分配出去,如連接過多,也可能導致內(nèi)存泄漏,服務器崩潰。
      為解決傳統(tǒng)開發(fā)中的數(shù)據(jù)庫連接問題,可以采用數(shù)據(jù)庫連接池技術(connection pool)。

    數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個“緩沖池”。預先在緩沖池中放入一定數(shù)量的連接,當需要建立數(shù)據(jù)庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。數(shù)據(jù)庫連接池負責分配、管理和釋放數(shù)據(jù)庫連接,它允許應用程序重復使用一個現(xiàn)有的數(shù)據(jù)庫連接,而不是重新建立一個。連接池的最大數(shù)據(jù)庫連接數(shù)量限定了這個連接池能占有的最大連接數(shù),當應用程序向連接池請求的連接數(shù)超過最大連接數(shù)量時,這些請求將被加入到等待隊列中。


    數(shù)據(jù)庫連接池技術的優(yōu)點:

    • 資源重用:
      • 由于數(shù)據(jù)庫連接得以重用,避免了頻繁創(chuàng)建,釋放連接引起的大量性能開銷。在減少系統(tǒng)消耗的基礎上,另一方面也增加了系統(tǒng)運行環(huán)境的平穩(wěn)性。
    • 更快的系統(tǒng)反應速度
      • 數(shù)據(jù)庫連接池在初始化過程中,往往已經(jīng)創(chuàng)建了若干數(shù)據(jù)庫連接置于連接池中備用。此時連接的初始化工作均已完成。對于業(yè)務請求處理而言,直接利用現(xiàn)有可用連接,避免了數(shù)據(jù)庫連接初始化和釋放過程的時間開銷,從而減少了系統(tǒng)的響應時間
    • 新的資源分配手段
      • 對于多應用共享同一數(shù)據(jù)庫的系統(tǒng)而言,可在應用層通過數(shù)據(jù)庫連接池的配置,實現(xiàn)某一應用最大可用數(shù)據(jù)庫連接數(shù)的限制,避免某一應用獨占所有的數(shù)據(jù)庫資源
    • 統(tǒng)一的連接管理,避免數(shù)據(jù)庫連接泄露
      • 在較為完善的數(shù)據(jù)庫連接池實現(xiàn)中,可根據(jù)預先的占用超時設定,強制回收被占用連接,從而避免了常規(guī)數(shù)據(jù)庫連接操作中可能出現(xiàn)的資源泄露

    (2)多種開源的數(shù)據(jù)庫連接池
    JDBC 的數(shù)據(jù)庫連接池使用 javax.sql.DataSource 來表示,DataSource 只是一個接口,該接口通常由服務器(Weblogic, WebSphere, Tomcat)提供實現(xiàn),也有一些開源組織提供實現(xiàn):

    • DBCP 是Apache提供的數(shù)據(jù)庫連接池,速度相對c3p0較快,但因自身存在BUG,Hibernate3已不再提供支持
    • C3P0 是一個開源組織提供的一個數(shù)據(jù)庫連接池,速度相對較慢,穩(wěn)定性還可以
    • Proxool 是sourceforge下的一個開源項目數(shù)據(jù)庫連接池,有監(jiān)控連接池狀態(tài)的功能,穩(wěn)定性較c3p0差一點
    • BoneCP 是一個開源組織提供的數(shù)據(jù)庫連接池,速度快
    • Druid是阿里提供的數(shù)據(jù)庫連接池,據(jù)說是集DBCP 、C3P0 、Proxool 優(yōu)點于一身的數(shù)據(jù)庫連接池,但是速度不知道是否有BoneCP快
      DataSource 通常被稱為數(shù)據(jù)源,它包含連接池和連接池管理兩個部分,習慣上也經(jīng)常把 DataSource 稱為連接池
      注意:
    • 數(shù)據(jù)源和數(shù)據(jù)庫連接不同,數(shù)據(jù)源無需創(chuàng)建多個,它是產(chǎn)生數(shù)據(jù)庫連接的工廠,因此整個應用只需要一個數(shù)據(jù)源即可。
    • 當數(shù)據(jù)庫訪問結(jié)束后,程序還是像以前一樣關閉數(shù)據(jù)庫連接:conn.close(); 但conn.close()并沒有關閉數(shù)據(jù)庫的物理連接,它僅僅把數(shù)據(jù)庫連接釋放,歸還給了數(shù)據(jù)庫連接池。
      (3)Druid(德魯伊)數(shù)據(jù)源
      Druid是阿里巴巴開源平臺上一個數(shù)據(jù)庫連接池實現(xiàn),它結(jié)合了C3P0、DBCP、Proxool等DB池的優(yōu)點,同時加入了日志監(jiān)控,可以很好的監(jiān)控DB池連接和SQL的執(zhí)行情況,可以說是針對監(jiān)控而生的DB連接池,據(jù)說是目前最好的連接池。
  • 方式一
  • package com.atguigu.druid;import java.sql.Connection;import com.alibaba.druid.pool.DruidDataSource;public class TestDruid {public static void main(String[] args) throws Exception {DruidDataSource ds = new DruidDataSource();ds.setUrl("jdbc:mysql://localhost:3306/0319db");ds.setUsername("root");ds.setPassword("123456");ds.setDriverClassName("com.mysql.jdbc.Driver");ds.setInitialSize(10);//默認值0,應該在maxActive和minIdle之間ds.setMaxActive(20);//默認值8ds.setMinIdle(1);//默認值0//maxIdle是Druid為了方便DBCP用戶遷移而增加的,maxIdle是一個混亂的概念。連接池只應該有maxPoolSize和minPoolSize,druid只保留了maxActive和minIdle,分別相當于maxPoolSize和minPoolSize。ds.setMaxIdle(5);// 獲取連接時最大等待時間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,并發(fā)效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。ds.setMaxWait(1000);//配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒ds.setTimeBetweenEvictionRunsMillis(60000);//配置一個連接在池中最小生存的時間,單位是毫秒ds.setMinEvictableIdleTimeMillis(300000);//是否緩存preparedStatement,也就是PSCache。PSCache對支持游標的數(shù)據(jù)庫性能提升巨大,比如說oracle。在mysql下建議關閉。ds.setPoolPreparedStatements(true);// 要啟用PSCache,必須配置大于0,當大于0時,poolPreparedStatements自動觸發(fā)修改為true。在Druid中,不會存在Oracle下PSCache占用內(nèi)存過多的問題,可以把這個數(shù)值配置大一些,比如說100ds.setMaxPoolPreparedStatementPerConnectionSize(10);//配置多個英文逗號分隔//通過別名的方式配置擴展插件,常用的插件有: 監(jiān)控統(tǒng)計用的filter:stat日志用的filter:log4j防御sql注入的filter:wallds.setFilters("stat,wall");Connection conn = ds.getConnection();System.out.println(conn);} }
  • 方式二,使用properties文件
  • package com.atguigu.utils;import java.io.FileInputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties;import javax.sql.DataSource;import com.alibaba.druid.pool.DruidDataSourceFactory;/*** 此類是通過德魯伊數(shù)據(jù)庫連接池獲取連接對象* @author liyuting**/ public class JDBCUtilsByDruid {static DataSource ds;static{try {Properties properties = new Properties();properties.load(new FileInputStream("src\\druid.properties"));//1.創(chuàng)建了一個指定參數(shù)的數(shù)據(jù)庫連接池ds = DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}public static Connection getConnection() throws Exception{//2.從數(shù)據(jù)庫連接池中獲取可用的連接對象return ds.getConnection();}/*** 功能:釋放資源* @param set* @param statement* @param connection* @throws Exception*/public static void close(ResultSet set,Statement statement,Connection connection){try {if (set!=null) {set.close();}if (statement!=null) {statement.close();}if (connection!=null) {connection.close();}} catch (SQLException e) {throw new RuntimeException(e);}} }

    properties文件👇

    url=jdbc:mysql://localhost:3306/0319db username=root password=123456 driverClassName=com.mysql.jdbc.Driver initialSize=10 maxActive=20 maxWait=1000 filters=wall 配置缺省說明
    name配置這個屬性的意義在于,如果存在多個數(shù)據(jù)源,監(jiān)控的時候可以通過名字來區(qū)分開來。 如果沒有配置,將會生成一個名字,格式是:”DataSource-” + System.identityHashCode(this)
    jdbcUrl連接數(shù)據(jù)庫的url,不同數(shù)據(jù)庫不一樣。例如:mysql : jdbc:mysql://10.20.153.104:3306/druid2 oracle : jdbc:oracle:thin:@10.20.149.85:1521:ocnauto
    username連接數(shù)據(jù)庫的用戶名
    password連接數(shù)據(jù)庫的密碼。如果你不希望密碼直接寫在配置文件中,可以使用ConfigFilter。詳細看這里:https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter
    driverClassName根據(jù)url自動識別 這一項可配可不配,如果不配置druid會根據(jù)url自動識別dbType,然后選擇相應的driverClassName(建議配置下)
    initialSize0初始化時建立物理連接的個數(shù)。初始化發(fā)生在顯示調(diào)用init方法,或者第一次getConnection時
    maxActive8最大連接池數(shù)量
    maxIdle8已經(jīng)不再使用,配置了也沒效果
    minIdle最小連接池數(shù)量
    maxWait獲取連接時最大等待時間,單位毫秒。配置了maxWait之后,缺省啟用公平鎖,并發(fā)效率會有所下降,如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。
    poolPreparedStatementsfalse是否緩存preparedStatement,也就是PSCache。PSCache對支持游標的數(shù)據(jù)庫性能提升巨大,比如說oracle。在mysql下建議關閉。
    maxOpenPreparedStatements-1
    validationQuery用來檢測連接是否有效的sql,要求是一個查詢語句。如果validationQuery為null,testOnBorrow、testOnReturn、testWhileIdle都不會其作用。
    testOnBorrowtrue申請連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能。
    testOnReturnfalse歸還連接時執(zhí)行validationQuery檢測連接是否有效,做了這個配置會降低性能
    testWhileIdlefalse建議配置為true,不影響性能,并且保證安全性。申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery檢測連接是否有效。
    timeBetweenEvictionRunsMillis有兩個含義: 1)Destroy線程會檢測連接的間隔時間2)testWhileIdle的判斷依據(jù),詳細看testWhileIdle屬性的說明
    numTestsPerEvictionRun不再使用,一個DruidDataSource只支持一個EvictionRun
    minEvictableIdleTimeMillis
    connectionInitSqls物理連接初始化的時候執(zhí)行的sql
    exceptionSorter根據(jù)dbType自動識別 當數(shù)據(jù)庫拋出一些不可恢復的異常時,拋棄連接
    filters屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有: 監(jiān)控統(tǒng)計用的filter:stat日志用的filter:log4j防御sql注入的filter:wall
    proxyFilters類型是List,如果同時配置了filters和proxyFilters,是組合關系,并非替換關系

    7 利用Druid的CRUD封裝

    import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List;import com.atguigu.bean.Boys;/*** 此類用于封裝通用的增刪改查方法* @author liyuting* 功能:* 1、執(zhí)行增刪改* 2、執(zhí)行查詢* * */ public class CRUDUtils {/*** 功能:增刪改* 針對于任何表的任何增刪改語句* @return* @throws Exception */public static int update(String sql,Object...params){try {//1.獲取連接Connection connection = JDBCUtilsByDruid.getConnection();//2.執(zhí)行sql語句PreparedStatement statement = connection.prepareStatement(sql);for (int i = 0; i < params.length; i++) {statement.setObject(i+1, params[i]);}int update = statement.executeUpdate();return update;} catch (Exception e) {throw new RuntimeException(e);}}/*** orm:object relation mapping* @param sql* @param params* @return* * 只針對Boys表,查詢單條* @throws Exception */public static Boys querySingle(String sql,Object...params) throws Exception{Connection connection=null;PreparedStatement statement=null;ResultSet set = null;try {//1.獲取連接connection = JDBCUtilsByDruid.getConnection();//2.執(zhí)行查詢statement = connection.prepareStatement(sql);for (int i = 0; i < params.length; i++) {statement.setObject(i+1, params[i]);}set = statement.executeQuery();if(set.next()){int id = set.getInt("id");String boyName = set.getString("boyname");int userCP = set.getInt("userCP");Boys bo = new Boys(id,boyName,userCP);return bo;}return null;} catch (Exception e) {throw new RuntimeException(e);}finally{JDBCUtilsByDruid.close(set, statement, connection);}}/*** orm:object relation mapping* @param sql* @param params* @return* * 只針對Boys表,查詢多條* @throws Exception */public static List<Boys> queryMulti(String sql,Object...params) throws Exception{Connection connection=null;PreparedStatement statement=null;ResultSet set = null;try {//1.獲取連接connection = JDBCUtilsByDruid.getConnection();//2.執(zhí)行查詢statement = connection.prepareStatement(sql);for (int i = 0; i < params.length; i++) {statement.setObject(i+1, params[i]);}set = statement.executeQuery();List<Boys> list = new ArrayList<>();while(set.next()){int id = set.getInt("id");String boyName = set.getString("boyname");int userCP = set.getInt("userCP");Boys bo = new Boys(id,boyName,userCP);list.add(bo);}return list;} catch (Exception e) {throw new RuntimeException(e);}finally{JDBCUtilsByDruid.close(set, statement, connection);}}}

    boys類👇

    package com.atguigu.bean;public class Boys {private int id;private String boyName;private int userCP;public Boys() {super();}@Overridepublic String toString() {return "Boys [id=" + id + ", boyName=" + boyName + ", userCP=" + userCP + "]";}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getBoyName() {return boyName;}public void setBoyName(String boyName) {this.boyName = boyName;}public int getUserCP() {return userCP;}public void setUserCP(int userCP) {this.userCP = userCP;}public Boys(int id, String boyName, int userCP) {super();this.id = id;this.boyName = boyName;this.userCP = userCP;}}

    👇調(diào)用實例

    package com.atguigu.utils;import java.util.List;import org.junit.Test;import com.atguigu.bean.Boys;public class TestCRUDUtils {@Testpublic void testUpdate(){// int update = CRUDUtils.update("update beauty set sex = ? where name='柳巖'", "男"); // // System.out.println(update>0?"success":"failure");int update = CRUDUtils.update("delete from admin where id>5");System.out.println(update>0?"success":"failure");}@Testpublic void testQuery() throws Exception{ // Boys boy = CRUDUtils.querySingle("select * from boys where id = ?", 2); // System.out.println(boy);List<Boys> list = CRUDUtils.queryMulti("select * from boys");for (Boys boys : list) {System.out.println(boys);}}}

    8 DBUtils

    commons-dbutils是 Apache 組織提供的一個開源 JDBC工具類庫,它是對JDBC的簡單封裝,學習成本極低,并且使用dbutils能極大簡化jdbc編碼的工作量,同時也不會影響程序的性能。
    1、DbUtils類
    DbUtils :提供如關閉連接、裝載JDBC驅(qū)動程序等常規(guī)工作的工具類,里面的所有方法都是靜態(tài)的。主要方法如下:

    • public static void close(…) throws java.sql.SQLException: DbUtils類提供了三個重載的關閉方法。這些方法檢查所提供的參數(shù)是不是NULL,如果不是的話,它們就關閉Connection、Statement和ResultSet。
    • public static void closeQuietly(…): 這一類方法不僅能在Connection、Statement和ResultSet為NULL情況下避免關閉,還能隱藏一些在程序中拋出的SQLEeception。
    • public static void commitAndClose(Connection conn)throws SQLException 用來提交連接的事務,然后關閉連接
    • public static void commitAndCloseQuietly(Connection conn): 用來提交連接的事務,然后關閉連接,并且在關閉連接時不拋出SQL異常。
    • public static void rollback(Connection conn)throws SQLException允許conn為null,因為方法內(nèi)部做了判斷
    • public static void rollbackAndClose(Connection conn)throws SQLException
    • rollbackAndCloseQuietly(Connection)
    • public static boolean loadDriver(java.lang.String driverClassName):這一方裝載并注冊JDBC驅(qū)動程序,如果成功就返回true。使用該方法,你不需要捕捉這個異常ClassNotFoundException。

    2、QueryRunner類
    該類封裝了SQL的執(zhí)行,是線程安全的。
    (1)可以實現(xiàn)增、刪、改、查、批處理、
    (2)考慮了事務處理需要共用Connection。
    (3)該類最主要的就是簡單化了SQL查詢,它與ResultSetHandler組合在一起使用可以完成大部分的數(shù)據(jù)庫操作,能夠大大減少編碼量。
    QueryRunner類提供了兩個構造方法:

    • QueryRunner():默認的構造方法
    • QueryRunner(DataSource ds):需要一個 javax.sql.DataSource 來作參數(shù)的構造方法。
      (1)更新
    • public int update(Connection conn, String sql, Object… params) throws SQLException:用來執(zhí)行一個更新(插入、更新或刪除)操作。
      (2)插入
    • public T insert(Connection conn,String sql,ResultSetHandler rsh, Object… params) throws SQLException:只支持INSERT語句,其中 rsh - The handler used to create the result object from the ResultSet of auto-generated keys. 返回值: An object generated by the handler.即自動生成的鍵值
      (3)批處理
    • public int[] batch(Connection conn,String sql,Object[][] params)throws SQLException: INSERT, UPDATE, or DELETE語句
    • public T insertBatch(Connection conn,String sql,ResultSetHandler rsh,Object[][] params)throws SQLException:只支持INSERT語句
      (4)使用QueryRunner類實現(xiàn)查詢
    • public Object query(Connection conn, String sql, ResultSetHandler rsh,Object… params) throws SQLException:執(zhí)行一個查詢操作,在這個查詢中,對象數(shù)組中的每個元素值被用來作為查詢語句的置換參數(shù)。該方法會自行處理 PreparedStatement 和 ResultSet 的創(chuàng)建和關閉。
      3、ResultSetHandler接口
      該接口用于處理 java.sql.ResultSet,將數(shù)據(jù)按要求轉(zhuǎn)換為另一種形式。ResultSetHandler 接口提供了一個單獨的方法:Object handle (java.sql.ResultSet rs)該方法的返回值將作為QueryRunner類的query()方法的返回值。
      該接口有如下實現(xiàn)類可以使用:
    • ArrayHandler:把結(jié)果集中的第一行數(shù)據(jù)轉(zhuǎn)成對象數(shù)組。
    • ArrayListHandler:把結(jié)果集中的每一行數(shù)據(jù)都轉(zhuǎn)成一個數(shù)組,再存放到List中。
    • BeanHandler:將結(jié)果集中的第一行數(shù)據(jù)封裝到一個對應的JavaBean實例中。
    • BeanListHandler:將結(jié)果集中的每一行數(shù)據(jù)都封裝到一個對應的JavaBean實例中,存放到List里。
    • ColumnListHandler:將結(jié)果集中某一列的數(shù)據(jù)存放到List中。
    • KeyedHandler(name):將結(jié)果集中的每一行數(shù)據(jù)都封裝到一個Map里,再把這些map再存到一個map里,其key為指定的key。
    • MapHandler:將結(jié)果集中的第一行數(shù)據(jù)封裝到一個Map里,key是列名,value就是對應的值。
    • MapListHandler:將結(jié)果集中的每一行數(shù)據(jù)都封裝到一個Map里,然后再存放到List
      4、表與JavaBean

      👇舉例代碼
    package com.atguigu.jdbc4;import java.sql.Connection; import java.util.List;import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler; import org.junit.Test;import com.atguigu.utils.Admin; import com.atguigu.utils.Boys; import com.atguigu.utils.JDBCUtilsByDruid;/*** 此類用于演示DBUtils的使用* @author liyuting* 功能:封裝了和數(shù)據(jù)庫存取相關的一些方法* 通用的增刪改查等等* * QueryRunner類:* update(connection,sql,params):執(zhí)行任何增刪改語句* query(connection,sql,ResultSetHandler,params):執(zhí)行任何查詢語句* ResultSetHandler接口* BeanHandler:將結(jié)果集的第一行,封裝成對象,并返回 new BeanHandler<>(XX.class)* BeanListHandler:將結(jié)果集中的所有行,封裝成對象的集合,并返回 new BeanListHandler<>(XX.class)* ScalarHandler:將結(jié)果集中的第一行第一列,以Object形式返回 new ScalarHandler()* * * 使用步驟:* * 1、導入jar包commons-dbutils-1.3.jar* 2、看幫助* 3、使用**/ public class TestDBUtils {@Testpublic void testUpadte() throws Exception{//1.獲取連接Connection connection = JDBCUtilsByDruid.getConnection();//2.執(zhí)行增刪改QueryRunner qr = new QueryRunner();int update = qr.update(connection, "update boys set boyname=? where id=4", "慕容復");System.out.println(update>0?"success":"failure");//3.關閉連接JDBCUtilsByDruid.close(null, null, connection);}@Testpublic void testQuerySingle() throws Exception{//1.獲取連接Connection connection = JDBCUtilsByDruid.getConnection();//2.執(zhí)行增刪改QueryRunner qr = new QueryRunner();// Admin admin = qr.query(connection, "select * from admin where id=?", new BeanHandler<>(Admin.class),3); // System.out.println(admin);Boys boys = qr.query(connection, "select * from boys where usercp=?", new BeanHandler<>(Boys.class),300);System.out.println(boys);//3.關閉連接JDBCUtilsByDruid.close(null, null, connection);}@Testpublic void testQueryMulti() throws Exception{//1.獲取連接Connection connection = JDBCUtilsByDruid.getConnection();//2.執(zhí)行增刪改QueryRunner qr = new QueryRunner();// Admin admin = qr.query(connection, "select * from admin where id=?", new BeanHandler<>(Admin.class),3); // System.out.println(admin);List<Admin> list2 = qr.query(connection, "select * from admin", new BeanListHandler<>(Admin.class));for (Admin admin : list2) {System.out.println(admin);} // // List<Boys> list = qr.query(connection, "select * from boys where usercp>?", new BeanListHandler<>(Boys.class),10); // // for (Boys boys : list) { // System.out.println(boys); // }//3.關閉連接JDBCUtilsByDruid.close(null, null, connection);}@Testpublic void testScalar() throws Exception{//1.獲取連接Connection connection = JDBCUtilsByDruid.getConnection();//2.執(zhí)行查詢單個值QueryRunner qr = new QueryRunner();Object query = qr.query(connection, "select * from admin", new ScalarHandler());System.out.println(query);//3.關閉JDBCUtilsByDruid.close(null, null, connection);}}

    9 DAO和增刪改查通用方法

    DAO:Data Access Object訪問數(shù)據(jù)信息的類和接口,包括了對數(shù)據(jù)的CRUD(Create、Retrival、Update、Delete),而不包含任何業(yè)務相關的信息
    作用:為了實現(xiàn)功能的模塊化,更有利于代碼的維護和升級。

    import java.sql.Connection; import java.sql.SQLException; import java.util.List;import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.apache.commons.dbutils.handlers.ScalarHandler;import com.atguigu.utils.JDBCUtilsByDruid;public class BasicDao<T> {QueryRunner qr = new QueryRunner();/** 功能: 通用的增刪改方法,針對于任何表*/public int update(String sql,Object...param){Connection connection = null;try {connection = JDBCUtilsByDruid.getConnection();int update = qr.update(connection, sql, param);return update;} catch (Exception e) {throw new RuntimeException(e);}finally{JDBCUtilsByDruid.close(null, null, connection);}}/*** 功能:返回單個對象,針對于任何表* @param sql* @param clazz* @param params* @return*/public T querySingle(String sql,Class<T> clazz,Object...params){Connection connection = null;try {connection = JDBCUtilsByDruid.getConnection();//執(zhí)行查詢return qr.query(connection, sql, new BeanHandler<T>(clazz), params);} catch (Exception e) {throw new RuntimeException(e);}finally{JDBCUtilsByDruid.close(null, null, connection);}}/*** 功能:返回多個對象,針對于任何表* @param sql* @param clazz* @param params* @return*/public List<T> queryMulti(String sql,Class<T> clazz,Object...params){Connection connection = null;try {connection = JDBCUtilsByDruid.getConnection();//執(zhí)行查詢return qr.query(connection, sql, new BeanListHandler<T>(clazz), params);} catch (Exception e) {throw new RuntimeException(e);}finally{JDBCUtilsByDruid.close(null, null, connection);}}/*** 功能:返回單個值* @param sql* @param params* @return*/public Object scalar(String sql,Object...params){Connection connection = null;try {connection = JDBCUtilsByDruid.getConnection();//執(zhí)行查詢return qr.query(connection, sql, new ScalarHandler(),params);} catch (Exception e) {throw new RuntimeException(e);}finally{JDBCUtilsByDruid.close(null, null, connection);}}}

    👆只是基礎的增刪查改,適合于任何的類,還需要對每一張表定義一個實體類,然后用不同的類DAO繼承basicdao

    比如說adminDAO,Admin指定了泛型

    package com.atguigu.dao;import com.atguigu.bean.Admin;public class AdminDao extends BasicDao<Admin> { }

    然后再AdminService里面

    package com.atguigu.service;import com.atguigu.dao.AdminDao;public class AdminService {AdminDao dao = new AdminDao();public boolean login(String username,String password){Long count = (Long)dao.scalar("select count(*) from admin where username=? and password=?", username,password);return count>0;}}

    👇最后再在view層調(diào)用

    package com.atguigu.view;import java.util.Scanner;import com.atguigu.service.AdminService;public class StudentView {AdminService as = new AdminService();public static void main(String[] args) {new StudentView().login();}public void login(){Scanner input = new Scanner(System.in);System.out.println("請輸入用戶名:");String username = input.next();System.out.println("請輸入密碼:");String password = input.next();if( as.login(username, password)){System.out.println("登錄成功!");showMainMenu();}else{System.out.println("登錄失敗!");}}/*** 功能:顯示主菜單*/private void showMainMenu() {System.out.println("顯示主菜單");} }

    總結(jié)

    以上是生活随笔為你收集整理的JDBC入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    亚洲综合精品在线 | 亚洲成人免费观看 | 亚洲国产精品va在线看黑人动漫 | 午夜精品视频福利 | 草久电影| 久久国产免费视频 | www.激情五月.com | 国产精品综合在线观看 | 97热久久免费频精品99 | 国产在线91在线电影 | 亚洲成a人片在线观看网站口工 | 国产精品毛片久久久久久久 | 五月婷婷欧美视频 | 国产中文视频 | a视频在线| 免费欧美高清视频 | 亚洲91中文字幕无线码三区 | 免费看搞黄视频网站 | 国产精品白丝jk白祙 | 99在线看 | 精品国产乱码久久久久久1区二区 | 国产一区播放 | 在线观看免费黄色 | 天天操天天爽天天干 | 亚洲aⅴ免费在线观看 | 99久久夜色精品国产亚洲 | 精品久久久免费 | 亚洲三级av | 激情网综合 | 蜜臀av夜夜澡人人爽人人桃色 | 国产激情电影综合在线看 | 91欧美精品 | 欧美久久久久久久久久久 | 91麻豆精品国产自产 | 国产亚洲精品久久 | 亚洲一级黄色片 | 2024av在线播放| 777久久久 | 黄色精品久久久 | 亚洲亚洲精品在线观看 | 亚洲午夜久久久久久久久 | 久久久久久久久久久久久久av | 91香蕉国产 | 婷久久 | 成人午夜黄色影院 | 99热精品国产一区二区在线观看 | 一二区电影 | 精品一二三四五区 | 亚洲国产精品推荐 | 91天天操| 国产丝袜| 欧美精品一区二区免费 | 国产精品色在线 | 亚洲 中文字幕av | 国产精品女主播一区二区三区 | 91精品啪在线观看国产线免费 | 综合中文字幕 | 欧美激情精品久久久久久免费印度 | 久久精品www人人爽人人 | 麻豆精品在线视频 | 久久a v视频 | 成年人在线电影 | 成人免费视频视频在线观看 免费 | 2024国产精品视频 | 亚洲免费一级 | 日韩精品一区在线播放 | 日本中文字幕电影在线免费观看 | 深爱激情五月婷婷 | 二区精品视频 | ,久久福利影视 | 欧美男同网站 | 欧美日韩精品在线播放 | 美女精品久久久 | av线上看 | 国产精品乱码久久久久 | 黄色一级在线免费观看 | 久草在线资源免费 | 亚洲人在线视频 | 欧美日韩xxx | 99热免费在线 | 4438全国亚洲精品观看视频 | 麻豆你懂的 | 日韩欧美视频免费看 | 热99在线视频 | 最近高清中文在线字幕在线观看 | 精品久久久久一区二区国产 | 日韩在线观看电影 | 99热最新地址 | 婷婷丁香狠狠爱 | 三上悠亚一区二区在线观看 | 五月开心六月伊人色婷婷 | 国内精品久久久久影院男同志 | 91精品国产91 | 超碰97国产在线 | 91视频 - 114av | av一级二级 | 精品亚洲在线 | 97福利| 日韩免费网址 | 国产麻豆剧果冻传媒视频播放量 | 天天做天天爱夜夜爽 | 欧美一区二区三区激情视频 | 激情大尺度视频 | 日韩免费在线 | 天天在线视频色 | 日韩综合一区二区 | 日韩精品一区不卡 | 国产精品一区二区白浆 | 国产一二区视频 | 午夜国产影院 | 国产一级电影 | 亚一亚二国产专区 | 狠狠操狠狠干2017 | 婷婷色资源 | 在线观看免费一级片 | 狠狠色丁香婷婷综合橹88 | 国产精品久久久久久久久免费 | 久久久五月婷婷 | 国产精品一区二区你懂的 | 中文字幕在线网 | av在线看片 | 日韩手机视频 | 国产精品区在线观看 | 日韩欧美视频在线观看免费 | 成人h在线观看 | 天天艹日日干 | 亚洲自拍自偷 | 一区二区三区免费网站 | 国产精品一区二区三区99 | 91喷水 | 西西4444www大胆无视频 | 中文字幕在线观看一区二区 | 激情片av| 亚洲一二区视频 | 免费看片网页 | 五月天婷婷狠狠 | 91av在线电影 | 手机在线观看国产精品 | 久久免费高清视频 | 日韩欧美xxxx | 国产一区精品在线 | 欧美亚洲精品在线观看 | 日日夜夜综合 | 欧美日韩不卡在线视频 | 亚洲国产午夜精品 | 在线免费观看视频一区 | 国产精品一区免费看8c0m | 色综合国产 | 热re99久久精品国产66热 | 成人免费视频播放 | 亚洲最新在线 | 国产精品大全 | 91网站免费观看 | 国产亚洲视频在线 | 欧美日韩免费观看一区=区三区 | 免费久久网 | 一本到视频在线观看 | 亚洲天堂精品视频 | 久久精品99 | 亚洲 成人 一区 | 日韩中文字幕免费视频 | 啪啪动态视频 | 亚洲精品视频国产 | 在线亚洲日本 | 亚洲伦理中文字幕 | 中文字幕 在线看 | 久久美女视频 | 亚洲涩涩涩涩涩涩 | 欧美日韩不卡在线视频 | 成人黄色大片在线观看 | 久久精品电影网 | 日本公妇在线观看 | 久草在线这里只有精品 | 五月婷视频 | 国产精品美女久久久 | 在线看一区 | 日日夜夜综合 | 中文字幕一区av | 免费观看一级一片 | 亚洲精品字幕在线观看 | 黄污网站在线 | 韩国在线视频一区 | 99久久精品国产一区二区成人 | 日韩免费不卡av | 久久女同性恋中文字幕 | 亚洲精品一区二区三区在线观看 | 免费成人av在线 | 91精品久久久久久久99蜜桃 | 人人澡超碰碰97碰碰碰软件 | 亚洲激情 欧美激情 | 国产成人免费av电影 | 久久久噜噜噜久久久 | www.eeuss影院av撸 | 天天躁日日躁狠狠 | 免费看片亚洲 | 狠狠躁18三区二区一区ai明星 | 欧美日韩一区二区在线观看 | 人人狠狠综合久久亚洲 | 亚洲欧美视频在线 | 欧美精品国产综合久久 | av+在线播放在线播放 | 毛片网在线观看 | 色久综合 | 久久亚洲热 | 在线观看日韩免费视频 | 九七人人干 | 最近中文国产在线视频 | 国产精品大片 | 欧美另类交人妖 | 四虎免费av | 欧洲精品一区二区 | 国产精品美女在线 | 国产精品99久久久精品免费观看 | 国产最顶级的黄色片在线免费观看 | 99久久精品网| 日韩毛片在线播放 | 久久国精品 | 99热国产精品 | 亚洲精品欧美视频 | www日韩| 欧洲一区二区在线观看 | 久九视频 | 免费视频91 | 亚洲三级在线播放 | 伊人成人激情 | 亚洲视频一 | 免费一级片在线观看 | www免费| 国产成人一区二区三区在线观看 | 视频在线观看国产 | japanese黑人亚洲人4k | 午夜久久成人 | 日韩电影在线观看中文字幕 | 天天射天天艹 | 日本久久影视 | 亚洲综合五月 | 日韩欧美在线免费 | 久久久久久久久久网 | 国产一区二三区好的 | 丝袜美腿亚洲综合 | 欧美日韩亚洲第一页 | 97在线影院 | 亚洲无吗视频在线 | 在线国产中文字幕 | 国内成人精品2018免费看 | 中文字幕在线免费看线人 | 久久不射影院 | 91在线视频 | 国产无限资源在线观看 | 操操操影院 | 亚洲91精品在线观看 | 日韩一区二区三区高清在线观看 | 不卡av在线免费观看 | 久久综合一本 | 国产在线高清 | 99久久国产免费免费 | 天天做天天爱天天综合网 | 国产小视频福利在线 | 国产精品三级视频 | 中文字幕影片免费在线观看 | 国产色秀视频 | 91亚洲国产成人久久精品网站 | 一本一本久久a久久 | 天天艹天天爽 | 日韩欧美一二三 | 国产亚洲久一区二区 | 免费成人在线网站 | 偷拍精偷拍精品欧洲亚洲网站 | 国产资源在线视频 | 免费的黄色av | 久久爱资源网 | 欧美一级片免费播放 | 欧美视频www | 911av视频 | 国产精品久久久久国产精品日日 | 久久久久久久久久久综合 | 天天草夜夜| 欧美激情在线网站 | 日韩sese| 久久色亚洲 | bbbb操bbbb | 在线观看视频国产一区 | 欧美久久久久久久久久久久久 | 成人在线电影观看 | 干干干操操操 | 超碰97免费观看 | 精品一区二区三区电影 | 精品视频不卡 | 国产在线播放一区二区三区 | 亚洲日本中文字幕在线观看 | 久久综合婷婷国产二区高清 | 国产高清无线码2021 | 亚洲精品中文在线观看 | 91香蕉视频在线 | 久久久久二区 | 亚洲国产成人久久综合 | 日韩亚洲国产中文字幕 | 国产视| 午夜精品三区 | 国产中文在线观看 | 人人看看人人 | 久久69av| 久久观看最新视频 | 五月激情婷婷丁香 | 973理论片235影院9 | 人人爱在线视频 | 国产精品第二页 | 丁香六月网 | 麻豆视频91 | www最近高清中文国语在线观看 | 婷婷在线精品视频 | 国产国语在线 | 91桃花视频 | 欧美一区二区三区激情视频 | 日本少妇高清做爰视频 | 婷婷激情站 | 亚洲视频网站在线观看 | 97精品电影院 | 狠狠干美女 | 中文字幕精品一区 | 黄色大全免费观看 | 在线观看黄色小视频 | 高清国产午夜精品久久久久久 | 在线韩国电影免费观影完整版 | 欧美精品免费一区二区 | 黄色毛片在线 | 久久久久国产精品视频 | 日韩理论片在线 | 婷婷亚洲综合 | 久久av网 | 国产亚洲午夜高清国产拍精品 | 久久久精品免费观看 | 又黄又爽又色无遮挡免费 | 免费日韩 精品中文字幕视频在线 | 麻豆视频www| 在线观看91精品国产网站 | 热久久视久久精品18亚洲精品 | 国产一级片直播 | 久久久久女人精品毛片九一 | 久久九九免费视频 | 久久精品久久久精品美女 | 日韩高清在线观看 | 999在线精品 | 在线观看中文字幕dvd播放 | 亚洲精品视频在线免费 | 久久99这里只有精品 | 国产综合小视频 | 中文字幕欧美激情 | 91视频这里只有精品 | 亚洲精品国产免费 | 成人av影视| av女优中文字幕在线观看 | 亚洲一区二区三区miaa149 | 99久久综合狠狠综合久久 | a天堂中文在线 | 成人av电影免费在线播放 | 国产中文欧美日韩在线 | 亚洲免费成人av电影 | 最新av在线网站 | 亚洲综合色丁香婷婷六月图片 | 久久天天躁 | 午夜免费视频网站 | 蜜臀av麻豆 | 国产成人性色生活片 | 成人免费视频观看 | 视频二区在线 | 国产精品一区二 | 亚洲天堂激情 | 日韩高清精品免费观看 | 亚洲经典中文字幕 | av成年人电影 | 国产丝袜| 热久久视久久精品18亚洲精品 | 国产精品一区二区美女视频免费看 | 国产日本在线播放 | 亚洲国产欧美一区二区三区丁香婷 | 日本久久精品 | 免费合欢视频成人app | 久久久99国产精品免费 | 又爽又黄在线观看 | 日韩精品欧美专区 | 欧美人人爱 | 福利一区二区三区四区 | 亚洲黄色片一级 | 日本中文字幕视频 | 福利视频网址 | 人人澡人人添人人爽一区二区 | 午夜在线国产 | 日韩毛片在线免费观看 | 黄色大全视频 | 欧美亚洲精品在线观看 | 在线观看岛国片 | 91精品欧美一区二区三区 | 在线观看国产麻豆 | 91夜夜夜 | 婷五月天激情 | 欧美男女爱爱视频 | 天天操夜夜逼 | 久久精品79国产精品 | 精品主播网红福利资源观看 | 中文字幕乱偷在线 | www色网站| 免费日韩高清 | 丁香在线观看完整电影视频 | 欧美精品一区二区三区四区在线 | 亚洲精品中文字幕视频 | www.狠狠色.com | 在线看欧美 | av电影中文 | 夜夜夜夜操 | 免费观看丰满少妇做爰 | 欧美精品天堂 | 亚洲精品美女免费 | 五月丁色 | 中文资源在线观看 | 天天射天天干天天操 | 最新av网站在线观看 | 久久视频在线 | 中文理论片 | 日韩影片在线观看 | 久久另类小说 | 精品在线看 | av黄网站 | 黄色视屏免费在线观看 | 国产二区av | 看av免费 | 在线免费观看黄色 | 99色资源 | 欧美在线观看视频免费 | 成人久久网 | 欧美综合在线视频 | 日韩网站视频 | 丝袜少妇在线 | 久久黄色成人 | 国产精品视频免费 | 亚洲闷骚少妇在线观看网站 | 国产在线91精品 | 四虎在线观看视频 | 欧美精品一区二区免费 | 国产成人一区二区三区电影 | 美女黄网站视频免费 | 欧美激情视频一区二区三区免费 | 一区二区三区四区免费视频 | 亚洲清纯国产 | 国产又粗又猛又黄又爽视频 | 国产精品久久久久久欧美 | 久久久久电影 | 国产精品 国内视频 | 人人搞人人爽 | 91精品久久久久久综合五月天 | 国产精品国产三级国产 | 日日麻批40分钟视频免费观看 | 日日夜夜综合 | 久草国产精品 | 亚洲午夜精品久久久久久久久久久久 | 国色天香av| 国产福利在线免费观看 | 国产成人精品aaa | 国产午夜亚洲精品 | 人人射人人射 | 国产字幕在线看 | 91亚洲精品国产 | 六月丁香在线视频 | 超碰最新网址 | 成人av av在线 | 91av免费观看 | 激情 一区二区 | 国产又粗又硬又爽视频 | 九九热视频在线播放 | 久日精品 | 91精品国产综合久久福利不卡 | 在线观看成人一级片 | av片一区二区 | 黄色免费网站大全 | 国产在线色站 | 国产免码va在线观看免费 | 国产人免费人成免费视频 | 久久久精品久久日韩一区综合 | a级一a一级在线观看 | 色综合久久88色综合天天人守婷 | 国产麻豆精品在线观看 | av片在线观看免费 | 欧美三人交| 久久99久国产精品黄毛片入口 | 亚洲h在线播放在线观看h | 久久综合色8888| 中文字幕第一页av | 国产在线观看99 | 在线91观看 | a在线免费 | 午夜美女视频 | av电影免费看 | 久久99亚洲精品久久 | 免费麻豆 | 亚洲欧美日本国产 | 国产精品18久久久久久久久 | 欧美日韩三级在线观看 | 黄色毛片观看 | 久久精品免视看 | 黄色a大片| 黄污污网站| 国产精品专区在线观看 | 国产高清视频在线观看 | 国模精品一区二区三区 | 日韩精品中文字幕在线观看 | 十八岁以下禁止观看的1000个网站 | 91精品国产高清 | 51久久成人国产精品麻豆 | 色婷婷婷 | 亚洲国产精品激情在线观看 | 免费色婷婷 | 久草视频手机在线 | 少妇性bbb搡bbb爽爽爽欧美 | 成人欧美在线 | 色香网 | 国产福利久久 | 三级毛片视频 | 日韩久久精品一区二区 | 狠狠的操| 色小说在线 | 日韩欧美视频在线免费观看 | 婷婷激情小说网 | 日韩中字在线观看 | 国产九九九精品视频 | 丁香五月亚洲综合在线 | 五月天久久综合 | 中文亚洲欧美日韩 | 精品久久久久久久久久久久 | 97国产在线 | 一级α片 | 九草视频在线观看 | 午夜美女福利直播 | 2021国产视频 | 天天看天天操 | 久久99久久99免费视频 | 午夜影院日本 | 国产精品99久久久久的智能播放 | 在线欧美最极品的av | 亚洲一级二级三级 | 欧美有色 | 一区二区三区观看 | 国产成人久久久77777 | 天天看天天操 | 亚洲闷骚少妇在线观看网站 | 一级成人在线 | 精品久久片 | 中文字幕永久在线 | 久久综合福利 | 久久手机免费视频 | 精品免费观看 | 91九色视频在线播放 | 日一日操一操 | 网站你懂的| 欧美日韩久久不卡 | 91成人久久 | 在线亚洲成人 | 人人艹人人 | 亚洲涩综合| 国产精品国产亚洲精品看不卡15 | 激情导航 | 黄污视频网站大全 | 精品福利视频在线 | 三级黄色免费 | 又黄又爽又湿又无遮挡的在线视频 | 日韩av中文| 久久综合色天天久久综合图片 | 天天插天天爱 | 国产剧情一区在线 | 成人h动漫在线看 | 国产91av视频在线观看 | 狠狠久久 | 日韩在线免费不卡 | 九九一级片 | 国产五月天婷婷 | av黄网站 | 亚洲电影第一页av | 久久久一本精品99久久精品 | 999久久久久久久久6666 | 91精彩视频 | 一级黄色片在线播放 | 精品国产一区二区三区久久久 | 免费黄a| 久久精品网址 | 久久免费在线观看视频 | 波多野结衣一区二区三区中文字幕 | 日本精油按摩3 | 欧美亚洲成人免费 | 2023国产精品自产拍在线观看 | 日本h视频在线观看 | 欧美日视频 | 久久天天躁夜夜躁狠狠85麻豆 | 免费h精品视频在线播放 | 97视频在线播放 | 日本久久中文字幕 | 日本美女xx | 美女网站在线观看 | 曰韩精品 | 91在线精品观看 | 日韩av高清| 9在线观看免费高清完整版在线观看明 | 中国成人一区 | 在线观看亚洲成人 | 日本高清dvd | 国产视频一区二区在线观看 | 免费福利在线观看 | 国产亚洲精品久久久久久 | 亚洲天天综合网 | 免费91麻豆精品国产自产在线观看 | 日韩av资源站| 久久国内精品 | 国产成免费视频 | 91成人精品视频 | 成人动漫视频在线 | 国产视频久久久 | 97在线资源| 91精品综合| 精品产品国产在线不卡 | www.亚洲视频| 99热在 | 亚洲男男gⅴgay双龙 | 久久久久99精品成人片三人毛片 | 中文字幕av免费在线观看 | 亚洲久草网 | 久热色超碰| 1024在线看片 | 99精品国产在热久久下载 | 久久久久久久久久网站 | 久久综合色8888 | 973理论片235影院9 | 欧美日韩首页 | 国产黄色片久久久 | 九九热视频在线免费观看 | 亚州成人av在线 | 中文字幕国产精品 | 国产在线 一区二区三区 | 在线观看网站你懂的 | 黄色av网站在线观看免费 | 久久亚洲免费 | 91视频在线免费看 | 国产无区一区二区三麻豆 | 国内精品久久久久久久97牛牛 | 久久久久久久久久伊人 | 日韩av影视 | www久久久| 亚洲国产精品视频在线观看 | 91在线观看高清 | 国产视频精品网 | 日韩精品第一区 | 国产中文字幕一区二区 | 天天干天天干天天射 | av女优中文字幕在线观看 | 久久久久久国产精品亚洲78 | 色婷婷www| 99日精品 | 99在线观看精品 | 日本中文一区二区 | 日韩精品无码一区二区三区 | 九九热免费视频在线观看 | 亚洲日本一区二区在线 | 国产精品综合av一区二区国产馆 | 91大神dom调教在线观看 | 国产精品成人久久久 | 婷婷香蕉 | 久草在线免费新视频 | 免费视频资源 | 婷婷免费在线视频 | 国产热re99久久6国产精品 | 日韩激情视频在线观看 | 成人国产精品免费观看 | 亚洲精品三级 | 国产精品黄网站在线观看 | 日韩资源视频 | 欧美激情精品久久久久久免费 | 中文字幕区 | 国产小视频免费观看 | 国产精品一区二区三区在线免费观看 | 久久在线免费观看 | av在线电影免费观看 | 日韩视频免费观看高清完整版在线 | 久精品视频在线观看 | 丝袜美腿av | 777奇米四色 | bbbbb女女女女女bbbbb国产 | 亚州av一区| 日韩mv欧美mv国产精品 | 日韩欧美国产视频 | 国产理论在线 | 国产精品国产亚洲精品看不卡15 | 91在线最新| 日本一区二区不卡高清 | 国产一区在线视频 | 黄色av电影| 韩国av不卡 | 成人精品一区二区三区中文字幕 | 国产黄免费在线观看 | 麻豆国产精品永久免费视频 | 免费观看www7722午夜电影 | 8x8x在线观看视频 | 国产精品久久久久久久久久久久冷 | 日韩欧美一区二区三区在线观看 | 色婷婷综合成人av | 国产成人久久精品一区二区三区 | 日韩视频一区二区在线观看 | 激情影音先锋 | 91亚洲国产成人久久精品网站 | 国产精品第一页在线观看 | av一区二区三区在线播放 | 天天操天天能 | 91麻豆精品国产自产 | 日韩精品久久久久久中文字幕8 | 亚洲成成品网站 | 久久久www成人免费精品张筱雨 | 欧美国产高清 | 国内免费久久久久久久久久久 | 久久视精品 | 国产免费嫩草影院 | 在线黄色av电影 | 中文免费观看 | 丁香影院在线 | 日韩成人精品一区二区三区 | 久久精品第一页 | 91夫妻视频| 日韩在线三级 | 国产精品系列在线 | 亚洲精品理论片 | 精品国产亚洲日本 | 色婷婷av在线 | 又爽又黄又刺激的视频 | 日韩av电影手机在线观看 | 亚洲国产中文字幕 | 婷婷成人亚洲综合国产xv88 | 狠狠干婷婷 | 中文字幕人成一区 | 亚洲 综合 激情 | 亚洲影院天堂 | 成人黄色电影在线播放 | 久久久久国产精品一区 | 狠狠色丁香久久婷婷综合丁香 | 91亚洲精品乱码久久久久久蜜桃 | 最新av在线播放 | 在线播放国产精品 | 精品国产日本 | 国产精品资源在线 | 美女国内精品自产拍在线播放 | av中文电影 | 久久久免费精品视频 | 成人免费一级片 | avcom在线| 91麻豆网站| 国产精品18久久久久久久久久久久 | 日韩一区二区三区免费电影 | 亚洲成a人片77777kkkk1在线观看 | 在线免费观看黄 | 日韩精品中文字幕久久臀 | 丁香六月av | 2018好看的中文在线观看 | 激情综合亚洲精品 | 日韩国产欧美视频 | 爱色婷婷 | 久草在线免费在线观看 | 99久久久国产免费 | 特级免费毛片 | 国产一区二区免费在线观看 | 国产精品第三页 | 夜夜操夜夜干 | 91精品啪在线观看国产81旧版 | 亚洲欧洲精品一区 | av永久网址 | 日韩国产高清在线 | 久久免费看 | 香蕉视频在线观看免费 | 天堂av在线网址 | 日韩精品免费专区 | 久久6精品 | 免费av小说 | 日韩免费视频观看 | 久久亚洲影院 | 中文字幕一区二区三区四区在线视频 | 91在线porny国产在线看 | 久久婷婷视频 | 91精品在线免费观看视频 | 韩国视频一区二区三区 | 91看片在线 | 成人超碰97 | 91天天操 | 国产资源精品在线观看 | 国产精品一区二区免费在线观看 | 日韩在线高清免费视频 | 国产69久久久欧美一级 | 久久一区二区三区国产精品 | 成片免费| 免费美女av | www在线观看国产 | 在线观看黄色大片 | 欧美精品久久久久久久久免 | 黄色电影在线免费观看 | 一级免费观看 | 精品国产免费看 | 亚洲欧美乱综合图片区小说区 | 激情五月婷婷激情 | 国产乱对白刺激视频在线观看女王 | 国产精品一区二区62 | 国产丝袜 | 日韩动漫免费观看高清完整版在线观看 | 99综合电影在线视频 | 国内少妇自拍视频一区 | 日本黄色免费播放 | 免费在线一区二区三区 | 在线观看亚洲国产精品 | 极品久久久 | 国产亚洲视频在线免费观看 | 欧美人zozo| 久久99免费观看 | 欧美精品国产综合久久 | 91九色精品女同系列 | 99国产在线视频 | 欧美网站黄色 | 日韩丝袜视频 | 日韩资源在线播放 | 国产美女被啪进深处喷白浆视频 | 少妇bbbb揉bbbb日本 | 久草网在线观看 | 永久免费观看视频 | 久久精品视频网站 | 国产一区免费在线 | 天堂麻豆 | 视频福利在线观看 | 日韩中文字幕国产 | 亚洲mv大片欧洲mv大片免费 | 99精品久久久久久久久久综合 | 亚洲91网站| 久久久国产精品久久久 | 一级久久精品 | www国产亚洲 | av一本久道久久波多野结衣 | 日韩在线观看精品 | 色九九在线 | 丁香 久久 综合 | 国产精品久一 | 成人久久精品视频 | 在线免费视| 91精品免费在线视频 | 久久精品在线 | 亚洲精品午夜国产va久久成人 | 色网站在线看 | 免费精品在线 | 亚洲精品一区二区在线观看 | 久久五月婷婷丁香社区 | 中文字幕在线免费观看视频 | 欧美日产一区 | 一级一片免费观看 | 久久99精品热在线观看 | 欧美成人性网 | 久久亚洲视频 | 日韩女同av | 色网站免费在线观看 | 久久色在线观看 | 六月天综合网 | 日本在线观看视频一区 | 96久久 | 国产精品免费观看国产网曝瓜 | 中文字幕免费一区 | 丝袜美腿亚洲综合 | 久久久高清一区二区三区 | 亚洲精品一区二区18漫画 | 日本99精品 | 久久久久久福利 | av高清网站在线观看 | 久久热亚洲 | 99视频在线免费播放 | 中文字幕视频 | 午夜久久久久久久久久久 | 国产涩涩网站 | 丁香婷五月 | 久久精品波多野结衣 | 二区三区视频 | 久久久久久久久黄色 | 久久久久免费 | 色婷婷激情 | 国产99精品 | www.五月天激情 | 亚洲成人av在线电影 | 97色婷婷成人综合在线观看 | sm免费xx网站 | 国产日本三级 | 午夜视频在线观看一区二区三区 | 久久久精品日本 | 91亚洲精品久久久蜜桃 | av三级av| 91视频在线网址 | 91在线看 | 黄色大片国产 | 久久久久国产精品厨房 | 亚洲最大av在线播放 | 国产精品久久久久久超碰 | 国产精品一区二区久久精品爱微奶 | 欧美淫aaa免费观看 日韩激情免费视频 | 夜色资源站wwwcom | 黄色网址av | 久久人操 | 中文字幕在线专区 | 97人人模人人爽人人少妇 | 最新成人在线 | 国产日本亚洲高清 | 国产精品video爽爽爽爽 | 久久久久久久免费 | 黄色在线观看免费网站 | 日批网站免费观看 | 在线欧美a | 在线观看成人国产 | 9999亚洲 | 成人网大片| 亚洲精品色视频 | 97天天综合网| 色多多污污在线观看 | 人人超碰人人 | 欧美日韩亚洲在线观看 | 日韩一区正在播放 | 久久国产剧场电影 | 九色91av| 国产自产在线视频 | 国产一区二区视频在线播放 | 四虎影视成人精品 | 天天操天天操天天操天天操天天操 | 91视频88av | 黄色av网站在线免费观看 | 日韩大片在线 | 三级黄色在线 | 色视频网站在线观看一=区 a视频免费在线观看 | 精品96久久久久久中文字幕无 | 99国产精品久久久久老师 | 日韩免费观看一区二区三区 | 成人毛片久久 | 午夜久久久影院 | 欧洲精品码一区二区三区免费看 | 国产精品一区二区白浆 | 美女视频黄是免费的 | 国产精品毛片一区二区在线看 | 少妇bbb搡bbbb搡bbbb′ | 欧美精品久久久久久久久老牛影院 | 全久久久久久久久久久电影 | 丁香久久五月 | 97色婷婷人人爽人人 | 青青河边草手机免费 | 成年人免费观看在线视频 | 超碰九九| 亚洲久草在线视频 | 免费看av在线 | 最新中文字幕在线播放 | 亚洲精品国偷自产在线99热 | 国产在线黄 | 成人亚洲精品国产www | 国产91免费看 | 国产成人黄色av | 91视频在线免费看 | 99999精品 | 欧美日本在线观看视频 | 国产精品九九久久久久久久 | 丁香视频全集免费观看 | 天天干天天操天天入 | 五月天天天操 | 国产中文在线观看 | 激情在线网站 | 成人影视片 | 韩国av电影网 | 免费男女羞羞的视频网站中文字幕 | 国产精品一区二区免费视频 | 在线观看av免费 | 国产精品永久久久久久久www | 超碰在线人人97 | 成全在线视频免费观看 | 麻豆免费视频 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 在线免费观看国产黄色 | 国产精品久久视频 | 少妇搡bbbb搡bbb搡忠贞 | 欧美在线一| 成人毛片一区 | 2019国产精品 | 91天天操 | 色丁香婷婷 | 久久久久久久久久福利 | www.夜夜草 | 日p视频 | 欧美日韩1区2区 | 国产精品一区二区在线看 | 日韩网页 | 首页av在线 | 91九色porn在线资源 | 91在线一区| 黄网站app在线观看免费视频 | 欧美成人h版电影 | 黄网站色视频免费观看 | 深爱激情亚洲 | 国产中文字幕av | 国产亚洲视频系列 | 欧美精品久久久久久久久老牛影院 | 久艹视频免费观看 |