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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

day17(JDBC入门jdbcUtils工具介绍)

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

day17

JDBC整體思維導(dǎo)圖

JDBC入門

  • 導(dǎo)jar包:驅(qū)動!
  • 加載驅(qū)動類:Class.forName("類名");
  • 給出url、username、password,其中url背下來!
  • 使用DriverManager類來得到Connection對象!

?

?

?

1 什么是JDBC

  JDBC(Java DataBase Connectivity)就是Java數(shù)據(jù)庫連接,說白了就是用Java語言來操作數(shù)據(jù)庫。原來我們操作數(shù)據(jù)庫是在控制臺使用SQL語句來操作數(shù)據(jù)庫,JDBC是用Java語言向數(shù)據(jù)庫發(fā)送SQL語句。

?

2 JDBC原理

早期SUN公司的天才們想編寫一套可以連接天下所有數(shù)據(jù)庫的API,但是當(dāng)他們剛剛開始時就發(fā)現(xiàn)這是不可完成的任務(wù),因為各個廠商的數(shù)據(jù)庫服務(wù)器差異太大了。后來SUN開始與數(shù)據(jù)庫廠商們討論,最終得出的結(jié)論是,由SUN提供一套訪問數(shù)據(jù)庫的規(guī)范(就是一組接口),并提供連接數(shù)據(jù)庫的協(xié)議標(biāo)準(zhǔn),然后各個數(shù)據(jù)庫廠商會遵循SUN的規(guī)范提供一套訪問自己公司的數(shù)據(jù)庫服務(wù)器的API出現(xiàn)。SUN提供的規(guī)范命名為JDBC,而各個廠商提供的,遵循了JDBC規(guī)范的,可以訪問自己數(shù)據(jù)庫的API被稱之為驅(qū)動!

JDBC是接口,而JDBC驅(qū)動才是接口的實現(xiàn),沒有驅(qū)動無法完成數(shù)據(jù)庫連接!每個數(shù)據(jù)庫廠商都有自己的驅(qū)動,用來連接自己公司的數(shù)據(jù)庫。

當(dāng)然還有第三方公司專門為某一數(shù)據(jù)庫提供驅(qū)動,這樣的驅(qū)動往往不是開源免費的!

?

3 JDBC核心類(接口)介紹

JDBC中的核心類有:DriverManager、Connection、Statement,和ResultSet!

DriverManger(驅(qū)動管理器)的作用有兩個:

  • 注冊驅(qū)動:這可以讓JDBC知道要使用的是哪個驅(qū)動;
  • 獲取Connection:如果可以獲取到Connection,那么說明已經(jīng)與數(shù)據(jù)庫連接上了。

?

Connection對象表示連接,與數(shù)據(jù)庫的通訊都是通過這個對象展開的:

  • Connection最為重要的一個方法就是用來獲取Statement對象;

?

Statement是用來向數(shù)據(jù)庫發(fā)送SQL語句的,這樣數(shù)據(jù)庫就會執(zhí)行發(fā)送過來的SQL語句:

  • void executeUpdate(String sql):執(zhí)行更新操作(insert、update、delete等);
  • ResultSet executeQuery(String sql):執(zhí)行查詢操作,數(shù)據(jù)庫在執(zhí)行查詢后會把查詢結(jié)果,查詢結(jié)果就是ResultSet;

?

ResultSet對象表示查詢結(jié)果集,只有在執(zhí)行查詢操作后才會有結(jié)果集的產(chǎn)生。結(jié)果集是一個二維的表格,有行有列。操作結(jié)果集要學(xué)習(xí)移動ResultSet內(nèi)部的"行光標(biāo)",以及獲取當(dāng)前行上的每一列上的數(shù)據(jù):

  • boolean next():使"行光標(biāo)"移動到下一行,并返回移動后的行是否存在;
  • XXX getXXX(int col):獲取當(dāng)前行指定列上的值,參數(shù)就是列數(shù),列數(shù)從1開始,而不是0。

?

4 Hello JDBC

?

下面開始編寫第一個JDBC程序

4.1 mysql數(shù)據(jù)庫的驅(qū)動jar包:mysql-connector-java-5.1.13-bin.jar;

4.2 獲取連接

獲取連接需要兩步,一是使用DriverManager來注冊驅(qū)動,二是使用DriverManager來獲取Connection對象。

  • 注冊驅(qū)動
  • 看清楚了,注冊驅(qū)動就只有一句話:Class.forName("com.mysql.jdbc.Driver"),下面的內(nèi)容都是對這句代碼的解釋。今后我們的代碼中,與注冊驅(qū)動相關(guān)的代碼只有這一句。

    DriverManager類的registerDriver()方法的參數(shù)是java.sql.Driver,但java.sql.Driver是一個接口,實現(xiàn)類由mysql驅(qū)動來提供,mysql驅(qū)動中的java.sql.Driver接口的實現(xiàn)類為com.mysql.jdbc.Driver!那么注冊驅(qū)動的代碼如下:

    DriverManager.registerDriver(new com.mysql.jdbc.Driver());

    上面代碼雖然可以注冊驅(qū)動,但是出現(xiàn)硬編碼(代碼依賴mysql驅(qū)動jar包),如果將來想連接Oracle數(shù)據(jù)庫,那么必須要修改代碼的。并且其實這種注冊驅(qū)動的方式是注冊了兩次驅(qū)動!

    JDBC中規(guī)定,驅(qū)動類在被加載時,需要自己"主動"把自己注冊到DriverManger中,下面我們來看看com.mysql.jdbc.Driver類的源代碼:

    com.mysql.jdbc.Driver.java

    public class Driver extends NonRegisteringDriver implements java.sql.Driver {

    ????static {

    ????????try {

    ????????????java.sql.DriverManager.registerDriver(new Driver());

    ????????} catch (SQLException E) {

    ????????????throw new RuntimeException("Can't register driver!");

    ????????}

    ????}

    ……

    }

    ?

    com.mysql.jdbc.Driver類中的static塊會創(chuàng)建本類對象,并注冊到DriverManager中。這說明只要去加載com.mysql.jdbc.Driver類,那么就會執(zhí)行這個static塊,從而也就會把com.mysql.jdbc.Driver注冊到DriverManager中,所以可以把注冊驅(qū)動類的代碼修改為加載驅(qū)動類

    Class.forName("com.mysql.jdbc.Driver");

    ?

  • 獲取連接
  • 獲取連接的也只有一句代碼:DriverManager.getConnection(url,username,password),其中username和password是登錄數(shù)據(jù)庫的用戶名和密碼,如果我沒說錯的話,你的mysql數(shù)據(jù)庫的用戶名和密碼分別是:root、123。

    url查對復(fù)雜一點,它是用來找到要連接數(shù)據(jù)庫"網(wǎng)址",就好比你要瀏覽器中查找百度時,也需要提供一個url。下面是mysql的url:

    jdbc:mysql://localhost:3306/mydb1

    JDBC規(guī)定url的格式由三部分組成,每個部分中間使用逗號分隔。

    • 第一部分是jdbc,這是固定的;
    • 第二部分是數(shù)據(jù)庫名稱,那么連接mysql數(shù)據(jù)庫,第二部分當(dāng)然是mysql了;
    • 第三部分是由數(shù)據(jù)庫廠商規(guī)定的,我們需要了解每個數(shù)據(jù)庫廠商的要求,mysql的第三部分分別由數(shù)據(jù)庫服務(wù)器的IP地址(localhost)、端口號(3306),以及DATABASE名稱(mydb1)組成。

       ?

    下面是獲取連接的語句:

    Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb1","root","123");

    ?

    還可以在url中提供參數(shù):

    jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=UTF8

    useUnicode參數(shù)指定這個連接數(shù)據(jù)庫的過程中,使用的字節(jié)集是Unicode字節(jié)集;

    characherEncoding參數(shù)指定穿上連接數(shù)據(jù)庫的過程中,使用的字節(jié)集編碼為UTF-8編碼。請注意,mysql中指定UTF-8編碼是給出的是UTF8,而不是UTF-8。要小心了!

    ?

    4.3 獲取Statement

    在得到Connectoin之后,說明已經(jīng)與數(shù)據(jù)庫連接上了,下面是通過Connection獲取Statement對象的代碼:

    Statement stmt = con.createStatement();

    Statement是用來向數(shù)據(jù)庫發(fā)送要執(zhí)行的SQL語句的!

    4.4 發(fā)送SQL增、刪、改語句

    String sql = "insert into user value('zhangSan', '123')";

    int m = stmt.executeUpdate(sql);

    其中int類型的返回值表示執(zhí)行這條SQL語句所影響的行數(shù),我們知道,對insert來說,最后只能影響一行,而update和delete可能會影響0~n行。

    如果SQL語句執(zhí)行失敗,那么executeUpdate()會拋出一個SQLException。

    4.5 發(fā)送SQL查詢語句

    String sql = "select * from user";

    ResultSet rs = stmt.executeQuery(sql);

    請注意,執(zhí)行查詢使用的不是executeUpdate()方法,而是executeQuery()方法。executeQuery()方法返回的是ResultSet,ResultSet封裝了查詢結(jié)果,我們稱之為結(jié)果集。

    4.6 讀取結(jié)果集中的數(shù)據(jù)

    ResultSet就是一張二維的表格,它內(nèi)部有一個"行光標(biāo)",光標(biāo)默認(rèn)的位置在"第一行上方",我們可以調(diào)用rs對象的next()方法把"行光標(biāo)"向下移動一行,當(dāng)?shù)谝淮握{(diào)用next()方法時,"行光標(biāo)"就到了第一行記錄的位置,這時就可以使用ResultSet提供的getXXX(int col)方法來獲取指定列的數(shù)據(jù)了:

    rs.next();//光標(biāo)移動到第一行

    rs.getInt(1);//獲取第一行第一列的數(shù)據(jù)

    當(dāng)你使用rs.getInt(1)方法時,你必須可以肯定第1列的數(shù)據(jù)類型就是int類型,如果你不能肯定,那么最好使用rs.getObject(1)。在ResultSet類中提供了一系列的getXXX()方法,比較常用的方法有:

    Object getObject(int col)

    String getString(int col)

    int getInt(int col)

    double getDouble(int col)

    4.7 關(guān)閉

    與IO流一樣,使用后的東西都需要關(guān)閉!關(guān)閉的順序是先得到的后關(guān)閉,后得到的先關(guān)閉。

    rs.close();

    stmt.close();

    con.close();

    ?

    4.8 代碼

    ?

    ????public static Connection getConnection() throws Exception {

    ????????Class.forName("com.mysql.jdbc.Driver");

    ????????String url = "jdbc:mysql://localhost:3306/mydb1";

    ????????return DriverManager.getConnection(url, "root", "123");

    ????}

    ????@Test

    ????public void insert() throws Exception {

    ????????Connection con = getConnection();

    ????????Statement stmt = con.createStatement();

    ????????String sql = "insert into user values('zhangSan', '123')";

    ????????stmt.executeUpdate(sql);

    ????????System.out.println("插入成功!");

    ????}

    ????@Test

    ????public void update() throws Exception {

    ????????Connection con = getConnection();

    ????????Statement stmt = con.createStatement();

    ????????String sql = "update user set password='456' where username='zhangSan'";

    ????????stmt.executeUpdate(sql);

    ????????System.out.println("修改成功!");

    ????}

    ????@Test

    ????public void delete() throws Exception {

    ????????Connection con = getConnection();

    ????????Statement stmt = con.createStatement();

    ????????String sql = "delete from user where username='zhangSan'";

    ????????stmt.executeUpdate(sql);

    ????????System.out.println("刪除成功!");

    ????}

    ????@Test

    ????public void query() throws Exception {

    ????????Connection con = getConnection();

    ????????Statement stmt = con.createStatement();

    ????????String sql = "select * from user";

    ????????ResultSet rs = stmt.executeQuery(sql);

    ????????while(rs.next()) {

    ????????????String username = rs.getString(1);

    ????????????String password = rs.getString(2);

    ????????????System.out.println(username + ", " + password);

    ????????}

    ????}?

    ?

    4.9 規(guī)范化代碼

    所謂規(guī)范化代碼就是無論是否出現(xiàn)異常,都要關(guān)閉ResultSet、Statement,以及Connection,如果你還記得IO流的規(guī)范化代碼,那么下面的代碼你就明白什么意思了。

    ?

    ????@Test

    ????public void query() {

    ????????Connection con = null;

    ????????Statement stmt = null;

    ????????ResultSet rs = null;

    ????????try {

    ????????????con = getConnection();

    ????????????stmt = con.createStatement();

    ????????????String sql = "select * from user";

    ????????????rs = stmt.executeQuery(sql);

    ????????????while(rs.next()) {

    ????????????????String username = rs.getString(1);

    ????????????????String password = rs.getString(2);

    ????????????????System.out.println(username + ", " + password);

    ????????????}

    ????????} catch(Exception e) {

    ????????????throw new RuntimeException(e);

    ????????} finally {

    ????????????try {

    ????????????????if(rs != null) rs.close();

    ????????????????if(stmt != null) stmt.close();

    ????????????????if(con != null) con.close();

    ????????????} catch(SQLException e) {}

    ????????}

    ????}

    ?

    JDBC對象介紹

    ?

    1 JDBC中的主要類(接口)

    在JDBC中常用的類有:

    • DriverManager;
    • Connection;
    • Statement;
    • ResultSet。

    ?

    2 DriverManager

    其實我們今后只需要會用DriverManager的getConnection()方法即可:

  • Class.forName("com.mysql.jdbc.Driver");//注冊驅(qū)動
  • String url = "jdbc:mysql://localhost:3306/mydb1";
  • String username = "root";
  • String password = "123";
  • Connection con = DriverManager.getConnection(url, username, password);
  • ?

    注意,上面代碼可能出現(xiàn)的兩種異常:

  • ClassNotFoundException:這個異常是在第1句上出現(xiàn)的,出現(xiàn)這個異常有兩個可能:
    • 你沒有給出mysql的jar包;
    • 你把類名稱打錯了,查看類名是不是com.mysql.jdbc.Driver。

    ?

  • SQLException:這個異常出現(xiàn)在第5句,出現(xiàn)這個異常就是三個參數(shù)的問題,往往username和password一般不是出錯,所以需要認(rèn)真查看url是否打錯。
  • ?

    對于DriverManager.registerDriver()方法了解即可,因為我們今后注冊驅(qū)動只會Class.forName(),而不會使用這個方法。

    ?

    3 Connection

    Connection最為重要的方法就是獲取Statement:

    • Statement stmt = con.createStatement();

    ?

    后面在學(xué)習(xí)ResultSet方法時,還要學(xué)習(xí)一下下面的方法:

    • Statement stmt = con.createStatement(int,int);
    4 Statement

    Statement最為重要的方法是:

    • int executeUpdate(String sql):執(zhí)行更新操作,即執(zhí)行insert、update、delete語句,其實這個方法也可以執(zhí)行create table、alter table,以及drop table等語句,但我們很少會使用JDBC來執(zhí)行這些語句;
    • ResultSet executeQuery(String sql):執(zhí)行查詢操作,執(zhí)行查詢操作會返回ResultSet,即結(jié)果集。

    ?

      boolean execute()

    Statement還有一個boolean execute()方法,這個方法可以用來執(zhí)行增、刪、改、查所有SQL語句。該方法返回的是boolean類型,表示SQL語句是否有結(jié)果集!。

    如果使用execute()方法執(zhí)行的是更新語句,那么還要調(diào)用int getUpdateCount()來獲取insert、update、delete語句所影響的行數(shù)。

    如果使用execute()方法執(zhí)行的是查詢語句,那么還要調(diào)用ResultSet getResultSet()來獲取select語句的查詢結(jié)果。

    ?

    5 ResultSet之滾動結(jié)果集(了解)

    下一行:默認(rèn)只能使用它,其他的方法存在,但不能使用!默認(rèn)的結(jié)果集不可滾動!

    上一行

    下N行

    上N行

    到N行!

    ResultSet表示結(jié)果集,它是一個二維的表格!ResultSet內(nèi)部維護(hù)一個行光標(biāo)(游標(biāo)),ResultSet提供了一系列的方法來移動游標(biāo):

    • void beforeFirst():把光標(biāo)放到第一行的前面,這也是光標(biāo)默認(rèn)的位置;
    • void afterLast():把光標(biāo)放到最后一行的后面;
    • boolean first():把光標(biāo)放到第一行的位置上,返回值表示調(diào)控光標(biāo)是否成功;
    • boolean last():把光標(biāo)放到最后一行的位置上;
    • boolean isBeforeFirst():當(dāng)前光標(biāo)位置是否在第一行前面;
    • boolean isAfterLast():當(dāng)前光標(biāo)位置是否在最后一行的后面;
    • boolean isFirst():當(dāng)前光標(biāo)位置是否在第一行上;
    • boolean isLast():當(dāng)前光標(biāo)位置是否在最后一行上;
    • boolean previous():把光標(biāo)向上挪一行;
    • boolean next():把光標(biāo)向下挪一行;
    • boolean relative(int row):相對位移,當(dāng)row為正數(shù)時,表示向下移動row行,為負(fù)數(shù)時表示向上移動row行;
    • boolean absolute(int row):絕對位移,把光標(biāo)移動到指定的行上;
    • int getRow():返回當(dāng)前光標(biāo)所有行。

    ?

    ?

    獲取結(jié)果集元數(shù)據(jù)!

    • 得到元數(shù)據(jù):rs.getMetaData(),返回值為ResultSetMetaData;
    • 獲取結(jié)果集列數(shù):int getColumnCount()
    • 獲取指定列的列名:String getColumnName(int colIndex)

    ?

    結(jié)果集特性:當(dāng)使用Connection的createStatement時,已經(jīng)確定了Statement生成的結(jié)果集是什么特性。

    • 是否可滾動
    • 是否敏感
    • 是否可更新

    ?

    con.createSttement():生成的結(jié)果集:不滾動、不敏感、不可更新!

    con.createStatement(int,int):

    第一個參數(shù):

    • ResultSet.TYPE_FORWARD_ONLY:不滾動結(jié)果集;
    • ResultSet.TYPE_SCROLL_INSENSITIVE:滾動結(jié)果集,但結(jié)果集數(shù)據(jù)不會再跟隨數(shù)據(jù)庫而變化;
    • ResultSet.TYPE_SCROLL_SENSITIVE:滾動結(jié)果集,但結(jié)果集數(shù)據(jù)不會再跟隨數(shù)據(jù)庫而變化;

    第二個參數(shù):

    • CONCUR_READ_ONLY:結(jié)果集是只讀的,不能通過修改結(jié)果集而反向影響數(shù)據(jù)庫;
    • CONCUR_UPDATABLE:結(jié)果集是可更新的,對結(jié)果集的更新可以反向影響數(shù)據(jù)庫。

    ?

    ?

    ?

    上面方法分為兩類,一類用來判斷游標(biāo)位置的,另一類是用來移動游標(biāo)的。如果結(jié)果集是不可滾動的,那么只能使用next()方法來移動游標(biāo),而beforeFirst()、afterLast()、first()、last()、previous()、relative()方法都不能使用!!!

    結(jié)果集是否支持滾動,要從Connection類的createStatement()方法說起。也就是說創(chuàng)建的Statement決定了使用Statement創(chuàng)建的ResultSet是否支持滾動。

    Statement createStatement(int resultSetType, int resultSetConcurrency)

    resultSetType的可選值:

    • ResultSet.TYPE_FORWARD_ONLY:不滾動結(jié)果集;
    • ResultSet.TYPE_SCROLL_INSENSITIVE:滾動結(jié)果集,但結(jié)果集數(shù)據(jù)不會再跟隨數(shù)據(jù)庫而變化;
    • ResultSet.TYPE_SCROLL_SENSITIVE:滾動結(jié)果集,但結(jié)果集數(shù)據(jù)不會再跟隨數(shù)據(jù)庫而變化;

    ?

    可以看出,如果想使用滾動的結(jié)果集,我們應(yīng)該選擇TYPE_SCROLL_INSENSITIVE!其實很少有數(shù)據(jù)庫驅(qū)動會支持TYPE_SCROLL_SENSITIVE的特性!通常我們也不需要查詢到的結(jié)果集再受到數(shù)據(jù)庫變化的影響。

    ?

    resultSetConcurrency的可選值:

    • CONCUR_READ_ONLY:結(jié)果集是只讀的,不能通過修改結(jié)果集而反向影響數(shù)據(jù)庫;
    • CONCUR_UPDATABLE:結(jié)果集是可更新的,對結(jié)果集的更新可以反向影響數(shù)據(jù)庫。

    ?

    通常可更新結(jié)果集這一"高級特性"我們也是不需要的!

    ?

    獲取滾動結(jié)果集的代碼如下:

    Connection con = …

    Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, CONCUR_READ_ONLY);

    String sql = …//查詢語句

    ResultSet rs = stmt.executeQuery(sql);//這個結(jié)果集是可滾動的

    ?

    6 ResultSet之獲取列數(shù)據(jù)

    可以通過next()方法使ResultSet的游標(biāo)向下移動,當(dāng)游標(biāo)移動到你需要的行時,就需要來獲取該行的數(shù)據(jù)了,ResultSet提供了一系列的獲取列數(shù)據(jù)的方法:

    • String getString(int columnIndex):獲取指定列的String類型數(shù)據(jù);
    • int getInt(int columnIndex):獲取指定列的int類型數(shù)據(jù);
    • double getDouble(int columnIndex):獲取指定列的double類型數(shù)據(jù);
    • boolean getBoolean(int columnIndex):獲取指定列的boolean類型數(shù)據(jù);
    • Object getObject(int columnIndex):獲取指定列的Object類型的數(shù)據(jù)。

    ?

    上面方法中,參數(shù)columnIndex表示列的索引,列索引從1開始,而不是0,這第一點與數(shù)組不同。如果你清楚當(dāng)前列的數(shù)據(jù)類型,那么可以使用getInt()之類的方法來獲取,如果你不清楚列的類型,那么你應(yīng)該使用getObject()方法來獲取。

    ResultSet還提供了一套通過列名稱來獲取列數(shù)據(jù)的方法:

    • String getString(String columnName):獲取名稱為columnName的列的String數(shù)據(jù);
    • int getInt(String columnName):獲取名稱為columnName的列的int數(shù)據(jù);
    • double getDouble(String columnName):獲取名稱為columnName的列的double數(shù)據(jù);
    • boolean getBoolean(String columnName):獲取名稱為columnName的列的boolean數(shù)據(jù);
    • Object getObject(String columnName):獲取名稱為columnName的列的Object數(shù)據(jù);

    ?

    ?

    ?

    ?

    PreparedStatement

    • 它是Statement接口的子接口;
    • 強(qiáng)大之處:
      • 防SQL攻擊;
      • 提高代碼的可讀性、可維護(hù)性;
      • 提高效率!
    • 學(xué)習(xí)PreparedStatement的用法:
      • 如何得到PreparedStatement對象:
        • 給出SQL模板!
        • 調(diào)用Connection的PreparedStatement prepareStatement(String sql模板);
        • 調(diào)用pstmt的setXxx()系列方法sql模板中的?賦值!
        • 調(diào)用pstmt的executeUpdate()或executeQuery(),但它的方法都沒有參數(shù)。
    • 預(yù)處理的原理
      • 服務(wù)器的工作:
        • 校驗sql語句的語法!
        • 編譯:一個與函數(shù)相似的東西!
        • 執(zhí)行:調(diào)用函數(shù)
      • PreparedStatement:
        • 前提:連接的數(shù)據(jù)庫必須支持預(yù)處理!幾乎沒有不支持的!
        • 每個pstmt都與一個sql模板綁定在一起,先把sql模板給數(shù)據(jù)庫,數(shù)據(jù)庫先進(jìn)行校驗,再進(jìn)行編譯。執(zhí)行時只是把參數(shù)傳遞過去而已!
        • 若二次執(zhí)行時,就不用再次校驗語法,也不用再次編譯!直接執(zhí)行!

    ?

    ?

    1 什么是SQL攻擊

    在需要用戶輸入的地方,用戶輸入的是SQL語句的片段,最終用戶輸入的SQL片段與我們DAO中寫的SQL語句合成一個完整的SQL語句!例如用戶在登錄時輸入的用戶名和密碼都是為SQL語句的片段!

    ?

    2 演示SQL攻擊

    首先我們需要創(chuàng)建一張用戶表,用來存儲用戶的信息。

    CREATE TABLE user(

    ????uid????CHAR(32) PRIMARY KEY,

    ????username????VARCHAR(30) UNIQUE KEY NOT NULL,

    ????PASSWORD ????VARCHAR(30)

    );

    ?

    INSERT INTO user VALUES('U_1001', 'zs', 'zs');

    SELECT * FROM user;

    現(xiàn)在用戶表中只有一行記錄,就是zs。

    下面我們寫一個login()方法!

    ????public void login(String username, String password) {

    ????????Connection con = null;

    ????????Statement stmt = null;

    ????????ResultSet rs = null;

    ????????try {

    ????????????con = JdbcUtils.getConnection();

    ????????????stmt = con.createStatement();

    ????????????String sql = "SELECT * FROM user WHERE " +

    ????????????????????"username='" + username +

    ????????????????????"' and password='" + password + "'";

    ????????????rs = stmt.executeQuery(sql);

    ????????????if(rs.next()) {

    ????????????????System.out.println("歡迎" + rs.getString("username"));

    ????????????} else {

    ????????????????System.out.println("用戶名或密碼錯誤!");

    ????????????}

    ????????} catch (Exception e) {

    ????????????throw new RuntimeException(e);

    ????????} finally {

    ????????????JdbcUtils.close(con, stmt, rs);

    ????????}????????

    ????}

    ?

    下面是調(diào)用這個方法的代碼:

    login("a' or 'a'='a", "a' or 'a'='a");

    ?

    這行當(dāng)前會使我們登錄成功!因為是輸入的用戶名和密碼是SQL語句片段,最終與我們的login()方法中的SQL語句組合在一起!我們來看看組合在一起的SQL語句:

    SELECT * FROM tab_user WHERE username='a' or 'a'='a' and password='a' or 'a'='a'

    ?

    3 防止SQL攻擊
    • 過濾用戶輸入的數(shù)據(jù)中是否包含非法字符;
    • 分步交驗!先使用用戶名來查詢用戶,如果查找到了,再比較密碼;
    • 使用PreparedStatement。

    ?

    4 PreparedStatement是什么?

    PreparedStatement叫預(yù)編譯聲明!

    PreparedStatement是Statement的子接口,你可以使用PreparedStatement來替換Statement。

    PreparedStatement的好處:

    • 防止SQL攻擊;
    • 提高代碼的可讀性,以可維護(hù)性;
    • 提高效率。

    ?

    5 PreparedStatement的使用
    • 使用Connection的prepareStatement(String sql):即創(chuàng)建它時就讓它與一條SQL模板綁定;
    • 調(diào)用PreparedStatement的setXXX()系列方法為問號設(shè)置值
    • 調(diào)用executeUpdate()或executeQuery()方法,但要注意,調(diào)用沒有參數(shù)的方法;

    ?

    String sql = "select * from tab_student where s_number=?";

    PreparedStatement pstmt = con.prepareStatement(sql);

    pstmt.setString(1, "S_1001");

    ResultSet rs = pstmt.executeQuery();

    rs.close();

    pstmt.clearParameters();

    pstmt.setString(1, "S_1002");

    rs = pstmt.executeQuery();?

    ?

    在使用Connection創(chuàng)建PreparedStatement對象時需要給出一個SQL模板,所謂SQL模板就是有"?"的SQL語句,其中"?"就是參數(shù)。

    在得到PreparedStatement對象后,調(diào)用它的setXXX()方法為"?"賦值,這樣就可以得到把模板變成一條完整的SQL語句,然后再調(diào)用PreparedStatement對象的executeQuery()方法獲取ResultSet對象。

    注意PreparedStatement對象獨有的executeQuery()方法是沒有參數(shù)的,而Statement的executeQuery()是需要參數(shù)(SQL語句)的。因為在創(chuàng)建PreparedStatement對象時已經(jīng)讓它與一條SQL模板綁定在一起了,所以在調(diào)用它的executeQuery()和executeUpdate()方法時就不再需要參數(shù)了。

    PreparedStatement最大的好處就是在于重復(fù)使用同一模板,給予其不同的參數(shù)來重復(fù)的使用它。這才是真正提高效率的原因。

    ?

    所以,建議大家在今后的開發(fā)中,無論什么情況,都去需要PreparedStatement,而不是使用Statement。

    ?

    JdbcUtils工具類

    ?

    1 JdbcUtils的作用

    你也看到了,連接數(shù)據(jù)庫的四大參數(shù)是:驅(qū)動類、url、用戶名,以及密碼。這些參數(shù)都與特定數(shù)據(jù)庫關(guān)聯(lián),如果將來想更改數(shù)據(jù)庫,那么就要去修改這四大參數(shù),那么為了不去修改代碼,我們寫一個JdbcUtils類,讓它從配置文件中讀取配置參數(shù),然后創(chuàng)建連接對象。

    ?

    2 JdbcUtils代碼

    JdbcUtils.java

    public class JdbcUtils {

    ????private static final String dbconfig = "dbconfig.properties";

    ????private static Properties prop = new Properties();

    ????static {

    ????????try {

    ????????????InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(dbconfig);

    ????????????prop.load(in);

    ????????????Class.forName(prop.getProperty("driverClassName"));

    ????????} catch(IOException e) {

    ????????????throw new RuntimeException(e);

    ????????}

    ????}

    ?

    ????public static Connection getConnection() {

    ????????try {

    ????????????return DriverManager.getConnection(prop.getProperty("url"),

    ????????????????????prop.getProperty("username"), prop.getProperty("password"));

    ????????} catch (Exception e) {

    ????????????throw new RuntimeException(e);

    ????????}

    ????}

    }

    ?

    dbconfig.properties

    driverClassName=com.mysql.jdbc.Driver

    url=jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=UTF8

    username=root

    password=123

    ?

    UserDao

    ?

    修改項目:

  • 把UserDao修改為接口,然后把原來的UserDao修改類名為UserDaoImpl
  • 修改UserService中對UserDao的實例化:private UserDao userDao = DaoFactory.getUserDao()
  • 創(chuàng)建DaoFactory,提供getUserDao()
  • ?

    ?

    ?

    ?

    ?

    1 DAO模式

    DAO(Data Access Object)模式就是寫一個類,把訪問數(shù)據(jù)庫的代碼封裝起來。DAO在數(shù)據(jù)庫與業(yè)務(wù)邏輯(Service)之間。

    • 實體域,即操作的對象,例如我們操作的表是user表,那么就需要先寫一個User類;
    • DAO模式需要先提供一個DAO接口;
    • 然后再提供一個DAO接口的實現(xiàn)類;
    • 再編寫一個DAO工廠,Service通過工廠來獲取DAO實現(xiàn)。

    ?

    2 代碼

    ?

    User.java

    public class User {

    ????private String uid;

    ????private String username;

    ????private String password;

    }

    ?

    UserDao.java

    public interface UserDao {

    ????public void add(User user);

    ????public void mod(User user);

    ????public void del(String uid);

    ????public User load(String uid);

    ????public List<User> findAll();

    }

    ?

    UserDaoImpl.java

    public class UserDaoImpl implements UserDao {

    ????public void add(User user) {

    ????????Connection con = null;

    ????????PreparedStatement pstmt = null;

    ????????try {

    ????????????con = JdbcUtils.getConnection();

    ????????????String sql = "insert into user value(?,?,?)";

    ????????????pstmt = con.prepareStatement(sql);

    ????????????pstmt.setString(1, user.getUid());

    ????????????pstmt.setString(2, user.getUsername());

    ????????????pstmt.setString(3, user.getPassword());

    ????????????pstmt.executeUpdate();

    ????????} catch(Exception e) {

    ????????????throw new RuntimeException(e);

    ????????} finally {

    ????????????try {

    ????????????????if(pstmt != null) pstmt.close();

    ????????????????if(con != null) con.close();

    ????????????} catch(SQLException e) {}

    ????????}

    ????}

    ?

    ????public void mod(User user) {

    ????????Connection con = null;

    ????????PreparedStatement pstmt = null;

    ????????try {

    ????????????con = JdbcUtils.getConnection();

    ????????????String sql = "update user set username=?, password=? where uid=?";

    ????????????pstmt = con.prepareStatement(sql);

    ????????????pstmt.setString(1, user.getUsername());

    ????????????pstmt.setString(2, user.getPassword());

    ????????????pstmt.setString(3, user.getUid());

    ????????????pstmt.executeUpdate();

    ????????} catch(Exception e) {

    ????????????throw new RuntimeException(e);

    ????????} finally {

    ????????????try {

    ????????????????if(pstmt != null) pstmt.close();

    ????????????????if(con != null) con.close();

    ????????????} catch(SQLException e) {}

    ????????}????????

    ????}

    ?

    ????public void del(String uid) {

    ????????Connection con = null;

    ????????PreparedStatement pstmt = null;

    ????????try {

    ????????????con = JdbcUtils.getConnection();

    ????????????String sql = "delete from user where uid=?";

    ????????????pstmt = con.prepareStatement(sql);

    ????????????pstmt.setString(1, uid);

    ????????????pstmt.executeUpdate();

    ????????} catch(Exception e) {

    ????????????throw new RuntimeException(e);

    ????????} finally {

    ????????????try {

    ????????????????if(pstmt != null) pstmt.close();

    ????????????????if(con != null) con.close();

    ????????????} catch(SQLException e) {}

    ????????}????????????

    ????}

    ?

    ????public User load(String uid) {

    ????????Connection con = null;

    ????????PreparedStatement pstmt = null;

    ????????ResultSet rs = null;

    ????????try {

    ????????????con = JdbcUtils.getConnection();

    ????????????String sql = "select * from user where uid=?";

    ????????????pstmt = con.prepareStatement(sql);

    ????????????pstmt.setString(1, uid);

    ????????????rs = pstmt.executeQuery();

    ????????????if(rs.next()) {

    ????????????????return new User(rs.getString(1), rs.getString(2), rs.getString(3));

    ????????????}

    ????????????return null;

    ????????} catch(Exception e) {

    ????????????throw new RuntimeException(e);

    ????????} finally {

    ????????????try {

    ????????????????if(pstmt != null) pstmt.close();

    ????????????????if(con != null) con.close();

    ????????????} catch(SQLException e) {}

    ????????}????

    ????}

    ?

    ????public List<User> findAll() {

    ????????Connection con = null;

    ????????PreparedStatement pstmt = null;

    ????????ResultSet rs = null;

    ????????try {

    ????????????con = JdbcUtils.getConnection();

    ????????????String sql = "select * from user";

    ????????????pstmt = con.prepareStatement(sql);

    ????????????rs = pstmt.executeQuery();

    ????????????List<User> userList = new ArrayList<User>();

    ????????????while(rs.next()) {

    ????????????????userList.add(new User(rs.getString(1), rs.getString(2), rs.getString(3)));

    ????????????}

    ????????????return userList;

    ????????} catch(Exception e) {

    ????????????throw new RuntimeException(e);

    ????????} finally {

    ????????????try {

    ????????????????if(pstmt != null) pstmt.close();

    ????????????????if(con != null) con.close();

    ????????????} catch(SQLException e) {}

    ????????}????

    ????}

    }

    ?

    UserDaoFactory.java

    public class UserDaoFactory {

    ????private static UserDao userDao;

    ????static {

    ????????try {

    ????????????InputStream in = Thread.currentThread().getContextClassLoader()

    ????????????????????.getResourceAsStream("dao.properties");

    ????????????Properties prop = new Properties();

    ????????????prop.load(in);

    ????????????String className = prop.getProperty("cn.itcast.jdbc.UserDao");

    ????????????Class clazz = Class.forName(className);

    ????????????userDao = (UserDao) clazz.newInstance();

    ????????} catch (Exception e) {

    ????????????throw new RuntimeException(e);

    ????????}

    ????}

    ?

    ????public static UserDao getUserDao() {

    ????????return userDao;

    ????}

    }

    ?

    dao.properties

    cn.itcast.jdbc.UserDao=cn.itcast.jdbc.UserDaoImpl

    ?

    時間類型

    數(shù)據(jù)庫類型與java中類型的對應(yīng)關(guān)系:

    DATE à java.sql.Date

    TIME à java.sql.Time

    TIMESTAMP à java.sql.Timestamp

    ?

    • 領(lǐng)域?qū)ο?#xff08;domain)中的所有屬性不能出現(xiàn)java.sql包下的東西!即不能使用java.sql.Date;
    • ResultSet#getDate()返回的是java.sql.Date()
    • PreparedStatement#setDate(int, Date),其中第二個參數(shù)也是java.sql.Date

    ?

    時間類型的轉(zhuǎn)換:

    • java.util.Date à java.sql.Date、Time、Timestamp
      • 把util的Date轉(zhuǎn)換成毫秒值
      • 使用毫秒值創(chuàng)建sql的Date、Time、Timestamp
    • java.sql.Date、Time、Timestamp à java.util.Date
      • 這一步不需要處理了:因為java.sql.Date是java.util.Date;

    java.util.Date date = new java.util.Date();

    long l = date.getTime();

    java.sql.Date sqlDate = new java.sql.Date(l);

    ?

    ?

    ?

    ?

    1 Java中的時間類型

    java.sql包下給出三個與數(shù)據(jù)庫相關(guān)的日期時間類型,分別是:

    • Date:表示日期,只有年月日,沒有時分秒。會丟失時間;
    • Time:表示時間,只有時分秒,沒有年月日。會丟失日期;
    • Timestamp:表示時間戳,有年月日時分秒,以及毫秒。

    ?

    這三個類都是java.util.Date的子類。

    ?

       ?

    ?

    2 時間類型相互轉(zhuǎn)換

    把數(shù)據(jù)庫的三種時間類型賦給java.util.Date,基本不用轉(zhuǎn)換,因為這是把子類對象給父類的引用,不需要轉(zhuǎn)換。

    java.sql.Date date = …

    java.util.Date d = date;

    ?

    java.sql.Time time = …

    java.util.Date d = time;

    ?

    java.sql.Timestamp timestamp = …

    java.util.Date d = timestamp;

    ?

    當(dāng)需要把java.util.Date轉(zhuǎn)換成數(shù)據(jù)庫的三種時間類型時,這就不能直接賦值了,這需要使用數(shù)據(jù)庫三種時間類型的構(gòu)造器。java.sql包下的Date、Time、TimeStamp三個類的構(gòu)造器都需要一個long類型的參數(shù),表示毫秒值。創(chuàng)建這三個類型的對象,只需要有毫秒值即可。我們知道java.util.Date有g(shù)etTime()方法可以獲取毫秒值,那么這個轉(zhuǎn)換也就不是什么問題了。

    ?

    java.utl.Date d = new java.util.Date();

    java.sql.Date date = new java.sql.Date(d.getTime());//會丟失時分秒

    Time time = new Time(d.getTime());//會丟失年月日

    Timestamp timestamp = new Timestamp(d.getTime());

    ?

    3 代碼

    我們來創(chuàng)建一個dt表:

    CREATE TABLE dt(

    d DATE,

    t TIME,

    ts TIMESTAMP

    )

    ?

    下面是向dt表中插入數(shù)據(jù)的代碼:

    ????@Test

    ????public void fun1() throws SQLException {

    ????????Connection con = JdbcUtils.getConnection();

    ????????String sql = "insert into dt value(?,?,?)";

    ????????PreparedStatement pstmt = con.prepareStatement(sql);

    ????????

    ????????java.util.Date d = new java.util.Date();

    ????????pstmt.setDate(1, new java.sql.Date(d.getTime()));

    ????????pstmt.setTime(2, new Time(d.getTime()));

    ????????pstmt.setTimestamp(3, new Timestamp(d.getTime()));

    ????????pstmt.executeUpdate();

    ????}

    ?

    下面是從dt表中查詢數(shù)據(jù)的代碼:

    ????@Test

    ????public void fun2() throws SQLException {

    ????????Connection con = JdbcUtils.getConnection();

    ????????String sql = "select * from dt";

    ????????PreparedStatement pstmt = con.prepareStatement(sql);

    ????????ResultSet rs = pstmt.executeQuery();

    ????????

    ????????rs.next();

    ????????java.util.Date d1 = rs.getDate(1);

    ????????java.util.Date d2 = rs.getTime(2);

    ????????java.util.Date d3 = rs.getTimestamp(3);

    ????????

    ????????System.out.println(d1);

    ????????System.out.println(d2);

    ????????System.out.println(d3);

    ????}

    ?

    大數(shù)據(jù)

    目標(biāo):把mp3保存到數(shù)據(jù)庫中!

    在my.ini中添加如下配置!

    max_allowed_packet=10485760

    ?

    ?

    ?

    1 什么是大數(shù)據(jù)

    所謂大數(shù)據(jù),就是大的字節(jié)數(shù)據(jù),或大的字符數(shù)據(jù)。標(biāo)準(zhǔn)SQL中提供了如下類型來保存大數(shù)據(jù)類型:

    類型

    長度

    tinyblob?

    28--1B(256B)

    blob?

    216-1B(64K)

    mediumblob?

    224-1B(16M)

    longblob?

    232-1B(4G)

    tinyclob?

    28--1B(256B)

    clob?

    216-1B(64K)

    mediumclob?

    224-1B(16M)

    longclob?

    232-1B(4G)

    ?

    但是,在mysql中沒有提供tinyclob、clob、mediumclob、longclob四種類型,而是使用如下四種類型來處理文本大數(shù)據(jù):

    類型

    長度

    tinytext

    28--1B(256B)

    text

    216-1B(64K)

    mediumtext

    224-1B(16M)

    longtext

    232-1B(4G)

    ?

    首先我們需要創(chuàng)建一張表,表中要有一個mediumblob(16M)類型的字段。

    CREATE TABLE tab_bin(

    ????id ????INT ????PRIMARY KEY AUTO_INCREMENT,

    ????filename????VARCHAR(100),

    ????data ????MEDIUMBLOB

    );

    ?

      向數(shù)據(jù)庫插入二進(jìn)制數(shù)據(jù)需要使用PreparedStatement為原setBinaryStream(int, InputSteam)方法來完成。

    ????????????con = JdbcUtils.getConnection();

    ????????????String sql = "insert into tab_bin(filename,data) values(?, ?)";

    ????????????pstmt = con.prepareStatement(sql);

    ????????????pstmt.setString(1, "a.jpg");

    ????????????InputStream in = new FileInputStream("f:\\a.jpg");

    ????????????pstmt.setBinaryStream(2, in);

    ????????????pstmt.executeUpdate();

    ?

    讀取二進(jìn)制數(shù)據(jù),需要在查詢后使用ResultSet類的getBinaryStream()方法來獲取輸入流對象。也就是說,PreparedStatement有setXXX(),那么ResultSet就有g(shù)etXXX()。

    ????????????con = JdbcUtils.getConnection();

    ????????????String sql = "select filename,data from tab_bin where id=?";

    ????????????pstmt = con.prepareStatement(sql);

    ????????????pstmt.setInt(1, 1);

    ????????????rs = pstmt.executeQuery();

    ????????????rs.next();

    ????????????

    ????????????String filename = rs.getString("filename");

    ????????????OutputStream out = new FileOutputStream("F:\\" + filename);

    ????????????

    ????????????InputStream in = rs.getBinaryStream("data");

    ????????????IOUtils.copy(in, out);

    ????????????out.close();

    ?

      還有一種方法,就是把要存儲的數(shù)據(jù)包裝成Blob類型,然后調(diào)用PreparedStatement的setBlob()方法來設(shè)置數(shù)據(jù)

    ????????con = JdbcUtils.getConnection();

    ????????String sql = "insert into tab_bin(filename,data) values(?, ?)";

    ????????pstmt = con.prepareStatement(sql);

    ????????pstmt.setString(1, "a.jpg");

    ????????File file = new File("f:\\a.jpg");

    ????????byte[] datas = FileUtils.getBytes(file);//獲取文件中的數(shù)據(jù)

    ????????Blob blob = new SerialBlob(datas);//創(chuàng)建Blob對象

    ????????pstmt.setBlob(2, blob);//設(shè)置Blob類型的參數(shù)

    ????????pstmt.executeUpdate();

    ????????con = JdbcUtils.getConnection();

    ????????String sql = "select filename,data from tab_bin where id=?";

    ????????pstmt = con.prepareStatement(sql);

    ????????pstmt.setInt(1, 1);

    ????????rs = pstmt.executeQuery();

    ????????rs.next();

    ????????

    ????????String filename = rs.getString("filename");

    ????????File file = new File("F:\\" + filename) ;

    ????????Blob blob = rs.getBlob("data");

    ????????byte[] datas = blob.getBytes(0, (int)file.length());

    ????????FileUtils.writeByteArrayToFile(file, datas);

    ?

    批處理

    ?

    1 Statement批處理

    批處理就是一批一批的處理,而不是一個一個的處理!

    當(dāng)你有10條SQL語句要執(zhí)行時,一次向服務(wù)器發(fā)送一條SQL語句,這么做效率上很差!處理的方案是使用批處理,即一次向服務(wù)器發(fā)送多條SQL語句,然后由服務(wù)器一次性處理。

    批處理只針對更新(增、刪、改)語句,批處理沒有查詢什么事兒!

    ?

    可以多次調(diào)用Statement類的addBatch(String sql)方法,把需要執(zhí)行的所有SQL語句添加到一個"批"中,然后調(diào)用Statement類的executeBatch()方法來執(zhí)行當(dāng)前"批"中的語句。

    • void addBatch(String sql):添加一條語句到"批"中;
    • int[] executeBatch():執(zhí)行"批"中所有語句。返回值表示每條語句所影響的行數(shù)據(jù);
    • void clearBatch():清空"批"中的所有語句。

    ?

    ????????????for(int i = 0; i < 10; i++) {

    ????????????????String number = "S_10" + i;

    ????????????????String name = "stu" + i;

    ????????????????int age = 20 + i;

    ????????????????String gender = i % 2 == 0 ? "male" : "female";

    ????????????????String sql = "insert into stu values('" + number + "', '" + name + "', " + age + ", '" + gender + "')";

    ????????????????stmt.addBatch(sql);

    ????????????}

    ????????????stmt.executeBatch();

    ?

    當(dāng)執(zhí)行了"批"之后,"批"中的SQL語句就會被清空!也就是說,連續(xù)兩次調(diào)用executeBatch()相當(dāng)于調(diào)用一次!因為第二次調(diào)用時,"批"中已經(jīng)沒有SQL語句了。

    還可以在執(zhí)行"批"之前,調(diào)用Statement的clearBatch()方法來清空"批"!

    ?

    2 PreparedStatement批處理

    PreparedStatement的批處理有所不同,因為每個PreparedStatement對象都綁定一條SQL模板。所以向PreparedStatement中添加的不是SQL語句,而是給"?"賦值。

    ????????????con = JdbcUtils.getConnection();

    ????????????String sql = "insert into stu values(?,?,?,?)";

    ????????????pstmt = con.prepareStatement(sql);

    ????????????for(int i = 0; i < 10; i++) {

    ????????????????pstmt.setString(1, "S_10" + i);

    ????????????????pstmt.setString(2, "stu" + i);

    ????????????????pstmt.setInt(3, 20 + i);

    ????????????????pstmt.setString(4, i % 2 == 0 ? "male" : "female");

    ????????????????pstmt.addBatch();

    ????????????}

    ????????????pstmt.executeBatch();

    ?

    ?

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/Prozhu/p/5541988.html

    總結(jié)

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

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

    成人av免费| 国产在线一区二区 | 国产成人综合图片 | 中文字幕在线影院 | 国产一区二区三区在线 | 亚洲精选在线观看 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 色在线免费 | 久久免费视频国产 | 天天干干 | 99热在线国产精品 | 欧美综合干 | 丁香久久综合 | 视频在线精品 | 国产色中涩| 亚洲视频在线免费看 | 亚洲影视九九影院在线观看 | 欧美日性视频 | 欧美一级看片 | 欧美精品亚洲二区 | 高清色免费 | 狠狠综合久久av | 99在线精品观看 | 又黄又爽又无遮挡免费的网站 | 免费中午字幕无吗 | 日韩免费视频一区二区 | 国产免费又爽又刺激在线观看 | 九九视频网站 | 国产精品激情在线观看 | 亚洲高清视频在线观看 | 韩日精品中文字幕 | 国产一区二区不卡视频 | 欧美激情精品久久久久久免费印度 | 久久69精品 | 人人舔人人干 | 日日摸日日碰 | 色婷婷 亚洲 | 免费av免费观看 | 午夜精品一区二区三区免费 | 色资源在线观看 | 天堂av网址| 欧美一级久久久 | 国产在线视频导航 | 国产精品视频永久免费播放 | 久久婷婷一区二区三区 | 亚州黄色一级 | 91精品久久久久久久99蜜桃 | 91精品一区国产高清在线gif | 亚洲国产影院 | 国产黄色理论片 | av黄色一级片 | 91av社区 | 日韩在线观看的 | 999国内精品永久免费视频 | 亚洲电影久久久 | 成x99人av在线www | 日本黄色免费电影网站 | 日韩乱理 | 国产黄色av网站 | 欧美日韩在线免费观看视频 | 久久国产精品第一页 | 亚洲国产69 | 国产尤物在线观看 | 久久精品第一页 | 婷婷综合 | 成人黄色资源 | 日本中文字幕电影在线免费观看 | 日韩视频 一区 | 99精品久久久久久久久久综合 | 国产成人一区二区三区在线观看 | 色一色在线 | 国内亚洲精品 | 97色在线观看免费视频 | 97人人爽人人 | 蜜臀一区二区三区精品免费视频 | 欧美一级专区免费大片 | 在线成人欧美 | 丁香六月综合网 | 日韩综合精品 | 免费一级片视频 | 亚洲美女免费精品视频在线观看 | 亚洲日本精品视频 | 天天草综合网 | 日本巨乳在线 | 久草综合在线观看 | 中午字幕在线 | 国产伦理久久精品久久久久_ | 成人av日韩 | 成年人免费av网站 | 国产精品成人免费 | 日日碰狠狠添天天爽超碰97久久 | 99精品观看 | 天天狠狠干 | 天天久久夜夜 | 91av原创| 久草久草久草久草 | 日本在线视频网址 | av一区在线| 久久欧美精品 | 91av超碰 | 福利一区在线视频 | 久久精品视频网站 | 中文字幕在线观看免费高清完整版 | 99国内精品久久久久久久 | 久久99欧美 | 四虎国产精品成人免费影视 | 波多野结衣在线播放视频 | 最近日本字幕mv免费观看在线 | 日韩黄色一级电影 | 正在播放国产精品 | 四虎成人精品在永久免费 | 久草观看视频 | 麻豆视频在线免费看 | 九九热免费观看 | 91精品国产91久久久久福利 | 免费一级特黄录像 | 狠狠搞,com | 久久久久成人精品 | 久久99视频 | 91精品国自产在线观看欧美 | 日日天天av | 色搞搞 | 在线视频 精品 | 欧美日韩aa | 成片人卡1卡2卡3手机免费看 | 特黄免费av | 91桃色国产在线播放 | 日韩黄色影院 | 亚洲精品在线视频网站 | 日韩精品久久中文字幕 | 日韩影视大全 | 99精品国自产在线 | 日韩av在线网站 | 黄毛片在线观看 | 国产色秀视频 | 免费看一级一片 | 亚洲国产日韩欧美 | 国产原创在线 | 三级黄色在线观看 | 亚洲综合在线五月天 | 国产黑丝一区二区 | 最近中文字幕高清字幕免费mv | 国产日韩在线播放 | 99国产精品免费网站 | 免费黄在线看 | 精品国产伦一区二区三区观看说明 | 日韩性久久 | 免费看国产黄色 | 九九免费在线观看 | 99久久99久久精品国产片 | 色香蕉视频 | 69av网| 国产成人一区二区三区在线观看 | 久久永久视频 | 999久久久国产精品 高清av免费观看 | 国产一区 在线播放 | 亚洲视频免费在线观看 | 亚洲狠狠操 | 日韩成人黄色 | 国产精品第三页 | 91成品人影院 | 精品99视频 | 免费日韩电影 | 国产亲近乱来精品 | 91福利区一区二区三区 | 人人爽人人搞 | 亚洲一区二区精品 | 日韩av综合网站 | 亚洲开心色 | 亚洲精品国精品久久99热一 | 免费黄色在线播放 | 欧美福利片在线观看 | 国产成人免费高清 | 亚洲欧美日韩在线一区二区 | 亚洲另类久久 | 中国一区二区视频 | 日日夜色 | 夜色资源站国产www在线视频 | a黄在线观看 | 一级欧美日韩 | 在线a亚洲视频播放在线观看 | 91精品小视频 | 九九免费在线观看 | 久久视频一区 | 国产日韩在线观看一区 | 黄色的网站免费看 | 亚洲一区美女视频在线观看免费 | 欧美日韩国产综合一区二区 | 91精品国产99久久久久久红楼 | 欧美大香线蕉线伊人久久 | 午夜影院先 | 少妇性色午夜淫片aaaze | 91看片淫黄大片在线播放 | 91精品一区二区三区蜜臀 | 麻豆精品视频在线观看免费 | 国产精品毛片完整版 | 欧美中文字幕第一页 | 黄色影院在线观看 | 中文字幕第一页在线视频 | 天天射天天色天天干 | 精品国产免费观看 | 日韩在线观看精品 | 国产成人综 | 91超碰免费在线 | 国产成人1区 | 亚洲劲爆av| 久久久久久久久国产 | 在线观看 国产 | www91在线| 深爱激情综合网 | 国产精品女主播一区二区三区 | 国产不卡在线观看 | 久久伊人色综合 | 亚洲国产精品va在线看黑人 | 久久99免费观看 | 亚州日韩中文字幕 | 人人讲下载 | 99热99热 | 最近的中文字幕大全免费版 | 最近中文字幕高清字幕在线视频 | 在线免费色视频 | 久久久精品二区 | 精品一区二区三区久久 | 精品国产一区二区三区在线观看 | 伊人色综合久久天天网 | 亚洲一区精品人人爽人人躁 | 亚洲经典视频 | 国产精品高潮呻吟久久av无 | 久久久伊人网 | 国产精品免费av | 免费视频成人 | 高清一区二区三区av | 九九九热视频 | www在线观看视频 | 日韩av电影免费观看 | 中文字幕在线第一页 | 国产精品视频免费 | 96久久精品 | 欧洲一区二区在线观看 | 91免费版在线观看 | 中文字幕精品三级久久久 | 97超碰资源 | 27xxoo无遮挡动态视频 | 激情影院在线观看 | 综合色伊人 | 在线久热 | 国产色视频网站 | 亚洲视频中文 | 免费看特级毛片 | 一级黄毛片 | 国产日韩视频在线 | 91人人揉日日捏人人看 | 精品国产成人 | 激情五月婷婷综合 | 丁香婷婷激情国产高清秒播 | 爱爱av网站 | 黄色一级动作片 | 国产亚州精品视频 | 98福利在线 | 中文字幕文字幕一区二区 | 美女av免费看 | 99视频在线观看视频 | 欧美三人交 | 日韩精品视频免费专区在线播放 | 6080yy午夜一二三区久久 | 国产精彩视频 | 国产中文字幕在线看 | 免费看黄色小说的网站 | 99精品久久久久久久久久综合 | 国产日韩视频在线 | 国产亚洲片 | 亚洲一区视频在线播放 | 二区三区毛片 | 天天久久综合 | www狠狠操 | 一区二区理论片 | 在线观看视频黄色 | 国产无限资源在线观看 | 天堂av在线7 | 久久夜靖品 | 中文字幕视频网 | 国产又黄又猛又粗 | 在线观看黄网站 | 久久午夜色播影院免费高清 | 蜜臀av麻豆 | 激情久久久 | 亚州精品在线视频 | 在线免费国产视频 | 二区在线播放 | 99视频在线看| 91传媒视频在线观看 | 激情五月婷婷激情 | 在线探花 | 国产999精品久久久久久绿帽 | 精品国产一区二区三区久久久 | 天天操夜夜做 | 国内小视频 | 91精品一| 日韩视频欧美视频 | 国产91国语对白在线 | 亚洲精品玖玖玖av在线看 | 青青河边草手机免费 | 日日夜夜艹 | 久久国产精品免费一区二区三区 | 在线观看国产www | 精品一区二三区 | 国产欧美最新羞羞视频在线观看 | 久久视频国产精品免费视频在线 | 成人午夜影院 | 五月天婷婷丁香花 | 色综合天天狠天天透天天伊人 | 探花视频在线观看+在线播放 | 精品美女国产在线 | 美女免费黄视频网站 | 黄色a在线| 免费看片网址 | 亚洲精品播放 | 久久国产精品99国产精 | 国内久久精品视频 | 97视频免费观看2区 亚洲视屏 | 久久综合九色综合久99 | 毛片网站在线观看 | 国产黄色片免费看 | 久久久福利 | 日韩午夜精品福利 | 久久精品免费看 | 久久久久久久久久网站 | 一区二区三区韩国免费中文网站 | 日本三级国产 | 99久久精品免费看国产四区 | 精品一区欧美 | 色综合久久中文综合久久牛 | 国产午夜精品免费一区二区三区视频 | 91成人网页版 | 亚州av成人 | 国产福利一区二区在线 | 精品麻豆入口免费 | 一区二区欧美激情 | 国产福利一区二区在线 | 五月婷婷另类国产 | 顶级bbw搡bbbb搡bbbb | 99热这里只有精品国产首页 | 91在线中文字幕 | 久久伊人色综合 | 亚洲成人黄色网址 | 欧美国产高清 | 亚洲精品欧美视频 | 美女福利视频一区二区 | 在线一区av | 亚洲人在线 | 91污在线观看 | 97av精品| 精品欧美一区二区三区久久久 | 国产麻豆电影在线观看 | 免费在线观看午夜视频 | 久久综合狠狠综合久久综合88 | 国内丰满少妇猛烈精品播 | 日日干视频 | 在线观看视频你懂得 | 久久99精品国产 | 人人爱爱人人 | 亚洲精品一区二区在线观看 | 婷婷色社区 | 波多野结衣在线视频免费观看 | 天天爱天天舔 | 免费av高清| 青草视频在线 | 国产精品久久久久久久久婷婷 | 国产高清不卡一区二区三区 | 日韩在线免费播放 | 国产在线精品二区 | 亚洲精品小视频 | 香蕉精品视频在线观看 | 久久精品一二三 | 久久久999精品视频 国产美女免费观看 | 婷婷丁香激情五月 | 国精产品999国精产品视频 | 国产精品99爱 | 91看国产 | 四虎国产视频 | 免费av网址大全 | 91精品国产成人www | 欧美影院久久 | 色综合天天色综合 | 免费av在线网 | 欧美一级特黄高清视频 | 国产视频一区二区在线 | 久操视频在线 | 亚洲国产经典视频 | 深爱五月激情五月 | 偷拍区另类综合在线 | 免费国产ww| 在线观看日韩国产 | 国产亚洲免费的视频看 | 在线视频亚洲 | a级国产片 | 国产视频一区二区在线播放 | 亚洲国产精品成人va在线观看 | 午夜少妇一区二区三区 | 中文字幕第一页在线 | 久久人人看| 丁香午夜 | 国产色婷婷| 国产成人精品一区二区三区福利 | 1024手机看片国产 | 在线观看深夜福利 | 1000部国产精品成人观看 | 久久免费影院 | 97免费 | 欧美一区二区免费在线观看 | 三级黄色理论片 | 欧美久久久一区二区三区 | 97视频在线看 | 欧美精品在线观看一区 | 色妞色视频一区二区三区四区 | 精品国产伦一区二区三区 | 自拍超碰在线 | 国产精品国产三级国产不产一地 | www色网站 | 国产成人在线观看免费 | 91久久久久久久一区二区 | 精品一区二区视频 | 国产福利精品在线观看 | 韩国一区二区三区视频 | 欧美日韩在线视频观看 | 免费三级a | 国产精品免费久久久久久 | 久久国产精品久久国产精品 | 久久女教师 | 国产永久免费观看 | 激情小说 五月 | 精品国产久 | www在线观看国产 | 精品国产一区二区三区免费 | 国产高清在线不卡 | 亚洲永久av| 久操操| 日日精品 | 免费高清看电视网站 | 狠狠躁日日躁狂躁夜夜躁 | av一级网站 | 久久久国产精品人人片99精片欧美一 | 一区二区三区高清不卡 | 日韩在线影视 | 成+人+色综合 | 亚洲成年人免费网站 | 久久刺激视频 | 水蜜桃亚洲一二三四在线 | 久久国产品 | 粉嫩av一区二区三区四区在线观看 | 九九欧美视频 | 欧美视频在线二区 | h视频日本 | 看全黄大色黄大片 | 日韩a在线观看 | 黄色毛片视频免费观看中文 | 国产精品久久久久永久免费 | 日韩免费在线观看视频 | 成人免费视频免费观看 | 激情伊人| 天天射天天干天天操 | 国产一卡二卡四卡国 | 久久久久亚洲精品中文字幕 | 欧美福利视频 | 久久看片网站 | 黄色资源在线 | 中文字幕色婷婷在线视频 | 国产精品美女久久久久久久久久久 | 夜夜躁狠狠躁日日躁视频黑人 | 国产麻豆精品久久 | 99热最新在线 | 很黄很黄的网站免费的 | 成人在线观看日韩 | 久在线观看视频 | 日韩夜夜爽 | 最新亚洲视频 | 中文字幕婷婷 | 国产人成免费视频 | 免费观看性生交 | 丝袜制服综合网 | 激情网色 | 欧美精品中文在线免费观看 | 91九色视频在线 | 中文字幕一区二区三区在线播放 | 免费在线观看av网址 | 国产一区二区在线看 | 久草精品在线播放 | 最近最新最好看中文视频 | 亚洲涩综合 | 六月丁香在线观看 | 97麻豆视频| 看v片| 99 精品 在线 | 欧美性极品xxxx做受 | av电影在线观看完整版一区二区 | 久草网视频在线观看 | 久久这里只有精品视频99 | 天天操天天操天天操天天 | 日韩欧美网址 | 久久免费资源 | 高清不卡一区二区在线 | 91麻豆精品国产91久久久无限制版 | 欧美激情第八页 | 亚洲欧美在线综合 | 天天操天天射天天爽 | 精品亚洲欧美无人区乱码 | 丁香婷婷自拍 | 日本三级人妇 | 日本女人的性生活视频 | 欧美日韩一区二区在线观看 | 一区二区三区高清不卡 | 97人人模人人爽人人喊网 | .精品久久久麻豆国产精品 亚洲va欧美 | 国产网红在线观看 | 亚洲三级在线免费观看 | 免费成人av网站 | 99视| 黄色免费av | 中文字幕韩在线第一页 | 国产一二三在线视频 | 亚洲黄色在线免费观看 | 日韩欧美一区二区三区免费观看 | 欧美在线视频a | 欧美精品三级 | 中文字幕a∨在线乱码免费看 | 久久久在线 | 中文字幕电影网 | 欧洲成人av| 五月开心婷婷网 | 99精品久久精品一区二区 | 中文字幕一区在线 | 亚洲男男gaygay无套同网址 | 六月天综合网 | 中文字幕精品三级久久久 | 午夜黄色 | 久久黄色a级片 | 9797在线看片亚洲精品 | a成人在线| 最近免费中文字幕大全高清10 | 中文字幕免费观看 | 91最新网址 | 五月婷婷综合色拍 | 久久久网址 | 日本公乱妇视频 | 国产九九九精品视频 | 国产精品精品久久久 | 国产三级精品三级在线观看 | 亚洲精品成人av在线 | 欧美性大战久久久久 | 色99久久 | 97人人精品| 久久国产精品成人免费浪潮 | 婷婷色5月| 91在线网址| 日韩av电影网站在线观看 | 欧美性性网| 国产午夜精品一区二区三区嫩草 | 偷拍精品一区二区三区 | 免费视频你懂的 | 正在播放日韩 | 不卡的一区二区三区 | 91爱看片| 国产午夜精品福利视频 | 国产精品资源在线观看 | 狠狠色丁香婷婷综合 | 精品一区二区日韩 | 国内精品久久久久久久影视简单 | 四虎成人精品 | 91精品国产高清自在线观看 | 国产原创在线 | 欧美在线观看视频一区二区三区 | 日韩欧美一区二区三区在线观看 | 久久伊99综合婷婷久久伊 | 久久国产精品成人免费浪潮 | 97成人在线观看 | 一本一道久久a久久精品 | 久久综合免费视频 | 麻豆国产在线播放 | 国产精品视频内 | 精品久久国产一区 | 国产一级免费观看 | 国产美女免费观看 | 久久久久久电影 | 麻花传媒mv免费观看 | 国产精品黑丝在线观看 | 久草在线免费新视频 | 欧美中文字幕久久 | 国产成人av综合色 | 在线天堂中文在线资源网 | 久久久久影视 | 国产黄色视 | 久久全国免费视频 | 日韩欧美精品在线视频 | 欧美黄网站| 久久99久久99精品免观看粉嫩 | 久操97| 色婷婷免费视频 | 欧美激情操 | 国产成人在线精品 | 免费在线看v | 国产h片在线观看 | 亚洲精品久久视频 | 国产伦精品一区二区三区照片91 | 成 人 黄 色 视频 免费观看 | 成人av教育 | 国产成人精品亚洲精品 | 国产成人精品在线播放 | 日日摸日日 | 国产黄a三级 | 天天射天天干天天操 | 六月丁香社区 | 亚洲国产免费av | 中文资源在线官网 | 精品无人国产偷自产在线 | 97超级碰碰碰碰久久久久 | 99在线精品视频 | 91精彩视频在线观看 | 久久久精品国产一区二区三区 | 久久精品一区 | 国产精品一区二区在线播放 | wwwwww黄| av黄网站 | 午夜久久福利视频 | av电影在线免费观看 | 日本黄色大片免费 | 欧美一级淫片videoshd | 成人免费视频免费观看 | 91麻豆看国产在线紧急地址 | 曰本三级在线 | 欧美性黑人 | 国产中年夫妇高潮精品视频 | 草草草影院 | 国产精品亚洲片在线播放 | 中文字幕精品三区 | 在线视频一区二区 | 久久久一本精品99久久精品66 | 国精产品满18岁在线 | 色全色在线资源网 | 视频一区二区免费 | 操久在线 | 中文字幕中文字幕中文字幕 | 亚洲精品色婷婷 | 国产精品99久久久精品 | 91在线文字幕| 成人免费共享视频 | 国产美女精品视频免费观看 | 色美女在线 | av中文字幕电影 | 午夜精品久久久久久久爽 | 亚洲综合日韩在线 | 免费一级片久久 | 国产一级视频免费看 | 国产资源在线播放 | 国产精品999久久久 久产久精国产品 | 精品一区二区三区四区在线 | 国产一区久久久 | 麻花天美星空视频 | 国产污视频在线观看 | 天天天干 | 久久精品一二区 | 黄色在线观看污 | 久久久久久国产精品亚洲78 | 中文字幕高清视频 | 精品1区2区 | 亚洲精品中文字幕视频 | 国产黄色播放 | 国产精品久久久久久久久大全 | 久久精品aaa | 成人久久久久久久久久 | 国产手机视频在线 | 色综合中文综合网 | 亚洲dvd | 日韩视频a| 新版资源中文在线观看 | 99精品免费| 成人亚洲综合 | 亚洲成年人免费网站 | 亚洲精品理论片 | 亚洲视频网站在线观看 | 亚洲成a人片在线www | 五月婷婷中文 | 亚洲精品小视频 | 992tv人人网tv亚洲精品 | 精品久久久久久久久久久久久久久久 | 成人蜜桃| 久久九九免费视频 | 免费欧美高清视频 | 一区二区三区四区免费视频 | 激情婷婷在线观看 | 深爱激情五月婷婷 | 视频国产 | 亚洲欧洲精品久久 | 最近中文字幕免费大全 | 99在线精品视频观看 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 国产成人免费高清 | 午夜三级影院 | 精品久久久一区二区 | 成人羞羞视频在线观看免费 | 久久99久久99免费视频 | 久久精品视 | 久久女同性恋中文字幕 | 国产综合在线观看视频 | 国产精品高潮在线观看 | 亚洲精品一区中文字幕乱码 | 精品久久91 | 四虎影视欧美 | 欧美日韩一区二区免费在线观看 | 在线免费观看麻豆视频 | 在线91色 | 日日操夜 | 久久综合五月天 | 亚洲jizzjizz日本少妇 | 久久avav | 国产伦精品一区二区三区… | 中文字幕韩在线第一页 | 一本一本久久a久久精品牛牛影视 | 亚洲97在线| 婷婷久久丁香 | 在线国产高清 | 久久人人爽人人人人片 | 在线视频99 | 国产精品99视频 | 亚洲精品在线视频 | 国产精品s色 | 中文字幕日韩精品有码视频 | 欧美激情综合五月 | 欧美一级片在线观看视频 | 六月天综合网 | 国产综合福利在线 | 日韩在线电影观看 | 亚洲精品在线观看不卡 | 500部大龄熟乱视频使用方法 | 天天曰| 日日夜夜亚洲 | 久久综合欧美精品亚洲一区 | 天天天插| 99精品视频在线观看视频 | 久久久久久国产精品美女 | 又大又硬又黄又爽视频在线观看 | 99一区二区三区 | 国模精品一区二区三区 | 国产黄色一级片在线 | 亚洲精品视频中文字幕 | www黄色 | 免费在线黄网 | 国产成人在线网站 | 久久成人黄色 | 久产久精国产品 | 成人小视频在线 | 男女拍拍免费视频 | 日韩va欧美va亚洲va久久 | 亚洲日本在线一区 | 国产在线中文 | 91在线区 | 久久精品国产亚洲精品2020 | 在线看片91 | 久久精品www人人爽人人 | 精品9999 | 成人午夜精品 | 国产999视频在线观看 | 亚洲一区av | 国产一级电影 | 网站在线观看日韩 | 久草线| 日本中文字幕观看 | 欧美xxxx性xxxxx高清 | 欧美日韩啪啪 | 婷婷国产v亚洲v欧美久久 | 色多多视频在线 | 黄色三级视频片 | 亚洲国产精品一区二区久久,亚洲午夜 | 在线黄色av | 天天综合久久综合 | 深夜免费福利网站 | 五月天婷婷在线视频 | 欧美激情另类文学 | 日韩视频图片 | 久久国产精品免费观看 | 黄色三级av | 亚洲美女视频在线 | 蜜臀av网址 | www日韩视频 | 美女福利视频 | 亚洲九九九在线观看 | 开心激情五月婷婷 | 99999精品 | 精品国产a | 在线观看岛国片 | 成年人电影免费在线观看 | 欧美一区二区三区在线播放 | 九月婷婷色 | 免费看黄视频 | 午夜精品视频一区 | 欧美在线a视频 | 99免费在线观看 | 国产亚洲欧美日韩高清 | 久久大片 | 久草av在线播放 | 91手机视频| 欧美日韩精品在线播放 | 亚洲国产小视频在线观看 | 国产精品免费一区二区三区在线观看 | 国产免费又爽又刺激在线观看 | 蜜臀av网址| 五月天六月婷婷 | 国产亚洲精品精品精品 | 久久久久久久久久久久久国产精品 | 2023年中文无字幕文字 | 欧美午夜a | 91原创在线观看 | 国产在线一区观看 | 国产在线高清视频 | 激情图片区 | 成人国产精品免费 | 深夜激情影院 | av女优中文字幕在线观看 | 亚洲成人免费在线观看 | 天天操天天透 | 97色免费视频 | 亚洲精品日韩一区二区电影 | 精品一区二区在线免费观看 | 久久久久久久久久久成人 | 91热在线 | 精品久久久久久一区二区里番 | 色婷婷天天干 | 天堂激情网| 四虎永久国产精品 | 国产精品嫩草影视久久久 | 欧美激情一区不卡 | av超碰在线 | 激情五月播播久久久精品 | 精品99久久久久久 | 在线影院中文字幕 | 成人av电影免费在线观看 | 国产亚洲视频在线 | 久久精品五月 | 91人人插| 欧美日韩国产在线一区 | 88av色| 亚洲精品综合欧美二区变态 | www成人av| 97视频在线观看成人 | 99精品国产在热久久下载 | 国产高清视频在线播放 | 久久久www成人免费精品张筱雨 | 亚洲最新在线 | 国产伦精品一区二区三区高清 | 成人网色 | 99国产精品一区 | 精品国产伦一区二区三区 | 天天玩天天干 | 欧美精品一区二区三区四区在线 | 久久综合久久88 | 特级毛片在线 | 骄小bbw搡bbbb揉bbbb | 亚洲一区免费在线 | 91亚洲在线 | 911亚洲精品第一 | 91av视频在线观看 | 亚洲精品在线观看的 | 欧美亚洲国产日韩 | 国产一级做a爱片久久毛片a | 免费看国产曰批40分钟 | 日韩天天综合 | 国产精品va在线观看入 | 欧美国产视频在线 | 在线观看成人福利 | 欧美日韩精品在线视频 | 亚洲国产成人精品在线观看 | 在线国产福利 | 午夜av电影 | avav99| 黄色免费看片网站 | 国产精品久99 | 日韩乱色精品一区二区 | 亚洲另类视频在线观看 | 99热手机在线 | 美女免费视频网站 | 黄色www在线观看 | av大全在线观看 | 伊人中文字幕在线 | 激情视频91 | 亚洲欧洲精品一区二区精品久久久 | 日韩精品久久久久久 | 日韩欧美电影在线观看 | 国产精品久久久久久久久久ktv | 欧美日韩不卡在线观看 | 一级α片 | 99久高清在线观看视频99精品热在线观看视频 | 91av电影在线观看 | 中文字幕美女免费在线 | 久久99国产一区二区三区 | 国产精品免费观看国产网曝瓜 | 黄色毛片视频 | 日韩欧美精品一区二区 | 婷婷丁香久久五月婷婷 | 国产青草视频在线观看 | 久久人人爽av | 国产91精品一区二区麻豆网站 | 国产美女被啪进深处喷白浆视频 | 国产片网站 | 国产精品门事件 | 久久高清免费观看 | 欧美最猛性xxxxx免费 | 欧美成人tv | 丰满少妇在线观看资源站 | a成人v在线 | 久久久99国产精品免费 | 国产精品婷婷 | 欧美日韩中 | 国产精品va在线 | 午夜精品影院 | 香蕉在线视频播放网站 | 免费看av片网站 | 99久久久| 亚洲国产伊人 | 黄色大片免费网站 | 日本三级全黄少妇三2023 | www.亚洲精品在线 | 日日夜夜精品免费 | 91精品国产福利在线观看 | 精品久久免费看 | 日韩av电影手机在线观看 | 天天色成人| 奇米网网址 | 九九九九免费视频 | jizzjizzjizz亚洲| 在线观看午夜 | 日日爽天天爽 | 日韩二区三区在线观看 | 日韩在线电影一区 | 操碰av| 久久精品一区二区三区视频 | 精品国产一区二区三区四 | 久热免费在线观看 | 人人澡人人添人人爽一区二区 | 免费av试看 | av女优中文字幕在线观看 | 日韩精品久久久久久久电影竹菊 | 亚洲成人av在线 | 国产成人91 | wwwww.国产 | 日韩欧美在线国产 | 91传媒激情理伦片 | 久久综合狠狠综合久久综合88 | 成人在线视频观看 | 成人黄色片免费 | 久久免费黄色大片 | a级国产乱理论片在线观看 特级毛片在线观看 | 高清av中文字幕 | 激情电影影院 | 精品人妖videos欧美人妖 | 高清av网站 | 国产一级二级在线观看 | 免费久久99精品国产婷婷六月 | 9999国产| 狠狠狠色丁香婷婷综合久久88 | 麻豆高清免费国产一区 | 九七人人干| 天天干天天操天天入 | 亚洲va欧美va | 国产一区二区精品久久91 | 久久精品中文字幕免费mv | 国产精品网站一区二区三区 | 亚洲精品成人av在线 | 日韩欧美一级二级 | 天天插天天操天天干 | 美女国内精品自产拍在线播放 | 欧美在线观看视频 | 国产精品一区二区美女视频免费看 | 久久久www成人免费毛片麻豆 | 天天插天天色 | 亚洲精品动漫在线 | 精品一区二区免费在线观看 | 日韩丝袜在线 | 午夜丁香网 | 久久午夜影视 | 狠狠干网址 | 99久久er热在这里只有精品66 | 国产成人精品av在线 | 日韩av网址在线 | 国产日韩欧美在线 | av最新资源 | 亚洲乱码在线观看 | 免费在线色电影 | 亚洲aⅴ乱码精品成人区 | 香蕉日日 | 特级黄色片免费看 | 干狠狠| 免费在线看成人av | 国产亚洲欧美日韩高清 | 日日碰夜夜爽 | 亚洲综合国产精品 | 精品夜夜嗨av一区二区三区 | 国产精品一区二区三区在线免费观看 | 色国产精品一区在线观看 | 黄网站色成年免费观看 |