<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Java究竟怎么玩?

      天地程序已定棋,人間大數(shù)待變局

        博客園  :: 首頁  :: 新隨筆  :: 聯(lián)系 :: 訂閱 訂閱  :: 管理
      ------------------------------
       Loonframework-DAO-Alpha-0.1.0 - 2008年2月24日
      ------------------------------

      開發(fā)JDK: JDK1.4(所以此版本不支持Annotation)

      文件名稱:Loonframework-DAO-Alpha-0.1.0.jar
                          Loonframework-DAO-Alpha-0.1.0-src.zip

      版本聲明:此為測試用版本,是一個供測試與調(diào)整用的系統(tǒng)原型,不保證現(xiàn)有接口或函數(shù)實現(xiàn)在可見的未來無變更,不保證運行效率及錯誤會得到有效處理,強(qiáng)烈反對任何個人或組織將此版本投入到實際或自認(rèn)為有用的項目中……

      版權(quán)聲明:Loonframework下屬所有源碼遵循Apache License 2.0協(xié)議,保留對其下代碼的版權(quán),任何對源代碼的改進(jìn)和變動,請告知原作者;不能將Loonframework全部或部分編譯后再以其他項目名義發(fā)布, 不得經(jīng)簡單修改單獨商品化銷售.所有對Loonframework源碼與文檔的引用和轉(zhuǎn)載請注明出處.

      1.什么是Loonframework

      Loonframework由三個子項目構(gòu)成,分別對應(yīng)DAO框架實現(xiàn),WEB框架實現(xiàn),以及一個2D的GAME框架實現(xiàn),全部完成后將作為一個快速開發(fā)用綜合框架而存在;目前三部分都尚處于開發(fā)階段。

      2.關(guān)于Loonframework-DAO

      Loonframework-DAO是loonframework項目下的DAO實現(xiàn),是一個輕量級、低外部依賴度的實現(xiàn);為實現(xiàn)小規(guī)模項目的快速開發(fā)而誕生,目前提供了jdbc數(shù)據(jù)接口的封裝及簡單的pojo應(yīng)用處理能力(但并不是徹底的orm)。loonframework-DAO本身是一個試驗性質(zhì)的項目,內(nèi)部提供了事務(wù)、日志、Cache、異常處理等方面的簡單實現(xiàn),能夠不依賴于任何第三方項目而單獨運行,當(dāng)然也可以通過接口選擇和其它項目并用,將會陸續(xù)提供支持第三方的template以供調(diào)用。

      3.關(guān)于Loonframework-DAO的文件構(gòu)成


      本次公開測試的代碼部分如上圖所示。

      4.關(guān)于Loonframework-DAO的初始化設(shè)置

      Loonframework-DAO通過讀取cfg.lf.xml文件初始化設(shè)置,該文件基本配置如下:
      <?xml version="1.0" encoding="UTF-8"?>
      <loon>
        
      <!-- 在loonframework中,配置會映射到一個對象實體進(jìn)行操作,DAOFruit為數(shù)據(jù)驅(qū)動設(shè)定 --> 
        
      <pojo id="dao" class="org.loon.framework.pojo.sys.DAOFruit">
        
      <!-- 驅(qū)動別名,選填 -->
           
      <set name="alias"><value type="string">mysql</value></set>
        
      <!-- jdbc驅(qū)動類,可使用全寫也支持'mysql'、'oralce'這樣的簡寫方式 -->   
           
      <set name="jdbcClass"><value type="string">org.gjt.mm.mysql.Driver</value></set>
        
      <!-- url地址 -->            <set name="url"><value type="string">jdbc:mysql://localhost:3306/test?useUnicode=true</value></set>
        
      <!-- 用戶名 -->    
           
      <set name="use"><value type="string">ltest</value></set>
        
      <!-- 密碼 -->
           
      <set name="pwd"><value type="string"></value></set>
        
      <!-- 最小連接數(shù),選填。loonframework-dao內(nèi)置有一個小型的連接池,可通過DAOManager類啟動-->     
           
      <set name="minconnection"><value type="int">100</value></set>
        
      <!-- 最大連接數(shù),選填-->     
           
      <set name="maxconnection"><value type="int">100</value></set>
        
      <!-- 超時設(shè)定 -->
           
      <set name="timeout"><value type="int">5</value></set>
         
      </pojo>
         
      <pojo id="jtds" class="org.loon.framework.pojo.sys.DAOFruit">
           
      <set name="alias"><value type="string">jtds</value></set>
           
      <set name="jdbcClass"><value type="string">net.sourceforge.jtds.jdbc.Driver</value></set>
           
      <set name="url"><value type="string">jdbc:jtds:sqlserver://localhost:1433/test</value></set>
           
      <set name="use"><value type="string">sa</value></set>
           
      <set name="pwd"><value type="string"></value></set>
           
      <set name="minconnection"><value type="int">100</value></set>
           
      <set name="maxconnection"><value type="int">100</value></set>
           
      <set name="timeout"><value type="int">5</value></set>
         
      </pojo>
         
      <!-- LOGFruit為日志設(shè)定 -->
         
      <pojo id="log" class="org.loon.framework.pojo.sys.LOGFruit">
           
      <!-- 此項為生成的文件名,可以設(shè)定相關(guān)路徑,無設(shè)置以默認(rèn)路徑保存 -->
           
      <set name="file"><value type="string">log.txt</value></set>
           
      <!-- 此項為log服務(wù)名,啟動服務(wù)后有效 -->
           
      <set name="servername"><value type="string">logserver</value></set>
           
      <!-- 服務(wù)器所在地址 -->
           
      <set name="host"><value type="string">127.0.0.1</value></set>
           
      <!-- 服務(wù)器端口 -->
           
      <set name="port"><value type="string">8071</value></set>
           
      <!-- 是否在控制臺顯示log中信息 -->
           
      <set name="filesys"><value type="boolean">true</value></set>
           
      <!-- 是否保存log文件 -->
           
      <set name="filemark"><value type="boolean">false</value></set>
           
      <!-- 是否允許log服務(wù)啟動 -->
           
      <set name="netmark"><value type="boolean">false</value></set>
         
      </pojo>
         
      <!-- 此項為基礎(chǔ)配置,在0.1.0版本中未實裝 -->
         
      <pojo id="cfg" class="org.loon.framework.pojo.sys.CFGFruit">
           
      <set name="encoding"><value type="string">utf-8</value></set>
           
      <set name="cache"><value type="boolean">true</value></set>
           
      <set name="timeout"><value type="long">60</value></set>
           
      <set name="sleep"><value type="long">10</value></set>
         
      </pojo>
      </loon>

      5.關(guān)于Loonframework-DAO的事務(wù)管理

      package test;

      import java.sql.SQLException;

      import org.loon.framework.dao.DAOManager;
      import org.loon.framework.dao.DAOTransaction;
      import org.loon.framework.log.Log;
      import org.loon.framework.log.LogFactory;

      public class DAOTransactionTest {
          
          
      final static private Log log=LogFactory.getInstance(DAOTransactionTest.class);
          
          
      public static void main(String[]args){    
              
      //獲得默認(rèn)事務(wù)
              DAOTransaction transaction= DAOManager.getDefaultTransaction();
              
      try {
                  System.out.println(transaction.getTransactionConnection().isClosed());
              }
       catch (SQLException e) {
                  log.debug(e.getMessage());
              }

              
          }

      }

      通過DAOManager,我們得到了一個通過連接池獲取的,簡化了的事務(wù)操作。

      DAOManager提供的部分方法如下:



      利用DAOTransaction接口,我們可以構(gòu)建一個簡單的事務(wù)管理實現(xiàn)。

      除了DAOManager外,本項目還提供了一個
      javax.transaction.Transaction的實現(xiàn),位于org.loon.framework.dao.jta下,需要用戶提供UserTransaction實現(xiàn)。


      6.關(guān)于Loonframework-DAO中的Engine

      在Loonframework-DAO中,原則上所有的數(shù)據(jù)操作都要通過Engine類派生。此類位于org.loon.framework.dao下。

      其中靜態(tài)方法如下:



      我們可以通過讀取默認(rèn)配置,設(shè)置connection、datasource、daofruit或者選擇配置文件中指定的pojo創(chuàng)建Engine。

      Engine中,目前提供了兩種數(shù)據(jù)處理模式可供選擇。

      1.通過Execute實現(xiàn)進(jìn)行操作
      //選擇名為dao的數(shù)據(jù)源配置
      Engine engine=Engine.begin("dao");
      //獲得一個Execute操作
      Execute execute=engine.makeExecute();

      Execute接口如下:


      Execute接口是一個基于JDBC的常用CRUD操作封裝,他將所有的SQLException封裝為精簡的LException異常進(jìn)行處理,并提供了一個復(fù)刻ResultSet的Query結(jié)果集。

      Query接口如下(部分,基本為ResultSet復(fù)刻):


      Query結(jié)果集沒有數(shù)據(jù)庫依賴,是一個存在于內(nèi)存中的ResultSet緩存,我們完全可以關(guān)閉數(shù)據(jù)庫后如常使用Query接口,但這也意味著Query中的數(shù)據(jù)量始終不能保存過大,否則過多的Query將導(dǎo)致內(nèi)存耗盡。在下一版本會提出解決方案。

      Query接口基本用法如下:
      //選擇名為dao的數(shù)據(jù)源配置
      Engine engine=Engine.begin("dao");
      //獲得一個Execute操作
      Execute execute=engine.makeExecute();
      Query query
      =execute.sqlQuery("select * from ltest");

       
      while(query.isNext()){
                  
      //輸出數(shù)據(jù)
                  System.out.println(query.getString(0));
                  System.out.println(query.getString(
      "name"));
        }

      我們可以看出,Query接口緩存ResultSet后滾動結(jié)果集的方式幾乎與ResultSet接口相同;區(qū)別在于,Query接口內(nèi)部是通過數(shù)組及Map實現(xiàn)的,所以索引由0開始。

      由于Query本質(zhì)上是由一個數(shù)組內(nèi)部封裝Map實現(xiàn),所以也提供了很多集合操作功能,如疊代器操作。
      for(Iterator it=query.iterator();it.hasNext();){
                  System.out.println(((Map)it.next()).get(
      "id"));
      }

      Query甚至可以通過makeTo方法直接自身匹配為目標(biāo)類型
      //將query中數(shù)據(jù)映射到指定類中自動匹配,并返回對象數(shù)組
              Object[] ltests=query.makeTo(Ltest.class);
              
      //ArrayIterator為loonframework提供的數(shù)組疊代器
              ArrayIterator it=new ArrayIterator(ltests);
              
      for(;it.hasNext();){
                  System.out.println(
      "name="+((Ltest)it.next()).getName());
              }


      在Execute接口的輔助工具中,還有如Select類這樣的存在。

      Select是一個簡單的xml文件配置查詢器,他用于查詢及返回存在于xml中的sql語句。

      比如,我有已配置好的sql語句如下:
      <loon>
      <sql>
            
      <list id="list1"><![CDATA[select * from ltest]]></list>
            
      <list id="list2"><![CDATA[select * from ltest where id>#id# and name like '%#name#%']]></list>
            
      <list id="list3"><![CDATA[select count(id) from ltest]]></list>
      </sql>
      </loon>

      借助Select類可以這樣獲得動態(tài)的sql語句:
              Select select =new Select();
              
      //或者Select select=Select("/sql.lf.xml");
              
      //初始一個xml文檔
              select.initializeConfigure("/sql.lf.xml");
              
      //以getSelect方式獲得指定名稱的節(jié)點數(shù)據(jù)
              List list=execute.sqlQueryToList(select.getSelect("list1"));
              
      for(Iterator it=list.iterator();it.hasNext();){
                  System.out.println(((Map)it.next()).get(
      "id"));
              }

              

      Select還可以根據(jù)不同的設(shè)置讀取任意xml文檔,比如有ibatis演示用例的Account.xml
      <?xml version="1.0" encoding="UTF-8" ?>

      <!DOCTYPE sqlMap      
          PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"      
          "http://ibatis.apache.org/dtd/sql-map-2.dtd"
      >

      <sqlMap namespace="Account">

        
      <!-- Use type aliases to avoid typing the full classname every time. -->
        
      <typeAlias alias="Account" type="com.mydomain.domain.Account"/>

        
      <!-- Result maps describe the mapping between the columns returned
             from a query, and the class properties.  A result map isn't
             necessary if the columns (or aliases) match to the properties 
             exactly. 
      -->
        
      <resultMap id="AccountResult" class="Account">
          
      <result property="id" column="ACC_ID"/>
          
      <result property="firstName" column="ACC_FIRST_NAME"/>
          
      <result property="lastName" column="ACC_LAST_NAME"/>
          
      <result property="emailAddress" column="ACC_EMAIL"/>
        
      </resultMap>

        
      <!-- Select with no parameters using the result map for Account class. -->
        
      <select id="selectAllAccounts" resultMap="AccountResult">
          select * from ACCOUNT
        
      </select>

        
      <!-- A simpler select example without the result map.  Note the 
             aliases to match the properties of the target result class. 
      -->
        
      <select id="selectAccountById" parameterClass="int" resultClass="Account">
          select
            ACC_ID as id,
            ACC_FIRST_NAME as firstName,
            ACC_LAST_NAME as lastName,
            ACC_EMAIL as emailAddress
          from ACCOUNT
          where ACC_ID = #id#
        
      </select>
         
        
      <!-- Insert example, using the Account parameter class -->
        
      <insert id="insertAccount" parameterClass="Account">
          insert into ACCOUNT (
            ACC_ID,
            ACC_FIRST_NAME,
            ACC_LAST_NAME,
            ACC_EMAIL
          values (
            #id#, #firstName#, #lastName#, #emailAddress#
          )
        
      </insert>

        
      <!-- Update example, using the Account parameter class -->
        
      <update id="updateAccount" parameterClass="Account">
          update ACCOUNT set
            ACC_FIRST_NAME = #firstName#,
            ACC_LAST_NAME = #lastName#,
            ACC_EMAIL = #emailAddress#
          where
            ACC_ID = #id#
        
      </update>

        
      <!-- Delete example, using an integer as the parameter class -->
        
      <delete id="deleteAccountById" parameterClass="int">
          delete from ACCOUNT where ACC_ID = #id#
        
      </delete>

      </sqlMap>

          // 也可用于讀取其他框架中通過xml進(jìn)行的sql設(shè)置
              select.initializeConfigure("/Account.xml","sqlMap","select","id");
              System.out.println(select.getSelect(
      "account"));

      此時我們只要知道目標(biāo)節(jié)點,下屬子節(jié)點名以及屬性就可以檢索其中的sql語句

      Select類也允許將object中數(shù)據(jù)自動匹配到獲得的sql的#?#標(biāo)記中

      Ltest test=new Ltest();
      System.out.println(select.matchObject(test, 
      "list2"));

      此時,會自動匹配所有符合條件的數(shù)據(jù)到sql中,完成sql語句。



      2.通過Handle實現(xiàn)進(jìn)行操作

      該接口目前設(shè)置如下:


      Handle是Execute的二次封裝,他將Execute抽象為針對pojo映射進(jìn)行操作。

      Engine engine=Engine.begin();
      //與Execute相同,Handle也需要通過Engine獲得
      Handle handle=engine.makeHandle();

      獲得Handle后,假設(shè)我有如下pojo對象。

      public class Role{

          
      int caseid;

          String name;

          
      long sex;

          Date day;

          
      boolean die;

          String death;

          
      public int getCaseid() {
              
      return caseid;
          }


          
      public void setCaseid(int caseid) {
              
      this.caseid = caseid;
          }


          
      public Date getDay() {
              
      return day;
          }


          
      public void setDay(Date day) {
              
      this.day = day;
          }


          
      public String getDeath() {
              
      return death;
          }


          
      public void setDeath(String death) {
              
      this.death = death;
          }


          
      public boolean isDie() {
              
      return die;
          }


          
      public void setDie(boolean die) {
              
      this.die = die;
          }


          
      public String getName() {
              
      return name;
          }


          
      public void setName(String name) {
              
      this.name = name;
          }


          
      public long getSex() {
              
      return sex;
          }


          
      public void setSex(long sex) {
              
      this.sex = sex;
          }


      }

      這時要求我針對此pojo進(jìn)行一次insert操作到數(shù)據(jù)庫中。

      對于這種easy的需求,我們只需要設(shè)定如下語句即可輕松完成。

              Engine engine=Engine.begin();
              
      //與Execute相同,Handle也需要通過Engine獲得
              Handle handle=engine.makeHandle();
              Role role=
      new Role();
              role.setName("鵬凌三千");
              role.setSex(1);
              role.setDay(
      new Date());
              role.setDeath("ABC");
              role.setDie(
      false);
              
      try ...{
                  
      //插入role到數(shù)據(jù)庫中,主鍵自動增長
                  handle.doInsert(role,true);
                  
      //提交數(shù)據(jù)
                  handle.commit();
              }
       catch (LExecuteException e) ...{
                  
      //異常則回滾
                  handle.rollback();
              }


      此時查詢mysql,得知數(shù)據(jù)增加結(jié)果如下:



      可以看到,我們沒有對pojo進(jìn)行任何描述,也沒有在外部設(shè)置任何的對應(yīng)文檔,就成功地將一條數(shù)據(jù)插入到數(shù)據(jù)庫中。

      原理大家都非常清楚,就在于我們在數(shù)據(jù)庫創(chuàng)建表格時,都會對table的主鍵等參數(shù)進(jìn)行描述,利用jdbc我們可以得到這些設(shè)置,只要將這些設(shè)置反作用于pojo對象,就可以實現(xiàn)基本操作零配置進(jìn)行.

      通過loonframework-log,我們可以得知操作流程如下:


      其它操作同樣原理:



      但這時就有一個問題,對于簡單的CRUD我們雖然可以采取如上操作,但對于略為復(fù)雜的操作,比如刪除pojo在某一范圍內(nèi)的區(qū)域,或者要限定刪除或變更對象怎么辦呢?

      這時,loonframework-DAO提供了一個基于VO接口的解決方案。

      VO接口內(nèi)容如下:

      package org.loon.framework.dao.object;

      import org.loon.framework.core.LSerializable;

      /**
       * <p>
       * Title: LoonFramework
       * </p>
       * <p>
       * Description:VO接口,需要在其中規(guī)定調(diào)用sql的依據(jù)條件。當(dāng)實現(xiàn)的返回結(jié)果為null或""時,
       * 將自動引用table為pojo作自動實現(xiàn)。
       * </p>
       * <p>
       * Copyright: Copyright (c) 2007
       * </p>
       * <p>
       * Company: LoonFramework
       * </p>
       * 
       * 
      @author chenpeng
       * @email:ceponline@yahoo.com.cn
       * 
      @version 0.1
       
      */

      public interface VO extends LSerializable {

          
      /**
           * 表名
           * 
           * 
      @return
           
      */

          
      public String getTableName();

          
      /**
           * 主鍵
           * 
           * 
      @return
           
      */

          
      public Object[] getPrimaryKeys();

          
      /**
           * 連接語句
           * 
           * 
      @param sequence
           
      */

          
      public Object getJoin();

          
      /**
           * 允許的條件
           * 
           * 
      @return
           
      */

          
      public Object getCondition();

          
      /**
           * 允許的列名
           * 
           * 
      @return
           
      */

          
      public Object[] getColumn();

      }


      我們令剛才的Role類實現(xiàn)VO接口(紅字處將為生效區(qū)域)。


      public class Role implements VO{

          
      /**
           * 
           
      */

          
      private static final long serialVersionUID = 1L;

          
      int caseid;

          String name;

          
      long sex;

          Date day;

          
      boolean die;

          String death;

          
      public int getCaseid() {
              
      return caseid;
          }


          
      public void setCaseid(int caseid) {
              
      this.caseid = caseid;
          }


          
      public Date getDay() {
              
      return day;
          }


          
      public void setDay(Date day) {
              
      this.day = day;
          }


          
      public String getDeath() {
              
      return death;
          }


          
      public void setDeath(String death) {
              
      this.death = death;
          }


          
      public boolean isDie() {
              
      return die;
          }


          
      public void setDie(boolean die) {
              
      this.die = die;
          }


          
      public String getName() {
              
      return name;
          }


          
      public void setName(String name) {
              
      this.name = name;
          }


          
      public long getSex() {
              
      return sex;
          }


          
      public void setSex(long sex) {
              
      this.sex = sex;
          }


          
      public Object[] getColumn() {
              
      return new Object[]{"name","caseid"};
          }


          
      public Object getCondition() {
              
      return "name<>'鵬凌三千'";
          }


          
      public Object getJoin() {
              
      return null;
          }


          
      public Object[] getPrimaryKeys() {
              
      return null;
          }


          
      public String getTableName() {
              
      return null;
          }


      }


      此時我們無需更改任何操作代碼,執(zhí)行如下操作:
              Engine engine=Engine.begin();
              
      //與Execute相同,Handle也需要通過Engine獲得
              Handle handle=engine.makeHandle();
              Role role=
      new Role();
              role.setName("正常人");
              role.setSex(1);
              role.setDay(
      new Date());
              role.setDeath("ABC");
              role.setDie(
      false);
              
      try {
                  
      //變更
                  handle.doUpdate(role);
                  
      //提交數(shù)據(jù)
                  handle.commit();
              }
       catch (LExecuteException e) {
                  
      //異常則回滾
                  handle.rollback();
      }

      此時再查看控制臺輸出的日志,我們會發(fā)現(xiàn)自動生成的sql語句已經(jīng)有了變化。


      此時將自動以VO實現(xiàn)中的設(shè)置為優(yōu)先,令較為復(fù)雜的查詢得以實現(xiàn)。

      如果我們提供相應(yīng)接口的set方法,就可以動態(tài)的設(shè)定操作,只需要變更pojo對象,而無需改變操作代碼本身。

      當(dāng)然,現(xiàn)在只是一個簡單的實現(xiàn)模型,更復(fù)雜的操作,將會在后續(xù)版本中提供。

      7.關(guān)于Loonframework-DAO中的其它相關(guān)包

      在此發(fā)布的,除了DAO相關(guān)部分之外,還有一些有依賴關(guān)系的相關(guān)包.

      比如自制的Log,Xml,Cache,Collection等部分,但與Loonframework-DAO一樣,這些部分并非第三方工具提供,而是個人杜撰而成,并沒有經(jīng)過任何項目的實際運作,也沒有經(jīng)過必要的測試,無法保證其穩(wěn)定可靠,建議在正式項目中不要使用。

      ——————————————————————————————————

      目前Loonframework三個子項目中DAO及GAME原型系統(tǒng)已經(jīng)建立,會陸續(xù)的發(fā)布出來,而WEB方面還在構(gòu)建中,希望有閑的,想令自己智商上的優(yōu)越感油然而生的(一般人看到這樣的代碼都敢發(fā)布,都會有這種感覺的^^)先生們女士們能自覺自愿的加盟到此項目中來,以期共同進(jìn)步。

      個人認(rèn)為做開源項目,除了有想要“提升技術(shù)”、“出名”等因素外,更主要的還是為了開闊眼界,了解不同的思路,跟更多的人接觸,打破原有意識形態(tài)束縛。

      世人常說“求同存異”,殊不知天下之興在“有異”而不在“有同”,“求異存同”才是開源的真正核心價值所在,我常自詡“史上最差程序員”,這么弱的人都敢發(fā)開源項目,別人還有什么不敢干,不能干的?

      重復(fù)發(fā)明輪子,當(dāng)然不是想要替代輪子。假如我能夠作的比Hibernate、Spring、Struts等已近乎標(biāo)準(zhǔn)的框架優(yōu)秀,那不如直接加入這些團(tuán)隊,直接優(yōu)化原項目,也讓他們知道中國人有多牛……

      就是因為技術(shù)及思想上達(dá)不到,才會想自己做開源,從而發(fā)現(xiàn)及改進(jìn)自身的漏洞與不足,所謂授人以魚,只供一餐,授人以漁,可享一生。此之謂也。


      有興趣加盟項目的[有愛人士]們……
      可以通過:ceponline@yahoo.com.cn與我聯(lián)系。
      或者hotmail:rsuncp@hotmail.com(此msn通常只有晚6:30以后可能在線)

      項目地址:

      https://sourceforge.net/projects/looframework

      目前未分子項目,只創(chuàng)建了DAO一個項目的Alpha版本。




      posted on 2008-02-25 11:03  cping  閱讀(382)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产偷窥熟女高潮精品视频| 国产精品成| 少妇粉嫩小泬喷水视频www| 蜜臀av久久国产午夜福利软件| 国产suv精品一区二区883| 国产亚洲综合区成人国产| 国产免费一区二区不卡| 国产午夜精品理论大片| 中文字幕午夜福利片午夜福利片97 | 视频网站在线观看不卡| 久久99日本免费国产精品| 激情综合网激情综合| 亚洲国产综合精品2020| 巢湖市| 人妻蜜臀久久av不卡| 任我爽精品视频在线播放| 一区二区视频| 久久天天躁狠狠躁夜夜不卡| 久久国产精品波多野结衣| 日韩精品一二三黄色一级| 精品一区二区中文字幕| 成人拍拍拍无遮挡免费视频| 国产 一区二区三区视频| 中文一区二区视频| 免费无码一区无码东京热| 欧美牲交videossexeso欧美 | 国产成人精品亚洲午夜麻豆| 摸丰满大乳奶水www免费 | 华阴市| 国产一区二区日韩在线| 久久这里都是精品二| 国产亚洲视频免费播放| 国产成人精品亚洲午夜| 国产精品夜夜春夜夜爽久久小| 亚洲夜色噜噜av在线观看| 中文字幕在线精品国产| 夜色福利站WWW国产在线视频| 免费无码一区二区三区蜜桃| 亚洲永久一区二区三区在线| 日本丶国产丶欧美色综合| 麻阳|