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

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

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

    Feng.Li's Java See

    抓緊時間,大步向前。
    隨筆 - 95, 文章 - 4, 評論 - 58, 引用 - 0
    數(shù)據(jù)加載中……

    hibernate簡述

    1. 什么是hibernate?
    2. hibernate的知識內(nèi)容
    3. 什么是對象持久化?對象持久化有什么用?(解決的問題)
    4. 如何對象持久化?
    5. 如何用數(shù)據(jù)庫的方法做對象持久化?
    6. ORM(對象關(guān)系映射)是什么?有什么作用?
    7. ORM從對象到表所要考慮的問題
    8. 什么是ORM框架?有什么用?
    9. 使用hibernate的方法做對象持久化的工作,程序員應該怎么做?
    10. hibernate有什么用?
    11. 程序員和hibernate的整體工作流程
    什么是hibernate:
    持久化的框架,屬于設(shè)計方面的內(nèi)容,類庫,用來做對象持久化的,什么是對象持久化呢?

    Hibernate的知識內(nèi)容:
    語法部分(類庫)
    程序設(shè)計思想,也就是持久層的設(shè)計

    什么是對象持久化?對象持久化有什么用?(解決的問題):
    發(fā)現(xiàn)問題:
    程序設(shè)計的架構(gòu): 表現(xiàn)層—業(yè)務(wù)層—持久層—數(shù)據(jù)庫層,其中表現(xiàn)層和業(yè)務(wù)層是JVM來執(zhí)行,應用程序會產(chǎn)生許多的對象,如果斷電了,對象就消失了,也就是說在內(nèi)存中的對象是不穩(wěn)定的,狀態(tài)不能持久
    發(fā)現(xiàn)問題:
    將一個對象從A電腦復制到B電腦,如何做到呢?

    那么有三種方法解決上面的問題:
    1. 序列化: 通過網(wǎng)絡(luò)傳遞,或者硬盤共享
    2. 存儲到數(shù)據(jù)庫中,誰想用,從數(shù)據(jù)庫中拿
    3. EJB Entity Bean(實體Bean)

    序列化的方法比較死板:如果當一個對象的結(jié)構(gòu)比較復雜的時候,我們這時只需要一部分內(nèi)容,沒有辦法,只能整個寫入到文件,整個讀取
    序列化的缺點: 不能檢索,不能分離一個對象,不方便共享
    所以說第一種方法只能用于做臨時的持久化,簡單的傳輸,但不適合復雜的持久化工作

    第二種方法(數(shù)據(jù)庫持久化):檢索方便,分布式共享,永久數(shù)據(jù)

    總結(jié):
    什么是對象持久化: 對象持久化就是把內(nèi)存中的對象永久的保存起來,保護對象的狀態(tài),方便使用
    對象持久化有什么用: 1.解決掉電的問題 2.共享方便 3.保證對象安全檢索方便

    如何對象持久化:
    1. 對象序列化
    2. 數(shù)據(jù)庫(JDBC,EJB,Hibernate)

    如何用數(shù)據(jù)庫的方法做對象持久化:
    1. JDBC
    發(fā)現(xiàn)問題: 需要做大量的工作,難度大
    2. EJB
    使用的是其中的一個功能來做持久化,解決了使用JDBC方法的的大量工作的問題
    發(fā)現(xiàn)問題: EJB是重量級的組件,要使用它,有兩個問題 1.成本 2.性能

    發(fā)現(xiàn)問題: 以上兩種方式還有個共同的問題,對象不是簡單存儲在數(shù)據(jù)庫中的,比如多態(tài)的特點就不能處理 A b=new B(); B為A的子類

    3. Hibernate
    解決了以上的所有問題,作用:1.不用做大量的工作 2.移植性能好 3.提高了代碼的質(zhì)量,簡單 4.檢索共享重用成本調(diào)試

    ORM(對象關(guān)系映射)是什么?有什么作用?
    發(fā)現(xiàn)問題:
    java中的對象的屬性類型和數(shù)據(jù)庫中的字段類型是不一樣的,那么如何來存儲java中的對象呢?這就需要做對象關(guān)系的映射,也就是ORM
    什么是ORM: 將內(nèi)存中的對象和數(shù)據(jù)庫做轉(zhuǎn)化,這樣就實現(xiàn)了java與數(shù)據(jù)庫之間的訪問等功能

    ORM從對象到表所要考慮的問題:
    Orm的復雜問題:
    1. 數(shù)據(jù)庫如何保證對象的唯一性:在內(nèi)存中,兩個對象屬性值都一樣,但是內(nèi)存地址不一樣,可以做區(qū)分,但是在數(shù)據(jù)庫中如何分辨呢?
    2. 繼承關(guān)系如何轉(zhuǎn)化
    3. 集合如何映射呢?

    什么是ORM框架?有什么用?
    就是一個類庫,通過這個類庫完成持久化層的設(shè)計

    使用hibernate的方法做對象持久化的工作,程序員應該怎么做?
    1. 將ORM方案定下來,就是類到數(shù)據(jù)庫的轉(zhuǎn)化 2.利用hibernate生成代碼
    hibernate有什么用?
    1. 完成jdbc的代碼
    2. 管理持久化對象的狀態(tài)
    3. 提供一個查詢的API

    程序員和hibernate的整體工作流程
    程序員:
    1. 設(shè)計ORM方案
    2. 寫配置文件
    3. 調(diào)用Hibernate的API,向Hibernate發(fā)出命令
    hibernate:
    4. 讀配置文件
    5. 生成jdbc代碼
    6. 執(zhí)行

    Hibernate簡單實例
    Hibernate語法:
    作用: 數(shù)據(jù)庫的增刪改查 HQL面向?qū)ο蟮牟樵冋Z句

    大致步驟:
    1. 設(shè)置環(huán)境 類庫
    2. 定義映射
    A 定義映射的實體po
    B 建立數(shù)據(jù)庫表
    C 寫XML配置文件(表,數(shù)據(jù)庫)
    3. 調(diào)用Hibernate API
    A 管理po的狀態(tài)(增刪改,恢復po狀態(tài))
    B 檢索(查詢)

    Hibernate第一個簡單的實例: 引例(frisHbn包)
    1. 設(shè)置環(huán)境
    hibernate配置環(huán)境需要的資源
    Hibernate的jar包: lib.zip dtd.zip: dtd.zip可以不設(shè)置
    2. 定義映射
    建立項目:
    bussiness包: entity包 Biz包業(yè)務(wù)
    client包: 測試
    util包: 工具

    先寫持久化類: 以花為實體,建立花類,并且建立數(shù)據(jù)庫表
    /**
    * 建表語句:
    * CREATE TABLE T_FRUIT(
    FID NUMBER(10) PRIMARY KEY,
    NAME VARCHAR(20) NOT NULL,
    COMMENTS VARCHAR(50),
    PRICE NUMBER(5) NOT NULL
    );
    */
    package Yuchen.fristHbn.business.entity;
    //持久化類(花類),注意因為采用的是hilo的方式獲得id,所以需要有setid的方法
    public class Fruit {

    private Integer fid;//hibernate中的id不能識別int
    private String name;
    private String comments;
    private int price;

    public Fruit() {
    super();
    }

    public Fruit(String name, String comments, int price) {
    super();
    this.name = name;
    this.comments = comments;
    this.price = price;
    }

    public String getComments() {
    return comments;
    }
    public void setComments(String comments) {
    this.comments = comments;
    }

    public Integer getFid() {
    return fid;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int getPrice() {
    return price;
    }
    public void setPrice(int price) {
    this.price = price;
    }

    public void setFid(Integer fid) {
    this.fid = fid;
    }

    }

    使用hilo的方式獲得id:
    建表語句:
    CREATE TABLE T_HILO(HILO_ID NUMBER(10));
    INSERT INTO T_HILO VALUES(1);

    寫hibernate的連接數(shù)據(jù)庫的配置文件:
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    <session-factory>
    <property name="show_sql">true</property>
    <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
    <property name="connection.url">jdbcracle:thin127.0.0.1:1521:name</property>
    <property name="connection.username">scott</property>
    <property name="connection.password">tiger</property>
    <property name="connection.isolation">2</property>
    <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
    <mapping resource="Yuchen/fristHbn/business/entity/Fruit.hbm.xml"/>
    </session-factory>
    </hibernate-configuration>

    寫映射配置文件:
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="Yuchen.fristHbn.business.entity">
    <class name="Fruit" table="T_FRUIT">
    <id name="fid" column="fid">
    <generator class="hilo">
    <param name="table">t_hilo</param>
    <param name="column">hilo_id</param>
    </generator>
    </id>
    <property name="name" column="name" />
    <property name="comments" column="comments"></property>
    <property name="price" column="price"></property>
    </class>
    </hibernate-mapping>
    A. 類名—表名
    B. id—id 獲得id的方式 詳細信息(如: hilo的表名和字段)
    C. 屬性—字段

    使用hibernate API(FruitManager.java):
    package Yuchen.fristHbn.business.Biz;
    //業(yè)務(wù)邏輯類:負責增刪改查通過使用hibernate API進行
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;

    import Yuchen.fristHbn.business.entity.Fruit;

    public class FruitManager {
    public void insert(Fruit fruit){
    Configuration config=new Configuration();
    config.configure();//讀配置文件
    SessionFactory sf=config.buildSessionFactory();//得到工廠
    Session session=sf.openSession();//得到session
    Transaction tt=session.beginTransaction();//檢查事務(wù)開啟
    session.save(fruit);//存儲insert
    tt.commit();//提交
    session.close();//關(guān)閉資源
    }
    }



    寫測試類: 插入一個對象到數(shù)據(jù)庫中
    /**
    * 知識點:
    * hibernate基礎(chǔ):練習語法部分API和簡單的映射關(guān)系
    * 程序目標:
    * 使用hibernate方法將對象進行持久化
    * 實現(xiàn)數(shù)據(jù)庫的增刪改查
    * API:
    * 1.Configuration:這個類負責讀取XML文檔(映射配置文件)
    * configure():讀xml
    * buildSessionFactory():創(chuàng)建一個生產(chǎn)session對象的工廠,其實是再次檢查
    * 因為hibernate和jdbc不一樣,jdbc是如果不手動設(shè)置開啟事務(wù),那它
    * 就是馬上執(zhí)行sql的,hibernate的不會馬上執(zhí)行,是事務(wù)提交后執(zhí)行
    * 默認情況下就是打開事務(wù)的狀態(tài),這里只是再檢查以下
    * 2.SessionFactory:負責生產(chǎn)session對象
    * openSession():創(chuàng)建一個session
    * 3.Session類:這個是主要的類,負責增刪改查,開啟事務(wù)等
    * beginTransaction():產(chǎn)生一個事務(wù)對象(Transaction)
    * save():增加相當于操作sql中的insert語句
    * 4.Transaction類:負責管理事務(wù)的
    * commit():提交一個事務(wù)
    *
    */
    package Yuchen.fristHbn.client;

    import Yuchen.fristHbn.business.Biz.FruitManager;
    import Yuchen.fristHbn.business.entity.Fruit;

    public class Test {

    public static void test1(){
    Fruit fruit=new Fruit("lisi","hello",100);
    // fruit.setName("zhangsan");
    // fruit.setComments("hello");
    // fruit.setPrice(100);

    FruitManager fm=new FruitManager();
    fm.insert(fruit);
    }
    public static void main(String[] args) {
    // TODO 自動生成方法存根
    Test t=new Test();
    t.test1();
    }

    }

    hibernate API(一):
    Configuration: 讀取配置文件信息用來初始化的
    SessionFactory: 重量級對象,特點:消耗資源大,線程是安全,所以可以被共享
    上面兩個對象只實例化一個就行了,都是用于初始化的
    Session: 線程是不安全的,所以要避免多個線程共享它,是輕量級的對象,使用后關(guān)閉

    Session對象的狀態(tài):
    順態(tài): 還沒有被持久化,也就是說數(shù)據(jù)庫中沒有該對象的記錄,并且Session中的緩沖區(qū)里沒有這個對象的引用
    持久態(tài): 在數(shù)據(jù)庫中有該對象的記錄,并且在session中的緩沖區(qū)里有這個對象的引用,和順態(tài)正好相反
    游離態(tài): 在數(shù)據(jù)庫中有記錄,但是不在session的緩沖區(qū)里

    對象狀態(tài)的轉(zhuǎn)換:
    做一個工具類,將hibernate中重復的代碼包裝起來:
    package Yuchen.fristHbn.util;
    //生產(chǎn)session對象的工具類
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;

    public class HbnUtil {
    private static SessionFactory sf;
    static{
    sf=new Configuration().configure().buildSessionFactory();
    }

    public static Session getSession(){
    return sf.openSession();
    }
    }

    完善FruitManager類:
    package Yuchen.fristHbn.business.Biz;
    //業(yè)務(wù)邏輯類:負責增刪改查通過使用hibernate API進行
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;

    import Yuchen.fristHbn.business.entity.Fruit;
    import Yuchen.fristHbn.util.HbnUtil;

    public class FruitManager {
    public Integer insert(Fruit fruit){
    Session session=HbnUtil.getSession();//通過工具更方便了
    Integer id=null;
    // Configuration config=new Configuration();
    // config.configure();//讀配置文件
    // SessionFactory sf=config.buildSessionFactory();//得到工廠
    // Session session=sf.openSession();//得到session
    Transaction tt=session.beginTransaction();//檢查事務(wù)開啟
    id=(Integer)session.save(fruit);//存儲insert
    tt.commit();//提交
    session.close();//關(guān)閉資源
    return id;
    }

    public Fruit selectId(Integer id){
    Session session=HbnUtil.getSession();
    Transaction t=session.beginTransaction();
    Fruit fruit=(Fruit)session.get(Fruit.class, id);
    t.commit();
    session.close();
    return fruit;
    }

    public void remove(Fruit fruit){
    Session session=HbnUtil.getSession();
    Transaction t=session.beginTransaction();
    session.delete(fruit);
    t.commit();
    session.close();
    }
    }

    測試對象狀態(tài)的轉(zhuǎn)換:
    /**
    * 知識點:
    * hibernate基礎(chǔ):練習語法部分API和簡單的映射關(guān)系
    * 程序目標:
    * 使用hibernate方法將對象進行持久化
    * 實現(xiàn)數(shù)據(jù)庫的增刪改查
    * API:
    * 1.Configuration:這個類負責讀取XML文檔(映射配置文件)
    * configure():讀xml
    * buildSessionFactory():創(chuàng)建一個生產(chǎn)session對象的工廠,其實是再次檢查
    * 因為hibernate和jdbc不一樣,jdbc是如果不手動設(shè)置開啟事務(wù),那它
    * 就是馬上執(zhí)行sql的,hibernate的不會馬上執(zhí)行,是事務(wù)提交后執(zhí)行
    * 默認情況下就是打開事務(wù)的狀態(tài),這里只是再檢查以下
    * 2.SessionFactory:負責生產(chǎn)session對象
    * openSession():創(chuàng)建一個session
    * 3.Session類:這個是主要的類,負責增刪改查,開啟事務(wù)等
    * beginTransaction():產(chǎn)生一個事務(wù)對象(Transaction)
    * save():增加相當于操作sql中的insert語句
    * 4.Transaction類:負責管理事務(wù)的
    * commit():提交一個事務(wù)
    * test1():測試插入的功能
    * test2():測試數(shù)據(jù)同步更新的功能
    * test3():測試saveOrUpdate()
    * test4():測試clear()和flush()
    */
    package Yuchen.fristHbn.client;

    import org.hibernate.Session;
    import org.hibernate.Transaction;

    import Yuchen.fristHbn.business.Biz.FruitManager;
    import Yuchen.fristHbn.business.entity.Fruit;
    import Yuchen.fristHbn.util.HbnUtil;

    public class Test {

    public void test1(){
    Fruit fruit=new Fruit("lisi","hello",100);
    // fruit.setName("zhangsan");
    // fruit.setComments("hello");
    // fruit.setPrice(100);

    FruitManager fm=new FruitManager();
    fm.insert(fruit);
    }

    public void test2(){
    //測試同步更新的功能
    Fruit fruit=new Fruit("meigui","hongse",70);//順態(tài)
    FruitManager fm=new FruitManager();
    Fruit fruit2=new Fruit();

    Integer id=fm.insert(fruit);
    fruit2=fm.selectId(id);
    System.out.println(fruit2.getFid());
    System.out.println(fruit2.getName());

    fruit.setName("ziluolan");//這里修改了對象
    fruit2=fm.selectId(id);
    System.out.println(fruit2.getFid());//但是結(jié)果沒有更新
    System.out.println(fruit2.getName());
    //因為fruit在Integer id=fm.insert(fruit);后變成游離態(tài)了
    //也就是說只有持久態(tài)才能實現(xiàn)同步更新
    System.out.println(fruit.getFid());
    System.out.println(fruit.getName());
    }

    public void test3(){
    Session session=HbnUtil.getSession();
    Transaction t=session.beginTransaction();
    Fruit fruit=new Fruit("ziluolan","lanse",100);//順態(tài)
    Fruit fruit2=new Fruit();
    FruitManager fm=new FruitManager();
    session.save(fruit);//fruit在運行完此句后變?yōu)橛坞x態(tài)
    fruit2=(Fruit) session.get(Fruit.class, fruit.getFid());
    //從數(shù)據(jù)庫讀并打印出來
    System.out.println(fruit2.getFid()+":"+fruit2.getName());

    session.saveOrUpdate(fruit);//如果該對象為游歷態(tài)就更新數(shù)據(jù)庫update
    //否則就是順態(tài),增加insert
    fruit2=(Fruit) session.get(Fruit.class, fruit.getFid());
    //saveOrUpdate后再從數(shù)據(jù)庫讀并打印出來
    System.out.println(fruit2.getFid()+":"+fruit2.getName());
    //兩個打印結(jié)果一樣,saveOrUpdate方法判斷如果id為null,就
    //順態(tài),否則就是游離態(tài)
    t.commit();
    session.close();
    }

    public void test4(){
    Session session=HbnUtil.getSession();
    Transaction t=session.beginTransaction();
    Fruit fruit=new Fruit("guihua","fense",300);//順態(tài)
    Fruit fruit2=new Fruit();
    session.saveOrUpdate(fruit);//執(zhí)行insert因為對象為順態(tài)
    // session.flush();
    session.clear();//fruit變成游離態(tài)了,并且不會執(zhí)行insert語句
    //因為hibernate不是馬上執(zhí)行sql,而是等t.commit()提交事務(wù)
    //后才執(zhí)行,clear后,對象為游離態(tài)

    session.saveOrUpdate(fruit);//這里驗證上面的話,執(zhí)行update
    //做個select查看一下,可以證明,因為clear后,沒有馬上執(zhí)行
    //sql語句,所以表里沒有數(shù)據(jù),這里update也沒有用,所以表中
    //一個對象也沒插入,但是如果加入flush()刷新就是馬上執(zhí)行sql了

    t.commit();
    session.close();
    }
    public static void main(String[] args) {
    // TODO 自動生成方法存根
    Test t=new Test();
    // t.test1();
    // t.test2();
    // t.test3();
    t.test4();
    }

    }

    hibernate API(二):
    flush(): 從上面的例子可以看出,flush是刷新session的緩沖區(qū),并執(zhí)行里面的命令
    flush()的事務(wù)管理模式: flushMode()里面有三個常量,可以用數(shù)字來表示
    Load(): 另一種讀取數(shù)據(jù)的方法,和get的區(qū)別是: 1.異常處理: load有異常處理,get沒有,它返回null,2.get從數(shù)據(jù)庫讀數(shù)據(jù),load可能去讀緩沖區(qū)

    事務(wù)的隔離級別:
    在hibernate的數(shù)據(jù)庫配置文件中設(shè)置
    數(shù)字1為可以臟讀,數(shù)字2為不能,這個是最常用的

    鎖機制:
    避免并發(fā)沖突,在數(shù)據(jù)庫中寫數(shù)據(jù)是自動加鎖的,讀一般不加,有悲觀鎖和樂觀鎖
    樂觀鎖是可以是hibernate程序自己加
    實現(xiàn)樂觀鎖: 引例(hbn2包)
    步驟:
    1. 在表中加個version字段
    2. 在持久類里加個version屬性
    3. 配置文件<version name=”versopm”> 每存一次值加1

    引例:hbn2包

    復雜的映射:
    1. 基數(shù)關(guān)系映射
    2. 繼承關(guān)系映射
    3. 組件關(guān)系映射
    4. 集合映射

    基數(shù)關(guān)系的映射—one to one:
    基數(shù)關(guān)系的映射需要考慮的問題:
    1. 數(shù)量問題
    2. 方向問題
    在one to one的關(guān)系中,我們有兩種方法可以體現(xiàn)類與類之間的關(guān)系
    1. 共享主鍵
    2. 外鍵唯一
    引例: Joto包-此包引用了fristHbn包

    建立與Fruit類有一對一關(guān)系的類:
    我們認為一個花有一個產(chǎn)地,一個產(chǎn)地生產(chǎn)一種花,所以要建立產(chǎn)地類
    package Yuchen.Joto.business.entity;
    //花的地址類
    //問題:為什么不能在構(gòu)造函數(shù)中寫Fruit?因為生成對象后要持久化
    //這個對象,但是數(shù)據(jù)庫的表中不能插入另一個類的值,寫上null又不
    //大合適,所以就去掉它
    public class Address {
    private Integer aid;
    private String nation;
    private String postcode;
    private Fruit fruit;
    public Address() {

    }
    public Address(String nation, String postcode) {
    super();
    this.nation = nation;
    this.postcode = postcode;
    }
    public Integer getAid() {
    return aid;
    }
    public void setAid(Integer aid) {
    this.aid = aid;
    }
    public Fruit getFruit() {
    return fruit;
    }
    public void setFruit(Fruit fruit) {
    this.fruit = fruit;
    // fruit.setAddress(this);
    }
    public String getNation() {
    return nation;
    }
    public void setNation(String nation) {
    this.nation = nation;
    }
    public String getPostcode() {
    return postcode;
    }
    public void setPostcode(String postcode) {
    this.postcode = postcode;
    }

    }

    修改Fruit類:
    package Yuchen.Joto.business.entity;
    //持久化類(花類),注意因為采用的是hilo的方式獲得id,所以需要有setid的方法
    public class Fruit {

    private Integer fid;//hibernate中的id不能識別int
    private String name;
    private String comments;
    private int price;
    private Address address;//一朵花對應一個地址

    public Fruit() {
    super();
    }

    public Fruit(String name, String comments, int price) {
    super();
    this.name = name;
    this.comments = comments;
    this.price = price;
    }

    public Address getAddress() {
    return address;
    }

    public void setAddress(Address address) {
    this.address = address;
    address.setFruit(this);//因為當你給一個花設(shè)置產(chǎn)地的時候
    //該產(chǎn)地也有了花
    }

    public String getComments() {
    return comments;
    }
    public void setComments(String comments) {
    this.comments = comments;
    }

    public Integer getFid() {
    return fid;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public int getPrice() {
    return price;
    }
    public void setPrice(int price)

    posted on 2007-08-21 18:18 小鋒 閱讀(387) 評論(0)  編輯  收藏 所屬分類: J2EE

    主站蜘蛛池模板: 91成人免费观看网站| 野花香高清在线观看视频播放免费| 四虎在线成人免费网站| 久久精品亚洲综合专区| 国产日韩AV免费无码一区二区| 亚洲熟女少妇一区二区| 国产无遮挡无码视频免费软件| 中文字幕亚洲日韩无线码| XXX2高清在线观看免费视频| 亚洲中文字幕久久精品无码喷水| 久久国产精品免费一区二区三区| 中文字幕亚洲天堂| 成人A片产无码免费视频在线观看| 亚洲动漫精品无码av天堂| 国产成人精品无码免费看| 亚洲精品美女在线观看| 最近免费2019中文字幕大全| 亚洲专区中文字幕| 日本人的色道www免费一区| 麻豆91免费视频| 亚洲精品色午夜无码专区日韩| 一级毛片免费毛片一级毛片免费| 久久精品国产亚洲AV无码偷窥| 美女视频黄的全免费视频| 亚洲欧美日韩中文字幕一区二区三区 | 亚洲成人网在线播放| 免费a级毛片无码a∨蜜芽试看| 91视频免费观看高清观看完整| 亚洲人色婷婷成人网站在线观看| 国产麻豆一精品一AV一免费| 亚洲小视频在线播放| 四虎永久在线精品免费观看地址| WWW免费视频在线观看播放| 77777_亚洲午夜久久多人| 午夜色a大片在线观看免费| 成人免费夜片在线观看| 亚洲福利电影在线观看| 日本无吗免费一二区| 在线播放免费人成毛片乱码| 中文字幕无码精品亚洲资源网久久| 日本在线免费观看|