<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 78, comments - 34, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    2009年12月1日

    好快,已經是12月份了,11月5日開的班。就快學習一個月了,總學習時間是四個月。過年休息9天,這樣到明年3月14日課程就結束了。好好學習,回去找個好工作!

    今日是JDBC的第一天,JDBC的基礎應用。以后在WEB開發中的使用方式。課程中,方老師上午在講解JDBC基礎的同時做了一個JDBC練習程序,對JDBC的基礎應用。下午,方老師做了一個使用數據庫的WEB應用,用戶注冊、登錄、用戶信息修改。

    先讓我們來了解一下JDBC(Java Data Base Connectivity)基礎吧!

    我們都知道數據庫都提供一些接口,用戶使用這些接口操作數據庫。這就是數據庫驅動!常見的數據庫有MySQL、Oracle、SQLServer、DB2等,這些數據庫提供的接口都不一樣,難道開發人員使用不同的數據庫就要學習不同的驅動接口嗎?JDBC正是為統一數據庫訪問接口而實現的,SUN公司提出了這一接口。數據庫公司都去實現這一接口。大大方便了,編程人員對數據庫的操作:

    clip_image002

    在工程中使用JDBC,必須導入相應的JAR包。比如使用MySQL數據庫,必須導入MySQL實現的JDBC jar包。可以到http://dev.mysql.com/downloads/下載。

    使用JDCB進行數據訪問的基本流程,見代碼:

    隱藏行號 復制代碼 這是一段程序代碼。
    1. import java.sql.Connection;
          
    2. import java.sql.DriverManager;
          
    3. import java.sql.ResultSet;
          
    4. import java.sql.SQLException;
          
    5. import java.sql.Statement;
          
    6. 
          
    7. public class JDBCTemp {
          
    8. 
          
    9.     public static void main(String[] main) throws Exception {
          
    10.         // 1.裝
          
    11.         DriverManager.registerDriver(new com.mysql.jdbc.Driver());
          
    12.         /*
          
    13.          * 因om.mysql.jdbc.Driver在
          
    14.          * 上om.mysql.jdbc.Driver,
          
    15.          * 所
          
    16.          */
          
    17.         Class.forName("com.mysql.jdbc.Driver");
          
    18.         // 2.連
          
    19.         Connection conn = DriverManager.getConnection(
          
    20.                 "jdbc:mysql://localhost:3306/databasename", "username",
          
    21.                 "password");
          
    22.         // 3.創QL語tatement對
          
    23.         Statement sta = conn.createStatement();
          
    24.         // 4.執QL語
          
    25.         boolean ok = sta.execute("select * from user;");
          
    26.     
    27.         // 5.遍
          
    28.         ResultSet rs = null;
          
    29.         if(ok){
          
    30.             rs = sta.getResultSet();
          
    31.             while(rs.next()){
          
    32.                 rs.getInt(1);
          
    33.                 //...
          
    34.             }
          
    35.         }
          
    36.     
    37.         // 6.釋esultSet、tatement、onnection這
          
    38.         // 必
          
    39.         // 下
          
    40.         if(rs != null){
          
    41.             try {
          
    42.                 rs.close();
          
    43.             } catch (SQLException e) {
          
    44.                 e.printStackTrace();
          
    45.             }
          
    46.             rs = null;
          
    47.         }
          
    48.     
    49.         if(sta != null){
          
    50.             try {
          
    51.                 sta.close();
          
    52.             } catch (SQLException e) {
          
    53.                 e.printStackTrace();
          
    54.             }
          
    55.             sta = null;
          
    56.         }
          
    57.     
    58.         if(conn != null){
          
    59.             try {
          
    60.                 conn.close();
          
    61.             } catch (SQLException e) {
          
    62.                 e.printStackTrace();
          
    63.             }
          
    64.             conn = null;
          
    65.         }
          
    66.     }
          
    67. }
          
    68. 
          

     

    上面的代碼只為演示,繼續向下學習就會發現其中的一些問題。

    其中

    DriverManager.getConnection("jdbc:mysql://localhost:3306/databasename", "username","password");

    GetConnection的第一個參數“jdbc:mysql://localhost:3306/databasename

    ”,它的各段含義如下:

    Jdbc:協議

    Mysql:子協議

    localhost:主機

    3306:端口

    databasename:數據庫名

    常見的URL如下:

    Oracle :jdbc:oracle:thin:@localhost:1521:sid

    SQLServer:jdbc:microsoft:sqlserver//localhost:1433; DatabaseName=sid

    MYSQL:jdbc:mysql://localhost:3306/sid

    如果把上面的代碼用于用戶登錄或查詢數據時,會造成一個嚴重的安全漏洞——SQL注入!

    例,根據提交的用戶名查找用戶:

    "select id,name,password from user where name='"+name+"'";

    如果用戶提交的用戶名是:“’ or 1=1 or 1=‘”,會發生什么問題?因為在where過濾時使用了or邏輯,其有的1=1返回真,結果可以正常通過驗證。這是一個十分嚴重的安全漏洞!

    為此Java為我們提供了PreparedStatement接口,表示預編譯的 SQL 語句的對象。SQL 語句被預編譯并存儲在 PreparedStatement 對象中,然后可以使用此對象多次高效地執行該語句。PreparedStatement的使用:

    PreparedStatement ps = conn.prepareStatement("select id,name,password form user where name=? and passowrd=?");

    ps.setString(1, name);

    ps.setString(2, password);

    這樣就可以解決SQL注入的漏洞,同時也可以高效的執行SQL語句。上面的使用方法一眼就看出來了,一個“?”對應下邊的ps.setXXX方法,按照“?”先后,對應ps.setXXX第一個參數的索引!

    我們使用Statement. execute執行了查詢語句,Statement還有其他以execute開頭的方法,具體針對查詢和增加、刪除、修改的方法,在此就不一一說明了。JDK手冊里邊有詳細說明。

    查詢成功后,在Statement對象中,可以獲得記錄集對象ResultSet,查詢的結果全都保存在ResultSet中嗎?仔細想想,好像是。如果有1億條記錄符合查詢條件,同時有1000個用戶調用同一查詢,那服務器不燒了嗎!所以查詢的結果并未保存在ResultSet中,而是保存在數據庫中,ResultSet指向數據庫的引用。這樣很方便也很快捷!那數據庫會不會被充爆了?當然不會,數據本身就保存在數據庫中,數據庫的查詢結果頂多就保存的指向數據的“指針”。

    ResultSet對象內部有一個游標,游標初始位置是第一條記錄前。必須調用它的next()方法,才會到第一條記錄,依次向下。如果不存在記錄,或者已經到記錄尾,則返回false。存在記錄返回true。然后我們可以通過調用它的getObject、getInt、getString…方法調用相應的值,如果只使用getObject獲取記錄值,必須使用強轉將它轉換為我們需要的類型。

    下面是常用數據類型轉換表(老方整理的,嘿嘿):

    SQL類型

    Jdbc對應方法

    返回類型

    BIT

    getBoolean()

    Boolean

    TINYINT

    getByte()

    Byte

    SMALLINT

    getShort()

    Short

    int

    getInt()

    Int

    BIGINT

    getLong()

    Long

    CHAR,VARCHAR,LONGVARCHAR

    getString()

    String

    Text Blob

    getColb() getBlob()

    Clob blob

    DATE

    getDate()

    Java.sql.Date

    TIME

    getTime()

    Java.sql.Time

    TIMESTAMP

    getTimestamp()

    Java.sql.Timestamp

    關于使用JDBC進行CURD的操作比較簡單,因為昨天已經學習了在控制臺有使用這些操作,在此就不多進行復習了。但一定要記住每次使用完數據庫連接時,一定要釋放。一是因為數據庫有同時連接數量限制,二是因為數據連接會占用服務器資源。安全釋放這些連接,參看上邊的釋放代碼。常規的項目開發中,會將對數據庫的操作封裝到一個類中,這樣方便使用。

    在常規項目開發中,我們需要編寫操作數據的DAO類。因為對數據庫的一些操作需要處理異常,為了查錯直觀一些。我們在環繞這些異常時,將它們包裝一下再拋出。如何包裝異常?JAVA的包裝類很多,我們的包裝也是通過這個方法實現的。編寫一個繼承處Exception類的子類,然后將接收的異常存到父親類中,我們也可以在自定義類中添加些自己的提示信息。這樣當程序運行時拋出的異常,可以直觀的定位到錯誤類。這是一個十分好的方法,用在其他地方。也有相當的功效!

    最后一個問題,數據庫中的中文亂碼問題。其實并不是數據庫的原因 ,因為我們在創建數據庫時可以指定它的編碼為utf8、gb2312或gbk等支持中文的編碼。WEB應用讀寫數據庫時造成的亂碼,主要是由于WEB應用使用的編碼與數據庫使用的編碼不統一。統一一下,就可以解決了!

    老方有給大家留作業,今天的作業內容較多。主要是為了練習數據庫的操作和數據庫與WEB的組合應用。之前都是使用XML或配置文件做為偽數據庫與WEB組合練習的,從今天起用上數據庫了。雖然并不是十分興奮,但離框架和項目練習越來越近了,這讓我感覺很好!

    以前并未使用JAVA開發過項目,雖然學習JAVA對我已經沒什么難度。但上課這些天來,有時用到IO和集合,還是讓我卡了一下。因為我并未系統的學習過它們,我應該系統的學習一下它們了。越是學習應該越是快樂,越學習應該越是簡單。沒有學習基礎那么枯燥,就圍繞那基礎搞來搞去,用起來了才舒服。因為基礎學習好了,所以感覺應用就簡單的。其實應用并不簡單,即使不說基礎,應用中的模式與框架是相當重要的,有使用過程語言開發的同志,我想對此有很大的感想!

    我要學好項目的架構,文檔的編寫與項目管理,這在以后工作中是相當重要的。

    posted @ 2009-12-01 22:26 長城 閱讀(234) | 評論 (0)編輯 收藏

    2009年11月30日

    方老師今日講解數據庫入門,主要內容是對數據庫操作的SQL語句,僅涉及單表操作。內容雖然枯燥,但也學習了很多知識。

    什么是SQL?structred query language(結構化查詢語言),在數據庫中它是通用的。我之前并未深入使用數據庫。對此還有些模糊,但今日的學習讓我有了深入了解。其實我也應該早就想到,對數據的一些操作通過SQL語句就可以完成,程序直接拿結果就可以了。

    方老師以MySQL5.0數據庫,給我們做了講解。是為了下一課學習JDBC做準備。前面的對數據庫的簡介和MySQL5.0的安裝及配置,我就不寫出來了。下面是用戶、服務器、數據庫和表的關系圖:

    clip_image001

    在配置數據庫時選中:clip_image002,或手動將MySQL安裝目錄添加到Windows環境變量Path中。使用控制臺連接MySQL數據庫:mysql –u 用戶名 –p 密碼。

    下面是常用的SQL語句,只針對單表使用,有關語句的具體信息請查詢MySQL的手冊:

    一、數據庫相關SQL語句:

    1. 創建數據庫:
    CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification [, create_specification] ...]

    其中create_specification是:

    [DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name
    例,創建一個名為“ccdb”,字符集為UTF-8的數據庫:
    create database ccdb character set utf8;
    clip_image003

    2. 查看、刪除數據庫:
    顯示數據庫:
    SHOW CREATE {DATABASE | SCHEMA} db_name
    例,查看服務器中所有的數據庫:
     clip_image004
    顯示數據庫創建語句:
    SHOW {DATABASES | SCHEMAS} [LIKE 'pattern']
    例,查看創建的“ccdb”數據庫的創建語句:
    clip_image005
    刪除數據庫:
    DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
    例,刪除創建的數據庫“ccdb”:
    clip_image006

    3. 修改數據庫:
    ALTER {DATABASE | SCHEMA} [db_name] alter_specification [, alter_specification] ...
    其中alter_specification是:
    [DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name

    例,更改數據庫“ccdb”的字符編碼為“gbk”:

    clip_image008

    二、數據表相關SQL語句:

    1. 創建表:
    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [select_statement]
    CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(] LIKE old_tbl_name [)];
    其中create_definition、table_options等,請查看手冊。
    例,在數據庫“ccdb”中創建一個“user”表:
    在創建表之前,必須選擇當前庫。否則服務器不知道在哪個數據庫中創建表,或者當前已經有被選擇的其他數據庫,就會創建到別的庫。

    clip_image009

    clip_image010

     
    MySQL常用數據類型(拿方老師的,嘿嘿):
    分類
    數據類型
    說明
     
     
     
     
    數值類型
    BIT
    TINYINT [UNSIGNED] [ZEROFILL] 
    BOOL,BOOLEAN 
    SMALLINT [UNSIGNED] [ZEROFILL] 
    INT [UNSIGNED] [ZEROFILL] 
    BIGINT [UNSIGNED] [ZEROFILL] 
    FLOAT[(M,D)][UNSIGNED] [ZEROFILL] 
    DOUBLE[(M,D)][UNSIGNED] [ZEROFILL] 
    范圍為從1到64。
    帶符號的范圍是-128到127。無符號0到255。
    使用0或1表示真或假
    2的16次方
    2的32次方
    2的64次方
    M指定長度,d指定小數位數
    表示比float精度更大的小數
     
     
    文本類型
    CHAR(size)
    VARCHAR(size)
    BLOB   LONGBLOB
    TEXT   LONGTEXT
    固定長度字符串
    可變長度字符串
    二進制數據
    大文本
    時間日期
    DATE/DATETIME/TimeStamp
    日期類型(YYYY-MM-DD)  (YYYY-MM-DD HH:MM:SS),TimeStamp表示時間戳,它可用于自動記錄insert、update操作的時間
     

    2. 修改表:
    ALTER [IGNORE] TABLE tbl_name alter_specification [, alter_specification] ...

    其中alter_specification,請查看手冊。

    修改表“user”名為“userinfo”:
    clip_image011
    修改表“userinfo”的字符集為“gb2313”,并將字符集校對設置為與“gb2313”相應的校對:
    clip_image013
    可以在控制臺輸入:SHOW CHARACTER SET;,列出可用的字符集。也可以在手冊中查找“Character sets”,查找手冊中的字符集列表。
    可以在控制臺輸入:SHOW COLLATION LIKE 'gb%';,查看以gb開頭的所有字符集。
    先將表“userinfo”恢復名稱為“user”,查看表“user”:
    clip_image014
    查看表“user”的結構:
    clip_image015
    添加列“photo”:

    clip_image016

    修改列“sex”屬性-類型為“bit”:

    clip_image017

    修改列“email”名稱為“address”:

    clip_image018

    刪除列“address”:

    clip_image019

    3. 數據庫CURD語句:

    Insert語句:

    INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);

    例,向“user”表中插入一條新數據:

    clip_image021

    Update語句:

    UPDATE tbl_name  SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]

    例,將“sex”為1的人的“name”修改為“changcheng”:

    clip_image022

    clip_image023

    Delete語句:

    delete from tbl_name [WHERE where_definition]

    例,刪除剛才添加的新記錄:

    clip_image024

    如果沒有后邊的where條件,則刪除表中所有的數據。

    truncate table tbl_name;是刪除表,然后立即創建一個新表。

    clip_image025

    4. Select查詢語句(因為它是重點,所以單獨拿出來):

    1. 基本select語句:

    SELECT [DISTINCT] *|{column1, column2. column3..} FROM table;

    例,我們新創建了一個sutdent表,查看表中的所有記錄:

    clip_image026

    例,查詢表中所有學生姓名和他的數學成績:

    clip_image027

    例,過濾表中的重復數據(distinct):

    clip_image028

    2. 在select語句中可使用表達式對查詢的列進行運算:

    SELECT *|{column1|expression, column2|expression,..} FROM table;

    例,將所有學習的數學加上10分:

    clip_image029

    例,統計學生的總分:

    clip_image030

    3. 在select語句中可使用as語句:

    SELECT column as 別名 from 表名;

    例,修改統計學生總分的列名:

    clip_image031

    4. 在select語句中加上where條件,進行過濾查詢:

    例,查詢總分大于260分的學生:

    clip_image033

    5. where經常使用的運算符:

    比較運算符

    > < <= >= = <>

    大于、小于、大于(小于)等于、不等于

    BETWEEN ...AND...

    顯示在某一區間的值

    IN(set)

    顯示在in列表中的值,例:in(100,200)

    LIKE ‘pattern’

    模糊查詢,Like語句中,% 代表零個或多個字符,_ 代表一個字符,例first_name like ‘_a%’;

    IS NULL

    判斷是否為空

    邏輯運算符

    and

    多個條件同時成立

    or

    多個條件任一成立

    not

    不成立,例:where not(salary>100);

    例,查詢數學成績在80-90之間的學生:

    clip_image034

    例,查詢數據成績為90、80、78的學生:

    clip_image036

    例,查詢所有名字以“a”開頭的學生的數學成績:

    clip_image037

    6. 使用order by 子句排序查詢結果:

    SELECT column1, column2. column3.. FROM table order by column asc|desc

    clip_image039

    5. 合計函數:

    1. Count返回滿足where子句條件的行的總數:

    Select count(*)|count(列名) from tablename [WHERE where_definition]

    例,查詢共有多少學生:

    clip_image040

    例,查詢總分大于250分的人數:

    clip_image041

    2. Sum函數返回滿足where條件的行的和:

    Select sum(列名){,sum(列名)…} from tablename [WHERE where_definition] 

    注意:sum僅對數值起作用,否則會報錯。

    例,統計本班數學成績的平均分:

    clip_image042

    例,統計各科總成績:

    clip_image043

    3. AVG函數返回滿足where條件的一列的平均值:

    Select avg(列名){,avg(列名)…} from tablename [WHERE where_definition] 

    例,求數學的平均分:

    clip_image044

    例,求總平均分:

    clip_image045

    4. Max/min函數返回滿足where條件的一列的最大/最小值:

    Select max(列名) from tablename [WHERE where_definition]

    例,查詢數學成線最高分和最低分:

    clip_image046

    6. 分組與過濾:

    1. 使用group by 子句對列進行分組:

    SELECT column1, column2. column3.. FROM table group by column

    例,按照ID分組并對數據成績求和:

    clip_image047

    2. 使用having 子句過濾:

    SELECT column1, column2,column3 ... FROM table group by column having ...

    Having和where均可實現過濾,但在having可以使用合計函數,having通常跟在group by后,它作用于組。

    例,按id分組,查詢數學成績組總和大于100的組:

    clip_image048

    例,查詢數據成績>=90的學生:

    clip_image049

    7. 時間日期相關函數:

    ADDTIME (date2 ,time_interval )

    將time_interval加到date2

    CURRENT_DATE (  )

    當前日期

    CURRENT_TIME (  )

    當前時間

    CURRENT_TIMESTAMP ( )

    當前時間戳

    DATE (datetime )

    返回datetime的日期部分

    DATE_ADD (date2 , INTERVAL d_value d_type )

    在date2中加上日期或時間

    DATE_SUB (date2 , INTERVAL d_value d_type )

    在date2上減去一個時間

    DATEDIFF (date1 ,date2 )

    兩個日期差

    NOW (  )

    當前時間

    YEAR|Month|DATE (datetime )

    年月日

    8. 字符串相關函數:

    CHARSET(str)

    返回字串字符集

    CONCAT (string2  [,... ])

    連接字串

    INSTR (string ,substring )

    返回substring在string中出現的位置,沒有返回0

    UCASE (string2 )

    轉換成大寫

    LCASE (string2 )

    轉換成小寫

    LEFT (string2 ,length )

    從string2中的左邊起取length個字符

    LENGTH (string )

    string長度

    REPLACE (str ,search_str ,replace_str )

    在str中用replace_str替換search_str

    STRCMP (string1 ,string2 )

    逐字符比較兩字串大小,

    SUBSTRING (str , position  [,length ])

    從str的position開始,取length個字符

    LTRIM (string2 ) RTRIM (string2 )

    去除前端空格或后端空格

    9. 數學相關函數:

    ABS (number2 )

    絕對值

    BIN (decimal_number )

    十進制轉二進制

    CEILING (number2 )

    向上取整

    CONV(number2,from_base,to_base)

    進制轉換

    FLOOR (number2 )

    向下取整

    FORMAT (number,decimal_places )

    保留小數位數

    HEX (DecimalNumber )

    轉十六進制

    LEAST (number , number2  [,..])

    求最小值

    MOD (numerator ,denominator )

    求余

    RAND([seed])

    RAND([seed])

    10. 定義表的約束:

    1. 定義主鍵:

    Primary key,在預定義主鍵的列后邊加上此屬性。

    例,創建student表時,將id設為主鍵:

    clip_image050

    刪除、添加主鍵屬性:

    clip_image051

    2. 定義非空約束:

    not null,在預定義主鍵的列后邊加上此屬性:

    例,將name列設置為非空:

    clip_image052

    此時,當向表中添加新數據時,name必須指定值。可以使用“is null”判斷某一記錄的值是否為空。

    3. 定義列值自動增長:

    Auto_increment,在預定義主鍵的列后邊加上此屬性:

    例,定義id為主鍵且自動增長:

    clip_image053

    4. 定義外鍵約束:

    這個是今天課程中,唯一涉及到兩個表的SQL語句操作。

    constraint ordersid_FK foreign key(ordersid) references orders(id),在預定義外鍵的列后邊加上此屬性:

    例,定義一個classes表,然后再定義一個students表:

    創建classes表:

    clip_image054

    創建students表:

    clip_image056

    當向students表中添加一條記錄時,如果指定的class_id值在classes表中不存在,添加就會失敗!如果對應的classes表中的id值被修改了,那么也需要手動修改students表中的class_id值。

    如果創建庫和表,以及對它們的操作過多的話,逐條手動鍵入SQL語句是一件痛苦的事。SQL的腳本文件(*..sql)可以為我們解決這一難題。Sql文本文件中保存的是我們要手動鍵入所有的SQL語句,使用source filename語句,導入sql腳本文件。比如:“source C:\test.sql”。

    OK,終于搞完了!也當做練習了,不過是按照老方的PPT一步步來的,有點侵權的感覺。不過我想沒問題的,老方對此會很高興的。

    SQL語句本身并不復雜,做為程序員并不需要完全掌握數據庫。數據庫的優化上全由DBA來做。我們需要掌握對數據庫的增、刪、改、查這些SQL語句即可!

    今日的課程沒有多深的理論與實踐,主要就是講解SQL語句。同學們學習效果很好!

    posted @ 2009-11-30 14:39 長城 閱讀(865) | 評論 (0)編輯 收藏

    2009年11月29日

         摘要:            今日的課程內容是JavaWEB國際化和EL表達式,EL表達式在之前的課程中有使用過,但并未深入。今日的內容整體上比較輕松,當我看到JavaWEB國際化時,還以為內容很多。國際化嗎!以為在某些編寫操作上有什么國際化的特殊要求?呵呵,其實我們的編寫方式本身就已經是國際化的了。這里的國際化是...  閱讀全文

    posted @ 2009-11-29 18:55 長城 閱讀(986) | 評論 (1)編輯 收藏

    主站蜘蛛池模板: 免费国产叼嘿视频大全网站| 亚洲AV无码第一区二区三区| 67194熟妇在线永久免费观看| 永久免费精品影视网站| ASS亚洲熟妇毛茸茸PICS| 亚洲av永久无码制服河南实里| 国产a不卡片精品免费观看| 在线看片韩国免费人成视频| 99精品视频免费| 国产亚洲福利一区二区免费看| 亚洲熟妇av一区二区三区下载| 亚洲午夜久久久久妓女影院| 国产成人综合久久精品免费| 欧洲乱码伦视频免费| 日本免费一区二区三区四区五六区| japanese色国产在线看免费| 亚洲AV无码国产精品永久一区| 亚洲国产成人久久99精品| 久久久久亚洲av无码专区蜜芽| 亚洲综合色成在线播放| 又粗又硬免费毛片| 日本人护士免费xxxx视频| 成人在线免费观看| 色婷婷7777免费视频在线观看| 99热这里只有精品6免费| 久久国产乱子伦精品免费强| 99精品视频免费| 二区久久国产乱子伦免费精品| 成人免费网站久久久| 色哟哟国产精品免费观看| 美女扒开尿口给男人爽免费视频| 亚洲经典千人经典日产| 亚洲精品永久在线观看| 亚洲色大情网站www| 亚洲日本中文字幕天天更新| 亚洲中文字幕乱码AV波多JI| 99久久国产亚洲综合精品| 亚洲精品午夜国产va久久| 四虎必出精品亚洲高清| 亚洲欧洲国产综合AV无码久久| 国产亚洲sss在线播放|