精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

談?wù)凪ongoDB的三層操作

數(shù)據(jù)庫 其他數(shù)據(jù)庫 MongoDB
我們今天要寫的是MongoDB的三層操作,包括Module層、DAL層、BLL層。希望對大家有所幫助。

NOSQL近來勢頭不錯,MongoDB更是其中的嬌嬌者,自己學(xué)NoSQL的時候也是參考了大量的資料,最終決定要從MongoDB入手的,最重要的原因有兩點:1自己是簡單的愛好者,一切問題我都在想是否有簡單的方法解決,寧可停下來去思考大量時間,也不愿用笨方法馬上去做,而MongoDB的操作大都很簡單,2自己是JS的愛好者,沒事就喜歡拿一本js的本從頭到尾看一邊,也不管記住多少,也不管用不用得到,就是喜歡,MongoDB以BSON格式存儲,所以操作也起來也算得心應(yīng)手!現(xiàn)在做一個項目正是用MongoDB做為數(shù)據(jù)庫的,一開始沒有DAL,BLL直接訪問數(shù)據(jù)庫,然后就到UI了,而且BLL是全靜態(tài)的(我喜歡靜態(tài)方法的調(diào)用簡單,但狠靜態(tài)類的不能繼承!),當(dāng)時考慮的是用MongoDB的驅(qū)動去操作太直白了!感覺沒必要再寫個DAL!,后來知道我想法還是很天真的,哈哈!下面就說現(xiàn)在的操作方式吧~

一、Module層

 

    [Serializable]

    public sealed class user

    {

        public ObjectId id;

        public string n;

        public int age;

        public Birthday birth;

 

        public sealed class Birthday

        {

            public int y;

            public int m;

            public int d;

        }

    }

 

咋一看,有幾個地方不規(guī)范,1類名首字母和公開字段沒有大寫,2公開的字段,而沒有用屬性,3字段命名沒表達它的意思。現(xiàn)在逐個解釋一下,類名和字段沒大寫首字母主要是數(shù)據(jù)庫里的命名是遵循js的,用js表示時大家一般會這樣寫:

var user={id:ObjectId("123456"),n:"loogn",age:23,birth:{y:1989,m:7,d:7}}

然而,可能有人會說可以用MongoDB.Bson.Serialization.Attributes.BsonElement這樣一個Attribute關(guān)聯(lián)呢!不過我不會那樣做,原因就是太麻煩了!這里可能還是有疑問,留到第3個問題說。

公開字段而沒有用屬性也是不合常理的,學(xué)校老師都交過,不管你能不能理解,反正就是要私有化字段,想公開請用屬性,哈哈!不過我想了很久還是不走尋常路了,目前為止用字段沒有出現(xiàn)過缺陷問題,我不保證以后不會,但我感覺幾率十分小,就算真的有什么問題必需要用屬性,后面加上{get;set;}也不麻煩吧!屬性畢竟還是方法,用屬性有多余的方法調(diào)用開銷,而且實體類本來就是不尋常的類,一般只表示對象狀態(tài)(用字段),屬性里如果有邏輯(就像老師常說的年齡不能小于0且不能大于150等等!),你會放到這里做嗎?顯然你都是放在BLL里做!字段命名太短了沒有表達它的意思,其實這個可以和***個一起來說,MongoDB是無模式的,同一個合集可以保多個不規(guī)則的文檔,如user集合:

{id:1,n:"user1",desc:"我的描述"}

{id:2,n:"user2"}

 所以數(shù)據(jù)庫必須保存文檔的每一個元素的name(即id,name,desc,id,name),所以元素name越短越節(jié)省空間,本來是用name更能表達的,這里用了n,其實只要把常用的約定一下,絕大部分人都是可以接受的。

在user里還有個內(nèi)嵌類Birthday,而這個類大寫了首字母,我是這樣考慮的,內(nèi)嵌類名全部按C#命名規(guī)范,因為容器類有一個該內(nèi)嵌類類型的字段,這里是birth,但如果找不到合適的縮寫怎么辦呢,直接小寫內(nèi)嵌類名就可以了,如內(nèi)嵌城市類City,字段名為city就不會重復(fù)了。

二、DAL層

在這一層要寫一個基類,完成這個基類后,其他的各各DAL類都是浮云了~,在寫基類之前有一個MongoHelper,MongoHelper很簡單,直接給出代碼且不寫解釋:

MongoServer

 完了后就可以寫B(tài)aseDAL了,如果沒有泛型,DAL的工作還真是索然無味,但現(xiàn)在用泛型DAL的工作有趣多了,先承上代碼:

 

    /// <summary>

    /// 數(shù)據(jù)訪問層基類

    /// </summary>

    /// <typeparam name="T">文檔實體類</typeparam>

    public abstract class BaseDAL<TDocument>

    {

        protected internal string CollectionName {  set; get; }

 

        /// <summary>

        /// 設(shè)置集合名

        /// </summary>

        protected abstract string SetCollectionName();

 

        private MongoCollection<TDocument> m_collection;

 

        /// <summary>

        /// 根據(jù)CollectionName得到MongoCollection對象

        /// </summary>

        protected internal MongoCollection<TDocument> Collection

        {

            get

            {

                if (m_collection == null)

                {

                    CollectionName = SetCollectionName();

                    m_collection = MongoHelper.GetDatabase().GetCollection<TDocument>(CollectionName);

                }

                return m_collection;

            }

        }

 

        /// <summary>

        /// 根據(jù)query條件得到一個文檔對象

        /// </summary>

        /// <param name="query">查詢條件</param>

        /// <param name="preprocess">預(yù)處理方法</param>

        /// <returns></returns>

        public TDocument FindOne(IMongoQuery query, PreprocessHandler<TDocument> preprocess)

        {

            var document = Collection.FindOne(query);

            if (preprocess != null)

            {

                preprocess(ref document);

            }

            return document;

        }

 

        /// <summary>

        /// 把MongoCursor轉(zhuǎn)換成IList類型

        /// </summary>

        /// <param name="cursor">文檔游標(biāo)</param>

        /// <param name="preprocess">預(yù)處理方法</param>

        /// <returns></returns>

        protected internal IList<TDocument> CursorToList(MongoCursor<TDocument> cursor, PreprocessHandler<TDocument> preprocess)

        {

            IList<TDocument> list = new List<TDocument>(30);

            bool isPreprocess = preprocess != null;

            foreach (TDocument document in cursor)

            {

                var doc = document;

                if (isPreprocess)

                    preprocess(ref doc);

                list.Add(doc);

            }

            return list;

        }

      

        /// <summary>

        /// 根據(jù)query查詢集合

        /// </summary>

        /// <param name="query">條件</param>

        /// <param name="preprocess">預(yù)處理方法</param>

        /// <returns></returns>

        public IList<TDocument> Find(IMongoQuery query, MongoCursorSettings cursorSettings, PreprocessHandler<TDocument> preprocess)

        {

            var cursor = Collection.Find(query);

            if (cursorSettings != null)

            {

                cursorSettings.Set(cursor);

            }

            var list = CursorToList(cursor, preprocess);

            return list;

        }

 

    }

 

最上面的代碼就是設(shè)置操作哪個集合,這里有一點感覺不爽,為什么屬性的get和set不能分別為抽象的呢?!雖然可以把整個屬性標(biāo)記為abstract,但在實現(xiàn)類中也要寫get和set的實現(xiàn)(set可以是空代碼塊),所以這里回歸原本用了一個SetCollectionName的抽象方法讓子類去設(shè)置自己對應(yīng)的集合名。

當(dāng)你得到MongoCollection對象,特別是MongoCollection<TDocument>這樣的強類型對象,BaseDAL剩下的工作也成浮云了!(都是對驅(qū)動方法的封裝和個性化處理),如FindOne方法,用到一個委托:

public delegate void PreprocessHandler<T>(ref T document);

有很多這樣的情況,得到一個實體后總是要先處理一下才可被UI方便的使用,如用戶頭像為空時,給個默認的,PreprocessHandler就是給BLL處理留個方便的接口啦!

這里選擇委托而不是其他的元素使程序更靈活(有匿名委托嘛,I like it!),大家注意到了吧,實體類是按引用傳遞的,其實這里有個坑,我跳進去了,但又爬上來了!然后這里立了個牌:"此處有坑,請繞道而行",以免匆忙趕路的你也栽個跟頭兒。

有這樣一個情況,如果你把一個null實體對象傳入處理方法,又在處理方法里判斷如果是null就實體化,這樣是得不到預(yù)期效果的,此null非彼null呀,實體化后方法里的型參是指向新對象了,但傳過來的實參還是指向null呢,這不是我們想要的,用ref便可以解決了,也許你會說可以把實體對象返回呀,是的,但個人不喜歡那種寫法,那樣處理方法***還要寫reurn代碼,調(diào)用方法可能還得寫代碼接收,麻煩!

FindOne例子完了,但FindOne遠遠沒完,你可以做各種你喜歡的重載。

再看Find得到多個文檔的方法,這里我選擇IList<實體>做為返回值,在BLL決不去操作MongoCursor,但有這樣一個問題,設(shè)置Fields、Limit、排序等都是在MongoCursor上操作的呀,而且這些操作很可能都是從UI傳過來的,所以這里用了一個MongoCursorSettings類封裝了這些設(shè)置:

MongoCursorSettings

代碼不用解釋,你可以擴展此類做更多設(shè)置而不用修改Find方法。

CursorToList方法也很簡單,其實把PreprocessHandler寫在DAL層的原因就是這個方法啦,心細的你肯定發(fā)現(xiàn)了把PreprocessHandler寫在BLL更合理,但那樣文檔集合就要多遍歷一遍,MongoCursor到IList一遍,PreprocessHandler處理IList又一遍!唉,程序員容易嘛~~~

當(dāng)然,你也可以對Find做各種你喜歡的重載,更要寫其他方面(Insert,Update,Remove...)的方法對BaseDAL類進行完善。

***讓親看一下User浮云(其他浮云也是這個樣):

 

    public class User:BaseDAL<user>

    {

        protected override string SetCollectionName()

        {

            return "user";

        }

    }

 

 

三、BLL層

有泛型就是意思,看BaseBLL:

 

    /// <summary>

    /// 業(yè)務(wù)邏輯層基類

    /// </summary>

    /// <typeparam name="TDAL">數(shù)據(jù)訪問類型</typeparam>

    /// <typeparam name="TDocument">文檔模型類型</typeparam>

    public abstract class BaseBLL<TDAL, TDocument> where TDAL : DAL.BaseDAL<TDocument>,new()

    {

        protected TDAL dal = new TDAL();

 

        public TDocument FindOne(IMongoQuery query, PreprocessHandler<TDocument> preprocess)

        {

            return dal.FindOne(query,preprocess);

        }

    }

 

基本上是對DAL的一個調(diào)用,無他!直接到它的子類,因為是邏輯層,比浮云多一點,可以算是個神馬吧:

 

    public sealed class User : BLL.BaseBLL<DAL.User, user>

    {

        public user FindOneByName(string name)

        {

            var doc = base.FindOne(Query.EQ("u", name), P1);

            return doc;

        }

 

        /// <summary>

        /// 保證不為null

        /// </summary>

        /// <param name="doc"></param>

        private void P1(ref user doc)

        {

            if (doc == null)

            {

                doc = new user();

            }

            P2(ref doc);

        }

 

        /// <summary>

        /// 也許可以處理嬰兒,哈哈

        /// </summary>

        /// <param name="doc"></param>

        private void P2(ref user doc)

        {

            if (doc != null)

            {

                doc.age = 0;

            }

        }

    }

 

代碼也是很簡單,其實這里有一個想法,很多實體類總是只有一種處理方法,可以在BaseBLL里寫一個PreprocessHandler委托簽名的虛方法做為默認處理方法, 在BaseBLL里就調(diào)用該方法,子類需要就可重寫它,這樣又簡單了,為了方面查看,兩個類的代碼寫在一塊了:

 

        /// <summary>

        /// BaseBLL的默認處理方法

        /// </summary>

        /// <param name="doc"></param>

        protected virtual void Preprocess(ref TDocument doc)

        {

            return;

        }

 

        /// <summary>

        /// LG.BLL.User重寫基類方法

        /// </summary>

        /// <param name="doc"></param>

        protected override void Preprocess(ref user doc)

        {

            if (doc == null)

                doc = new user();

            if (doc.birth == null)

                doc.birth = new user.Birthday();

        }

 

到此,BLL事例也完了,當(dāng)然,還要做更多的工作去完善。

 

四、UI層

這里其實沒啥說的,為了文章完整性,簡單提一下。

一般情況下UI是不會引用DAL的,但因為BaseBLL用了泛型參數(shù),而泛型類型在DAL里,所以UI也要引用DAL,但永遠不要用DAL。

還有一點,就是邏輯層實例化的問題,比如在同一次Http請求中,很可能不小心或者避免不了new了LG.BLL.User多次,這樣做只是白白浪費了內(nèi)存,增加GC壓力,沒一點好處,所以,再回到BLL層,添加這樣一個類:

 

    /// <summary>

    /// 為了在一次請求中同類型邏輯對象只實例化一次,

    /// 只能在http請求上下文中使用

    /// </summary>

    public static class B

    {

        public static T Entity<T>() where T : class, new()

        {

            string key = typeof(T).Name;

            if (HttpContext.Current != null)

            {

                var bll = HttpContext.Current.Items[key] as T;

                lock (key)

                {

                    if (bll == null)

                    {

                        bll = new T();

                        HttpContext.Current.Items[key] = bll;

                    }

                }

                return bll;

            }

            else

            {

                return new T();

            }

        }

    }

 

在UI或確定是有HTTP請求的上下文中都可以這樣調(diào)用了(當(dāng)然,如果基于其他上下文,也可以寫一個類似上面的實例化方法):

 User u = B.Entity<User>();

 

到止完結(jié),平時寫文章不多,表達欠佳,望親們見諒!

 

責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2009-07-28 17:25:14

ASP.NET三層結(jié)構(gòu)

2011-04-19 13:53:41

三層架構(gòu)

2009-08-26 18:20:42

三層架構(gòu)

2014-02-12 10:07:07

三層交換原理

2010-03-11 10:49:45

三層交換

2013-08-14 10:08:07

TrunkVLAN三層交換

2013-01-09 11:00:20

架構(gòu)開發(fā)三層架構(gòu).NET架構(gòu)

2013-10-12 09:58:41

三層交換機三層交換原理交換機

2011-12-02 10:58:55

交換機

2014-10-11 17:06:07

交換機

2010-01-11 16:26:42

三層交換機作用

2010-03-22 15:02:19

三層交換機

2011-08-08 14:14:03

架構(gòu)

2012-02-03 09:44:33

.NET

2018-07-19 12:16:50

交換技術(shù)三層二層

2009-07-30 13:07:49

ASP.NET中的三層

2009-08-05 10:07:20

交換機配置實驗

2018-04-19 05:47:30

互聯(lián)網(wǎng)產(chǎn)品互聯(lián)網(wǎng)網(wǎng)絡(luò)模型

2009-05-06 09:40:04

LINQWEB開發(fā)構(gòu)架

2010-02-22 13:41:49

三層交換機
點贊
收藏

51CTO技術(shù)棧公眾號

一级黄色在线播放| 日本高清不卡一区二区三| 午夜三级在线观看| 中文久久电影小说| 亚洲mv大片欧洲mv大片精品| 精品国产乱码久久久久久丨区2区| 台湾佬中文在线| 久久理论电影| 精品sm捆绑视频| 久久久久久久久久久久久久国产| 国产二区视频在线观看| 国产美女一区二区| 2019中文字幕全在线观看| 国产伦精品一区二区三区视频女| 国产精品久久免费视频| 欧美日韩久久久久| 亚洲一区二区免费视频软件合集| 国产富婆一级全黄大片| 久久九九精品| 欧美黄色小视频| 亚洲日本精品视频| 亚洲一级大片| 欧美三级日韩在线| 热99这里只有精品| 欧美成人二区| 久久免费电影网| 97人人香蕉| 国语对白做受69按摩| 亚洲一级影院| 久久精品久久久久久| 中文字幕狠狠干| 欧美一区在线观看视频| 欧美三级一区二区| 男人日女人bb视频| 免费不卡av| 国产精品久久久久毛片软件| 久久久久久九九九九| 99久久久久久久| 日韩av一级电影| 91极品视频在线| 欧美精品色哟哟| 欧美成人milf| 国产亚洲欧美另类中文| 捆绑裸体绳奴bdsm亚洲| 日韩综合一区二区三区| 欧美精品v日韩精品v韩国精品v| 干日本少妇首页| 蜜桃传媒在线观看免费进入| 亚洲欧美区自拍先锋| 亚洲成人蜜桃| 国产网站在线播放| 久久久久久久久久久久久女国产乱| 国产91aaa| 精品二区在线观看| 国产精品原创巨作av| 成人福利网站在线观看11| 中文字幕第2页| 老牛嫩草一区二区三区日本 | 成年人在线视频| 26uuu精品一区二区| 久久99精品久久久久子伦| 日本精品一二区| 成人av资源在线| 狠狠色伊人亚洲综合网站色| 天天干天天插天天操| 成人av在线网站| 国偷自产av一区二区三区小尤奈| 亚洲精品.www| 北条麻妃国产九九精品视频| 成人在线看片| 天天色天天操天天射| 97久久精品人人做人人爽50路| 国产一区免费观看| 欧美日本韩国一区二区| 国产欧美视频在线观看| 亚洲欧美日韩在线综合| 麻豆av在线导航| 亚洲精品少妇30p| 激情六月天婷婷| japanese色国产在线看视频| 欧美日韩在线观看视频| 亚洲视频在线观看一区二区三区| www.精品国产| 欧美一级在线免费| 欧美xxxxx少妇| 猛男gaygay欧美视频| 最近2019好看的中文字幕免费| 综合 欧美 亚洲日本| 欧美在线黄色| 2020欧美日韩在线视频| 国产偷人爽久久久久久老妇app | 人人爽久久涩噜噜噜网站| 亚洲国产av一区二区三区| 久久99国产乱子伦精品免费| 丁香五月网久久综合| 欧美美女色图| 亚洲男人的天堂网| 成年人黄色片视频| 国产精品视频一区视频二区| 亚洲福利在线视频| www.4hu95.com四虎| 狠久久av成人天堂| 国产精品久久99久久| www.久久成人| 国产日韩欧美一区二区三区乱码 | 素人av在线| 亚洲www啪成人一区二区麻豆| 超碰影院在线观看| 九色精品蝌蚪| 亚洲一区二区久久| 久操免费在线视频| 青青草精品视频| 国产伦视频一区二区三区| 第一福利在线| 亚洲午夜久久久久久久久电影院 | 国产在线精品一区二区不卡了| 国产美女99p| 免费观看成人高潮| 色综合天天狠狠| 亚洲精品一二三四| 日韩精品诱惑一区?区三区| 韩国福利视频一区| 国产欧美综合视频| 欧美韩国一区二区| 69堂免费视频| 91精品啪在线观看国产手机| 色噜噜国产精品视频一区二区| 日本三级片在线观看| 国产麻豆91精品| 亚洲一区二区三区涩| 亚洲伊人av| 亚洲成人动漫在线播放| 四虎永久免费在线| 美女久久久精品| 欧美中日韩免费视频| 看黄在线观看| 欧美精品一区视频| 欧美片一区二区| 九色porny丨国产精品| 青青草成人激情在线| 国产夫妻在线播放| 精品国产青草久久久久福利| 91香蕉视频污在线观看| 久久婷婷av| 精品国产一区二区三区麻豆小说| 中文av资源在线| 欧美美女视频在线观看| 亚洲图片第一页| 久久久精品性| 日本在线观看不卡| 女海盗2成人h版中文字幕| 亚洲成人网久久久| 精品无码久久久久| 国产宾馆实践打屁股91| 樱空桃在线播放| 99久久这里有精品| 久久久久北条麻妃免费看| 在线观看亚洲一区二区| 国产精品免费看片| 狠狠躁狠狠躁视频专区| 日韩精品一区二区三区免费观影| 国产极品精品在线观看| 国产福利小视频在线观看| 欧美三级日韩三级| 黄视频网站免费看| 精品一区二区久久| 国产精品久久久影院| 日韩欧美中文字幕在线视频| 久久婷婷国产麻豆91天堂| 国产视频一区二区三| 亚洲欧美电影一区二区| 女同性αv亚洲女同志| 亚洲一级网站| 蜜桃成人免费视频| 一呦二呦三呦精品国产| 色婷婷**av毛片一区| 国产黄色一级大片| 黑人巨大精品欧美一区二区三区| 波多野结衣 在线| 看片的网站亚洲| 国产精品igao激情视频| 亚洲人成网www| 国产精品久久77777| 国产在线激情| 亚洲国产精品人久久电影| 国产成人精品777777| 国产精品福利一区| 国产视频精品视频| 久久三级视频| 免费日韩在线观看| 九色丨蝌蚪丨成人| 国产成人在线一区| 中文字幕免费高清电视剧网站在线观看 | 粉嫩av一区二区三区天美传媒 | 1区2区3区在线| 亚洲女人初尝黑人巨大| 中文字幕在线2019| 亚洲综合色区另类av| www.久久av| 国产一区二区三区久久悠悠色av| 少妇av一区二区三区无码| 久久综合国产| 精品一区久久久| 韩国精品视频在线观看| 久久久久女教师免费一区| 欧美日韩伦理片| 欧美一二三区精品| www五月天com| 亚洲人吸女人奶水| 短视频在线观看| 国产成人免费在线观看| 成人免费xxxxx在线视频| 欧美 日韩 国产精品免费观看| 欧美日韩国产免费一区二区三区| 国产精品亚洲一区二区在线观看| 欧美一区二区三区……| av免费在线观| 在线视频日本亚洲性| 欧美一级性视频| 欧美日韩黄视频| 日韩无码精品一区二区三区| 综合久久综合久久| 亚洲精品国产一区黑色丝袜| 国产a视频精品免费观看| 亚洲精品20p| 国产视频亚洲| 成人免费性视频| 午夜精品毛片| 午夜精品区一区二区三| 日韩在线黄色| 国产精品香蕉视屏| 欧美一级大片在线视频| 成人疯狂猛交xxx| 巨胸喷奶水www久久久| 浅井舞香一区二区| 黑森林国产精品av| 久久久久久国产精品| 在线播放免费av| 久热精品在线视频| 久久综合网导航| 日韩在线免费视频| 97电影在线| 在线看日韩欧美| 国产在线视频福利| 亚洲一级一级97网| 欧美女优在线观看| 国产一区二区激情| 国产裸舞福利在线视频合集| 亚洲石原莉奈一区二区在线观看| 性xxxxbbbb| 日韩电影大片中文字幕| 污污网站免费在线观看| 亚洲精品videossex少妇| 亚洲欧美色视频| 日韩高清中文字幕| 色资源在线观看| 亚洲人成伊人成综合网久久久| 亚洲欧美日本在线观看| 亚洲欧美中文另类| 韩国免费在线视频| 中文字幕精品久久| 免费在线你懂的| 欧美精品免费在线| 欧美激情成人动漫| 午夜精品久久久久久久白皮肤| 成人性生交大片免费看网站| 97婷婷涩涩精品一区| 美女18一级毛片一品久道久久综合| 97欧美精品一区二区三区| 日本а中文在线天堂| 国产成人福利网站| 欧美国产日韩电影| 91久久精品国产91久久性色| 日本一区影院| 国产伦精品一区二区三区高清| 亚洲va久久久噜噜噜久久| 日本在线观看不卡| 伊人久久大香线蕉精品组织观看| 国产肉体ⅹxxx137大胆| 亚洲综合日本| 亚洲欧美日韩一级| 国产成人免费av在线| 波多野结衣福利| 中文字幕一区二区在线播放| 久久久久黄色片| 日韩欧美在线观看视频| 亚洲专区第一页| 精品动漫一区二区三区在线观看| 欧美日韩视频精品二区| 日韩在线播放av| 高清毛片在线观看| 国产在线高清精品| 欧美挤奶吃奶水xxxxx| 亚洲精品在线视频观看| 亚洲午夜激情在线| 538任你躁在线精品免费| 成人性生交大片免费看视频在线| 国精产品一区一区三区免费视频 | 久久免费少妇高潮99精品| 舔着乳尖日韩一区| 一本到在线视频| 亚洲国产精品专区久久| 在线免费观看的av网站| 91精品国产精品| 亚洲综合资源| 久久一区二区三区av| 影视亚洲一区二区三区| 日本999视频| 成人动漫视频在线| 三级影片在线观看| 色综合天天综合给合国产| www黄色网址| 色琪琪综合男人的天堂aⅴ视频| www.51av欧美视频| 91久久精品国产91久久性色tv| 久久超碰99| 浮妇高潮喷白浆视频| 国产精品综合二区| 91精品久久久久久久久久久久| 亚洲一卡二卡三卡四卡 | sm捆绑调教国产免费网站在线观看| 国产精品视频大全| 偷拍亚洲色图| 日本阿v视频在线观看| 激情综合色播激情啊| www.99热| 色综合久久88色综合天天免费| 亚洲成人久久精品| 久久人人爽人人爽爽久久| 日韩欧美一区二区三区免费观看| 国产精品自拍首页| 欧美在线影院| 色姑娘综合天天| 国产精品国产三级国产普通话三级| 天天干在线播放| 亚洲激情自拍图| 婷婷av在线| 亚洲一区二区在线| 99精品视频在线观看播放| 香蕉视频网站入口| 欧美国产亚洲另类动漫| 午夜精品久久久久久久蜜桃| 日韩精品免费在线播放| 国产色播av在线| 精品日本一区二区三区| 最新日韩欧美| 漂亮人妻被黑人久久精品| 亚洲国产精品久久一线不卡| 亚洲精品无遮挡| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久一区二区三区电影| 在线免费观看视频黄| 亚洲国产精品精华液2区45| 波多野结衣网站| 在线亚洲国产精品网| 黄色精品视频网站| 一区二区三区四区欧美日韩| 麻豆国产精品视频| 国产jizz18女人高潮| 在线成人高清不卡| 1区2区在线观看| 国产91一区二区三区| 日韩香蕉视频| 9.1成人看片免费版| 在线一区二区三区做爰视频网站| 丁香在线视频| 成人午夜激情免费视频| 欧美午夜a级限制福利片| 日本一区二区免费视频| 欧美日韩亚洲成人| 国产福利小视频在线观看| 成人一区二区电影| 黄色亚洲免费| 一区二区不卡免费视频| 欧美专区日韩专区| 国产丝袜在线| 国产区日韩欧美| 久久久久免费| 永久免费看mv网站入口| 亚洲第一网站免费视频| 成人做爰视频www网站小优视频| 亚洲一区二区不卡视频| 成人激情文学综合网| 欧美国产一级片| 粗暴蹂躏中文一区二区三区| 极品束缚调教一区二区网站 | 精品乱人伦一区二区三区| 性欧美xxx69hd高清| 亚洲免费精品视频| 国产91在线观看| 超碰在线观看91| 欧美乱大交xxxxx另类电影| 日本天堂一区| 免费网站在线观看黄| 精品久久久久久久久久| 视频一区二区三区不卡| 久久精品丝袜高跟鞋| 狠狠色丁香婷婷综合久久片| 久久久久久久极品| 日韩一级裸体免费视频|