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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于 MyBatis 手撸一个分表插件

發布時間:2025/3/11 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于 MyBatis 手撸一个分表插件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景

事情是醬紫的,上級leader負責記錄信息的業務,每日預估數據量是15萬左右,所以引入sharding-jdbc做分表。

上級leader完成業務的開發后,走了一波自測,git push后,就忙其他的事情去了。

項目的框架是SpringBoot+Mybaits

出問題了

因為負責的業務也開發完了,熟練的git pull,準備自測,單元測試run一下,上個廁所回來收工,就是這么自信。

回來后,看下控制臺,人都傻了,一片紅,內心不禁感嘆“如果這是股票基金該多好”。

出了問題就要解決,隨著排查深入,我的眉頭一皺發現事情并不簡單,怎么以前的一些代碼都報錯了?

隨著排查深入,最后跟到了Mybatis源碼,發現罪魁禍首是sharding-jdbc引起的,因為數據源是sharding-jdbc的,導致后續執行sql的是ShardingPreparedStatement。

這就意味著,sharding-jdbc影響項目的所有業務表,因為最終數據庫交互都由ShardingPreparedStatement去做了,歷史的一些sql語句因為sql函數或者其他寫法,使得ShardingPreparedStatement無法處理而出現異常。

關鍵代碼如下

發現問題后,阿星馬上就反饋給leader了。

唉,本來還想摸魚的,看來摸魚的時間是沒了,還多了一項任務。

分析

竟然交給阿星來做了,就擼起袖子開干吧,先看看分表功能的需求

  • 支持自定義分表策略

  • 能控制影響范圍

  • 通用性

分表會提前建立好,所以不需要考慮表不存在的問題,核心邏輯實現,通過分表策略得到分表名,再把分表名動態替換到sql。

分表策略

為了支持分表策略,我們需要先定義分表策略抽象接口,定義如下

/***?@Author?程序猿阿星*?@Description?分表策略接口*?@Date?2021/5/9*/ public?interface?ITableShardStrategy?{/***?@author:?程序猿阿星*?@description:?生成分表名*?@param?tableNamePrefix?表前綴名*?@param?value?值*?@date:?2021/5/9*?@return:?java.lang.String*/String?generateTableName(String?tableNamePrefix,Object?value);/***?驗證tableNamePrefix*/default?void?verificationTableNamePrefix(String?tableNamePrefix){if?(StrUtil.isBlank(tableNamePrefix))?{throw?new?RuntimeException("tableNamePrefix?is?null");}} }

generateTableName函數的任務就是生成分表名,入參有tableNamePrefix、value,tableNamePrefix為分表前綴,value作為生成分表名的邏輯參數。

verificationTableNamePrefix函數驗證tableNamePrefix必填,提供給實現類使用。

為了方便理解,下面是id取模策略代碼,取模兩張表

/***?@Author?程序猿阿星*?@Description?分表策略id*?@Date?2021/5/9*/ @Component public?class?TableShardStrategyId?implements?ITableShardStrategy?{@Overridepublic?String?generateTableName(String?tableNamePrefix,?Object?value)?{verificationTableNamePrefix(tableNamePrefix);if?(value?==?null?||?StrUtil.isBlank(value.toString()))?{throw?new?RuntimeException("value?is?null");}long?id?=?Long.parseLong(value.toString());//此處可以緩存優化return?tableNamePrefix?+?"_"?+?(id?%?2);} }

傳入進來的value是id值,用tableNamePrefix拼接id取模后的值,得到分表名返回。

控制影響范圍

分表策略已經抽象出來,下面要考慮控制影響范圍,我們都知道Mybatis規范中每個Mapper類對應一張業務主體表,Mapper類的函數對應業務主體表的相關sql。

阿星想著,可以給Mapper類打上注解,代表該Mpaaer類對應的業務主體表有分表需求,從規范來說Mapper類的每個函數對應的主體表都是正確的,但是有些同學可能不會按規范來寫。

假設Mpaaer類對應的是B表,Mpaaer類的某個函數寫著A表的sql,甚至是歷史遺留問題,所以注解不僅僅可以打在Mapper類上,同時還可以打在Mapper類的任意一個函數上,并且保證小粒度覆蓋粗粒度。

阿星這里自定義分表注解,代碼如下

/***?@Author?程序猿阿星*?@Description?分表注解*?@Date?2021/5/9*/ @Target(value?=?{ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public?@interface?TableShard?{//?表前綴名String?tableNamePrefix();//值String?value()?default?"";//是否是字段名,如果是需要解析請求參數改字段名的值(默認否)boolean?fieldFlag()?default?false;//?對應的分表策略類Class<??extends?ITableShardStrategy>?shardStrategy();}

注解的作用范圍是類、接口、函數,運行時生效。

tableNamePrefix與shardStrategy屬性都好理解,表前綴名和分表策略,剩下的value與fieldFlag要怎么理解,分表策略分兩類,第一類依賴表中某個字段值,第二類則不依賴。

根據企業id取模,屬于第一類,此處的value設置企業id入參字段名,fieldFlag為true,意味著,會去解析獲取企業id字段名對應的值。

根據日期分表,屬于第二類,直接在分表策略實現類里面寫就行了,不依賴表字段值,value與fieldFlag無需填寫,當然你value也可以設置時間格式,具體看分表策略實現類的邏輯。

通用性

抽象分表策略與分表注解都搞定了,最后一步就是根據分表注解信息,去執行分表策略得到分表名,再把分表名動態替換到sql中,同時具有通用性。

Mybatis框架中,有攔截器機制做擴展,我們只需要攔截StatementHandler#prepare函數,即StatementHandle創建Statement之前,先把sql里面的表名動態替換成分表名。

Mybatis分表攔截器流程圖如下

Mybatis分表攔截器代碼如下,有點長哈,主流程看intercept函數就好了。

/***?@Author?程序員阿星*?@Description?分表攔截器*?@Date?2021/5/9*/ @Intercepts({@Signature(type?=?StatementHandler.class,method?=?"prepare",args?=?{Connection.class,?Integer.class}) }) public?class?TableShardInterceptor?implements?Interceptor?{private?static?final?ReflectorFactory?defaultReflectorFactory?=?new?DefaultReflectorFactory();@Overridepublic?Object?intercept(Invocation?invocation)?throws?Throwable?{//?MetaObject是mybatis里面提供的一個工具類,類似反射的效果MetaObject?metaObject?=?getMetaObject(invocation);BoundSql?boundSql?=?(BoundSql)?metaObject.getValue("delegate.boundSql");MappedStatement?mappedStatement?=?(MappedStatement)metaObject.getValue("delegate.mappedStatement");//獲取Mapper執行方法Method?method?=?invocation.getMethod();//獲取分表注解TableShard?tableShard?=?getTableShard(method,mappedStatement);//?如果method與class都沒有TableShard注解或執行方法不存在,執行下一個插件邏輯if?(tableShard?==?null)?{return?invocation.proceed();}//獲取值String?value?=?tableShard.value();//value是否字段名,如果是,需要解析請求參數字段名的值boolean?fieldFlag?=?tableShard.fieldFlag();if?(fieldFlag)?{//獲取請求參數Object?parameterObject?=?boundSql.getParameterObject();if?(parameterObject?instanceof?MapperMethod.ParamMap)?{?//ParamMap類型邏輯處理MapperMethod.ParamMap?parameterMap?=?(MapperMethod.ParamMap)?parameterObject;//根據字段名獲取參數值Object?valueObject?=?parameterMap.get(value);if?(valueObject?==?null)?{throw?new?RuntimeException(String.format("入參字段%s無匹配",?value));}//替換sqlreplaceSql(tableShard,?valueObject,?metaObject,?boundSql);}?else?{?//單參數邏輯//如果是基礎類型拋出異常if?(isBaseType(parameterObject))?{throw?new?RuntimeException("單參數非法,請使用@Param注解");}if?(parameterObject?instanceof?Map){Map<String,Object>??parameterMap?=??(Map<String,Object>)parameterObject;Object?valueObject?=?parameterMap.get(value);//替換sqlreplaceSql(tableShard,?valueObject,?metaObject,?boundSql);}?else?{//非基礎類型對象Class<?>?parameterObjectClass?=?parameterObject.getClass();Field?declaredField?=?parameterObjectClass.getDeclaredField(value);declaredField.setAccessible(true);Object?valueObject?=?declaredField.get(parameterObject);//替換sqlreplaceSql(tableShard,?valueObject,?metaObject,?boundSql);}}}?else?{//無需處理parameterField//替換sqlreplaceSql(tableShard,?value,?metaObject,?boundSql);}//執行下一個插件邏輯return?invocation.proceed();}@Overridepublic?Object?plugin(Object?target)?{//?當目標類是StatementHandler類型時,才包裝目標類,否者直接返回目標本身,?減少目標被代理的次數if?(target?instanceof?StatementHandler)?{return?Plugin.wrap(target,?this);}?else?{return?target;}}/***?@param?object*?@methodName:?isBaseType*?@author:?程序員阿星*?@description:?基本數據類型驗證,true是,false否*?@date:?2021/5/9*?@return:?boolean*/private?boolean?isBaseType(Object?object)?{if?(object.getClass().isPrimitive()||?object?instanceof?String||?object?instanceof?Integer||?object?instanceof?Double||?object?instanceof?Float||?object?instanceof?Long||?object?instanceof?Boolean||?object?instanceof?Byte||?object?instanceof?Short)?{return?true;}?else?{return?false;}}/***?@param?tableShard?分表注解*?@param?value??????值*?@param?metaObject?mybatis反射對象*?@param?boundSql???sql信息對象*?@author:?程序猿阿星*?@description:?替換sql*?@date:?2021/5/9*?@return:?void*/private?void?replaceSql(TableShard?tableShard,?Object?value,?MetaObject?metaObject,?BoundSql?boundSql)?{String?tableNamePrefix?=?tableShard.tableNamePrefix();//獲取策略classClass<??extends?ITableShardStrategy>?strategyClazz?=?tableShard.shardStrategy();//從spring?ioc容器獲取策略類ITableShardStrategy?tableShardStrategy?=?SpringUtil.getBean(strategyClazz);//生成分表名String?shardTableName?=?tableShardStrategy.generateTableName(tableNamePrefix,?value);//?獲取sqlString?sql?=?boundSql.getSql();//?完成表名替換metaObject.setValue("delegate.boundSql.sql",?sql.replaceAll(tableNamePrefix,?shardTableName));}/***?@param?invocation*?@author:?程序猿阿星*?@description:?獲取MetaObject對象-mybatis里面提供的一個工具類,類似反射的效果*?@date:?2021/5/9*?@return:?org.apache.ibatis.reflection.MetaObject*/private?MetaObject?getMetaObject(Invocation?invocation)?{StatementHandler?statementHandler?=?(StatementHandler)?invocation.getTarget();//?MetaObject是mybatis里面提供的一個工具類,類似反射的效果MetaObject?metaObject?=?MetaObject.forObject(statementHandler,SystemMetaObject.DEFAULT_OBJECT_FACTORY,SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY,defaultReflectorFactory);return?metaObject;}/***?@author:?程序猿阿星*?@description:?獲取分表注解*?@param?method*?@param?mappedStatement*?@date:?2021/5/9*?@return:?com.xing.shard.interceptor.TableShard*/private?TableShard?getTableShard(Method?method,?MappedStatement?mappedStatement)?throws?ClassNotFoundException?{String?id?=?mappedStatement.getId();//獲取Classfinal?String?className?=?id.substring(0,?id.lastIndexOf("."));//分表注解TableShard?tableShard?=?null;//獲取Mapper執行方法的TableShard注解tableShard?=?method.getAnnotation(TableShard.class);//如果方法沒有設置注解,從Mapper接口上面獲取TableShard注解if?(tableShard?==?null)?{//?獲取TableShard注解tableShard?=?Class.forName(className).getAnnotation(TableShard.class);}return?tableShard;}}

到了這里,其實分表功能就已經完成了,我們只需要把分表策略抽象接口、分表注解、分表攔截器抽成一個通用jar包,需要使用的項目引入這個jar,然后注冊分表攔截器,自己根據業務需求實現分表策略,在給對應的Mpaaer加上分表注解就好了。

實踐跑起來

這里阿星單獨寫了一套demo,場景是有兩個分表策略,表也提前建立好了

  • 根據id分表

    • tb_log_id_0

    • tb_log_id_1

  • 根據日期分表

    • tb_log_date_202105

    • tb_log_date_202106

預警:后面都是代碼實操環節,請各位讀者大大耐心看完(非Java開發除外)

TableShardStrategy定義

/***?@Author?wx*?@Description?分表策略日期*?@Date?2021/5/9*/ @Component public?class?TableShardStrategyDate?implements?ITableShardStrategy?{private?static?final?String?DATE_PATTERN?=?"yyyyMM";@Overridepublic?String?generateTableName(String?tableNamePrefix,?Object?value)?{verificationTableNamePrefix(tableNamePrefix);if?(value?==?null?||?StrUtil.isBlank(value.toString()))?{return?tableNamePrefix?+?"_"?+DateUtil.format(new?Date(),?DATE_PATTERN);}?else?{return?tableNamePrefix?+?"_"?+DateUtil.format(new?Date(),?value.toString());}} }***?@Author?程序猿阿星*?@Description?分表策略id*?@Date?2021/5/9*/ @Component public?class?TableShardStrategyId?implements?ITableShardStrategy?{@Overridepublic?String?generateTableName(String?tableNamePrefix,?Object?value)?{verificationTableNamePrefix(tableNamePrefix);if?(value?==?null?||?StrUtil.isBlank(value.toString()))?{throw?new?RuntimeException("value?is?null");}long?id?=?Long.parseLong(value.toString());//可以加入本地緩存優化return?tableNamePrefix?+?"_"?+?(id?%?2);} }

Mapper定義

Mapper接口

/***?@Author?程序猿阿星*?@Description*?@Date?2021/5/8*/ @TableShard(tableNamePrefix?=?"tb_log_date",shardStrategy?=?TableShardStrategyDate.class) public?interface?LogDateMapper?{/***?查詢列表-根據日期分表*/List<LogDate>?queryList();/***?單插入-根據日期分表*/void??save(LogDate?logDate);}-------------------------------------------------------------------------------------------------/***?@Author?程序猿阿星*?@Description*?@Date?2021/5/8*/ @TableShard(tableNamePrefix?=?"tb_log_id",value?=?"id",fieldFlag?=?true,shardStrategy?=?TableShardStrategyId.class) public?interface?LogIdMapper?{/***?根據id查詢-根據id分片*/LogId?queryOne(@Param("id")?long?id);/***?單插入-根據id分片*/void?save(LogId?logId);}

Mapper.xml

<?xml?version="1.0"?encoding="UTF-8"??> <!DOCTYPE?mapperPUBLIC?"-//mybatis.org//DTD?Mapper?3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper?namespace="com.xing.shard.mapper.LogDateMapper">//對應LogDateMapper#queryList函數<select?id="queryList"?resultType="com.xing.shard.entity.LogDate">selectid?as?id,comment?as?comment,create_date?as?createDatefromtb_log_date</select>//對應LogDateMapper#save函數<insert?id="save"?>insert?into?tb_log_date(id,?comment,create_date)values?(#{id},?#{comment},#{createDate})</insert> </mapper>-------------------------------------------------------------------------------------------------<?xml?version="1.0"?encoding="UTF-8"??> <!DOCTYPE?mapperPUBLIC?"-//mybatis.org//DTD?Mapper?3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper?namespace="com.xing.shard.mapper.LogIdMapper">//對應LogIdMapper#queryOne函數<select?id="queryOne"?resultType="com.xing.shard.entity.LogId">selectid?as?id,comment?as?comment,create_date?as?createDatefromtb_log_idwhereid?=?#{id}</select>//對應save函數<insert?id="save"?>insert?into?tb_log_id(id,?comment,create_date)values?(#{id},?#{comment},#{createDate})</insert></mapper>

執行下單元測試

日期分表單元測試執行

@Testvoid?test()?{LogDate?logDate?=?new?LogDate();logDate.setId(snowflake.nextId());logDate.setComment("測試內容");logDate.setCreateDate(new?Date());//插入logDateMapper.save(logDate);//查詢List<LogDate>?logDates?=?logDateMapper.queryList();System.out.println(JSONUtil.toJsonPrettyStr(logDates));}

輸出結果


id分表單元測試執行

@Testvoid?test()?{LogId?logId?=?new?LogId();long?id?=?snowflake.nextId();logId.setId(id);logId.setComment("測試");logId.setCreateDate(new?Date());//插入logIdMapper.save(logId);//查詢LogId?logIdObject?=?logIdMapper.queryOne(id);System.out.println(JSONUtil.toJsonPrettyStr(logIdObject));}

輸出結果

小結一下

本文可以當做對Mybatis進階的使用教程,通過Mybatis攔截器實現分表的功能,滿足基本的業務需求,雖然比較簡陋,但是Mybatis這種擴展機制與設計值得學習思考。

有興趣的讀者也可以自己寫一個,或基于阿星的做改造,畢竟是簡陋版本,還是有很多場景沒有考慮到。

另外分表的demo項目,放到了Gitee和公眾號,大家按需自取

- Gitee地址: https://gitee.com/jxncwx/shard

項目結構:

往期推薦

MyBatis 中為什么不建議使用 where 1=1?


SpringBoot 使用注解實現消息廣播功能


聊聊接口性能優化的11個小技巧


總結

以上是生活随笔為你收集整理的基于 MyBatis 手撸一个分表插件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

午夜影院日本 | 人人爽人人av | 夜夜视频 | 久久国产麻豆 | 久久线视频 | 国产亚洲精品无 | 国产美女免费观看 | 粉嫩一区二区三区粉嫩91 | 日韩精品一区二区免费 | 亚洲精品小区久久久久久 | 在线高清| 99久久婷婷国产综合亚洲 | 98精品国产自产在线观看 | 日韩在线精品 | 亚洲国产精品推荐 | 在线看片成人 | 天堂在线视频中文网 | 午夜手机电影 | 婷婷去俺也去六月色 | 日韩精品不卡在线观看 | 国产精品女同一区二区三区久久夜 | 亚洲精品美女 | 中文字幕av一区二区三区四区 | 999国内精品永久免费视频 | 亚洲一区二区三区毛片 | 国产91免费在线 | 日韩特级毛片 | 久草在线官网 | 国产破处精品 | 久久久久久片 | 操少妇视频 | 国产美女永久免费 | 夜夜躁天天躁很躁波 | 亚洲精品乱码久久久久久9色 | 99色免费视频 | 国产精品久久久久久久久久白浆 | 99视频国产精品 | 国产精品久久久99 | 插综合网 | 日韩精品免费在线播放 | 久久夜视频| 免费国产一区二区视频 | 在线91播放 | 亚洲午夜久久久综合37日本 | 亚洲精品玖玖玖av在线看 | 狠狠狠狠狠操 | av成人免费 | 亚洲精品美女久久久久网站 | 欧美日韩在线精品一区二区 | 久久久久亚洲精品国产 | 成人av资源 | 五月天堂色 | 狠狠操操网 | 狠狠色噜噜狠狠 | 成人中文字幕在线观看 | 在线导航福利 | 在线观看日韩 | av成人在线播放 | 欧美成年人在线视频 | 国产美女视频免费 | 丁香资源影视免费观看 | 狠狠色噜噜狠狠狠狠 | 免费看的黄网站 | 精品欧美小视频在线观看 | 激情视频免费观看 | 中文字幕超清在线免费 | 天天天天色综合 | 亚洲精品乱码久久久久久蜜桃不爽 | 精品一区二区三区久久久 | 91日韩精品一区 | 国产精品一区二区av | 91桃色视频 | 国产区在线看 | 欧美在线不卡一区 | 国产精品videoxxxx | 中文字幕精品一区久久久久 | 成人在线网站观看 | 成人中文字幕在线观看 | 亚洲综合激情网 | 国产精品免费小视频 | 91av久久 | 四虎4hu永久免费 | 特级毛片在线 | 日韩久久片 | 亚洲国产精品激情在线观看 | 一区二区视频在线免费观看 | 99精品欧美一区二区三区黑人哦 | 亚洲开心激情 | 久热这里有精品 | 国产精品男女 | 久久这里只有精品视频99 | 毛片基地黄久久久久久天堂 | 欧美久久久 | 欧美性一级观看 | 五月综合网站 | 美女网站在线播放 | 91九色成人蝌蚪首页 | 国产1级毛片| 久久天天躁狠狠躁亚洲综合公司 | 97小视频 | 亚洲精品久久久蜜桃 | 欧美性一级观看 | 日韩xxxxxxxxx | 欧美色图30p | 69性欧美 | 色婷婷免费视频 | www.香蕉视频在线观看 | 午夜精品成人一区二区三区 | 欧美一级特黄aaaaaa大片在线观看 | 久久超级碰视频 | 国产亚洲精品久久久久久移动网络 | 免费在线播放视频 | 亚洲片在线资源 | 亚洲日本成人网 | 玖玖精品在线 | 国产三级av在线 | 精品黄色在线观看 | 亚洲乱亚洲乱亚洲 | 日韩理论在线播放 | 欧美激情第八页 | www操操| 手机av观看 | 一级成人在线 | 日韩黄色免费在线观看 | 国产精品久久一区二区无卡 | 亚洲一区视频免费观看 | 天天看天天干 | 又大又硬又黄又爽视频在线观看 | 最近日本字幕mv免费观看在线 | 波多野结衣一区 | 成人黄色电影在线观看 | 日韩精品视频在线观看免费 | 国产一区二区三区免费在线 | 96久久欧美麻豆网站 | 欧美日韩3p | 国产综合福利在线 | 91免费观看国产 | 国产精品久久久久久久久费观看 | 中文字幕免费 | 日韩在线电影一区二区 | 国产精品区在线观看 | 中文乱码视频在线观看 | 久久久国产一区 | 国产日韩精品久久 | 在线成人看片 | 97视频免费在线看 | 久久免费激情视频 | 91看成人 | 亚洲成人av在线电影 | 在线观看精品黄av片免费 | 日本久久高清视频 | 亚洲乱码国产乱码精品天美传媒 | 国产精品入口久久 | 国产亚洲精品久久久久久 | 丁香5月婷婷 | 五月婷婷欧美视频 | 91完整版| 欧美激情综合五月色丁香 | 亚洲欧美视频在线 | 婷婷在线观看视频 | 国产视频精品免费播放 | 女人高潮特级毛片 | 欧美一区二区在线免费观看 | 久久久激情视频 | 国产精品无av码在线观看 | 久久精品视频免费播放 | 99性视频 | 成人三级网址 | 久久国产免费视频 | 亚洲黄色片 | 一区二区伦理电影 | 99r国产精品| 草久在线观看 | 国内成人综合 | 97人人超碰在线 | 激情自拍av | 正在播放一区二区 | 日本精品免费看 | 99久热在线精品视频成人一区 | 国产免费一区二区三区最新6 | 久久精品视频中文字幕 | 精品久久久久久亚洲综合网站 | 涩涩网站在线观看 | 91精品国产欧美一区二区成人 | 国色天香av | 91综合久久一区二区 | 国产亚洲视频在线免费观看 | 91中文字幕在线播放 | 99精品热视频 | 国产一级视频 | 蜜臀aⅴ国产精品久久久国产 | 97视频免费| 日本视频网 | 91影视成人| 91超碰在线播放 | 天天操天天爽天天干 | 蜜臀av免费一区二区三区 | 午夜视频播放 | 精品麻豆 | 国产精品久久久久久久久久久不卡 | 国产在线精品视频 | 五月婷网| 国精产品一二三线999 | 天天综合中文 | 亚洲综合小说电影qvod | 不卡国产视频 | 91天天操| 国产一级片视频 | 日本黄色免费看 | 在线草| 一区二区三区中文字幕在线观看 | 一级欧美一级日韩 | 一级a性色生活片久久毛片波多野 | 日韩精品专区在线影院重磅 | 亚洲国产精品第一区二区 | 99精品国产99久久久久久福利 | 日韩在线看片 | 91精品伦理 | 日韩中午字幕 | 天天色图 | 国产亚州av| 91在线www | 91av视频在线免费观看 | 五月黄色| 久久综合免费视频影院 | 久草电影免费在线观看 | 国产精品一区免费看8c0m | 色a在线观看| 91精品国产高清自在线观看 | 中文字幕资源站 | 天天曰天天射 | 特黄免费av | 最新av免费在线 | 久久99精品久久久久婷婷 | 中文字幕不卡在线88 | 久黄色 | 国产精品久久久久影视 | 91香蕉视频黄色 | 午夜国产一区 | 精品久久久久国产免费第一页 | 国产精品第 | 国产午夜精品久久久久久久久久 | 日韩中文字幕a | 国产一级免费视频 | 国产日本在线 | 天天天天爱天天躁 | 欧美一级电影免费观看 | 国产精品不卡视频 | 日韩乱色精品一区二区 | 特级毛片爽www免费版 | 成人性生交视频 | 亚洲精品合集 | 色国产在线 | 国产福利专区 | 在线观看日韩免费视频 | 久一在线 | 天堂在线一区二区 | 国产一级电影网 | 亚州日韩中文字幕 | 中国精品一区二区 | 久久99精品久久久久久秒播蜜臀 | 五月婷视频 | 欧美国产视频在线 | 国产一区成人在线 | 成年人三级网站 | 欧美日韩中文国产一区发布 | 免费99视频 | 天天色天天| 国产午夜精品一区二区三区在线观看 | 在线观看 亚洲 | 成年人视频在线免费播放 | 久在线观看 | 国际av在线 | 综合色综合 | 天天做日日爱夜夜爽 | 亚洲精品黄色在线观看 | 国产一级片不卡 | 久久激情五月丁香伊人 | 国产成人精品在线观看 | 欧美激情另类文学 | 久久精品视频在线观看 | 婷婷国产在线观看 | 在线免费观看的av | 久久专区 | 亚洲黄色免费观看 | 激情 亚洲| 超碰在线成人 | 久草免费在线 | 国产护士在线 | 99精品黄色片免费大全 | 国产护士av| 国产精品一区二区无线 | 91精品蜜桃| 国产精品久久久久aaaa九色 | 91人网站 | 色99中文字幕 | 国产在线不卡 | www视频免费在线观看 | 九九久久久久久久久激情 | 国产色视频网站2 | 天天摸天天干天天操天天射 | 综合中文字幕 | 国产黄色网 | 久精品视频免费观看2 | 黄色在线网站噜噜噜 | 一二区精品| 最近中文字幕国语免费高清6 | 亚洲乱码精品 | 91麻豆精品一区二区三区 | 亚州国产精品视频 | 精品婷婷 | 日本3级在线观看 | 久久国产精品视频 | 色停停五月天 | 99视频在线精品国自产拍免费观看 | 一级性视频 | 国产亚洲视频在线 | 精品美女久久久久 | 国产伦精品一区二区三区无广告 | 久草99 | 91麻豆精品国产91久久久久久 | 日本最新一区二区三区 | 亚洲国产中文字幕 | 成人蜜桃网 | 久草在线视频在线观看 | 婷婷网站天天婷婷网站 | 五月天堂色 | 久久 亚洲视频 | 免费在线一区二区 | 香蕉在线视频播放网站 | 国产在线第三页 | 国产精品丝袜 | 国产视频一区二区在线播放 | 少妇bbr搡bbb搡bbb | 欧美精品亚洲二区 | 黄色影院在线播放 | 五月婷婷色播 | 亚洲精品在线国产 | 日日综合网| 国产中文字幕免费 | 久久久久久草 | 亚洲综合在线五月 | 国产精品久久久久久久久毛片 | 天天色综合三 | 日韩三级视频在线观看 | 狠狠色丁香婷婷综合久小说久 | 91试看 | 91探花在线视频 | 国产亚洲精品久久网站 | 久久久久国产精品免费 | 欧洲色吧 | 天堂网一区二区三区 | 婷婷5月色| 日本少妇视频 | 日韩激情视频 | 久久久久国产精品免费 | 精品一区二区在线免费观看 | 91麻豆免费视频 | 成人午夜影院 | 高清av中文在线字幕观看1 | 国产污视频在线观看 | 丁香在线视频 | 人人网av | 久久久久久久久久久影视 | 四虎永久国产精品 | 香蕉久久久久久久 | 日韩在线播放视频 | 久久新 | 日本中文字幕一二区观 | 亚洲免费婷婷 | 91九色成人蝌蚪首页 | 国产福利精品在线观看 | 五月婷婷开心中文字幕 | a黄色影院 | 97久久精品午夜一区二区 | 日本爱爱免费 | 久久免费毛片视频 | 久久久精品在线观看 | 国产又粗又猛又爽又黄的视频免费 | 久久久久国产成人免费精品免费 | av成人在线播放 | 特级黄色电影 | 国产小视频在线 | 在线精品视频免费播放 | 免费观看国产精品 | 久久久久久久久久电影 | 久久伊人国产精品 | 久草在线久草在线2 | 免费h精品视频在线播放 | 国产精品情侣视频 | 在线免费看片 | 美女视频黄色免费 | 黄色大片日本免费大片 | 欧美黑人性爽 | 国产乱码精品一区二区三区介绍 | 亚洲精选视频免费看 | 奇米777777 | 欧美一级艳片视频免费观看 | 啪啪凸凸| 久久久网址 | 国产亚洲成av片在线观看 | 国产成人在线观看 | 日日干夜夜骑 | 一区二区中文字幕在线播放 | 狠狠干狠狠插 | 国产一级视频免费看 | 免费国产黄线在线观看视频 | 亚洲综合成人在线 | 992tv在线成人免费观看 | 日韩在线观看你懂得 | 久久色视频 | 免费视频网 | 日韩在线视频观看免费 | 久久神马影院 | 亚洲aⅴ在线 | 国产剧情av在线播放 | 婷婷六月网 | av午夜电影 | 亚洲成人999 | 高清精品久久 | 欧美日韩国产色综合一二三四 | 国产福利av在线 | 国产精品日韩在线观看 | av在线电影网站 | 久久大片 | 国产专区一 | 亚洲精品国产精品国自产观看 | 国产 字幕 制服 中文 在线 | 欧美性色xo影院 | 天天干,天天插 | 久久久穴 | 91喷水| 99看视频在线观看 | 久久精品一 | 91大神dom调教在线观看 | 亚洲精品久久久久久久不卡四虎 | 国产精品不卡一区 | 免费在线观看av网站 | 日本激情视频中文字幕 | 国产视频1区2区3区 久久夜视频 | 在线免费观看亚洲视频 | 国产在线观看一 | 日韩成人中文字幕 | 欧美在线18 | 99re国产视频 | 国产免费中文字幕 | 在线免费91 | 欧洲精品在线视频 | 片网站| 国产精品久久嫩一区二区免费 | 婷婷色综合色 | 在线观看韩国av | 久草青青在线观看 | 中文在线| 日韩视频免费 | 丰满少妇一级片 | 亚洲爱爱视频 | 国产精品第54页 | 久久av中文字幕片 | 人人爱在线视频 | 成人在线免费视频 | 欧美精品被 | 日本三级在线观看中文字 | 伊人天堂网| 亚洲美女久久 | 欧美日本啪啪无遮挡网站 | 国产99久久99热这里精品5 | 91av在线电影 | www黄在线| 色爱成人网 | 久草97| 97视频免费在线 | 天堂av免费在线 | 国产一区二三区好的 | 日韩三级.com | 亚洲免费激情 | av福利在线播放 | 91高清在线看 | 日本久久不卡视频 | 国产精品18久久久久久首页狼 | 国产视频中文字幕 | 日韩电影一区二区在线观看 | 中文字幕一二三区 | 欧美日韩视频免费看 | 中文字幕久久久精品 | 日韩视频免费观看高清 | 婷婷激情久久 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 99精品视频在线观看视频 | 日本精品一 | 婷婷色九月 | 在线视频中文字幕一区 | 久热色超碰 | 亚洲成人av在线电影 | 黄色一级免费 | 91看片在线播放 | 色网站国产精品 | 国产成人久久77777精品 | 国产91九色视频 | 国产在线精品播放 | 国产 日韩 在线 亚洲 字幕 中文 | 黄网站色视频免费观看 | 18pao国产成视频永久免费 | 午夜av在线电影 | 麻花传媒mv免费观看 | 91精品一区二区三区久久久久久 | 国产亚洲片| 欧美日韩一区二区三区在线观看视频 | 91综合久久一区二区 | 久久黄页 | 高清精品久久 | 国产成人精品一区二区三区福利 | 成人四虎影院 | 欧美日韩国产精品爽爽 | 九九天堂| 欧美激情视频在线观看免费 | 久久久穴 | 久久久夜色 | 国产精品原创视频 | 亚洲精品国产自产拍在线观看 | 少妇精品久久久一区二区免费 | 麻豆高清免费国产一区 | 91成人精品一区在线播放69 | 911精品美国片911久久久 | 国产群p| 国产视频一区精品 | 在线日韩一区 | 国产做a爱一级久久 | 久久狠狠婷婷 | 99热国产在线中文 | av再线观看 | 日韩伦理一区二区三区av在线 | 天天干天天综合 | 色综合在| 久久99国产精品久久 | 一区二区三区在线观看中文字幕 | 欧美日韩国产一区二区在线观看 | 精品久久久久久国产 | 久久九九免费 | 欧美精品乱码99久久影院 | 成年人免费在线播放 | 在线播放日韩av | 激情狠狠干 | 亚洲欧美成人综合 | 免费高清在线一区 | 国产在线视频一区二区三区 | 国产精品ssss在线亚洲 | 色偷偷中文字幕 | 免费网站色 | 免费中午字幕无吗 | 五月天亚洲综合 | wwxxx日本| 奇米影视777四色米奇影院 | 一区在线播放 | 久久久久亚洲a | 五月激情电影 | 欧美日韩国产网站 | 福利电影一区二区 | 免费一级片在线观看 | 久久天天躁狠狠躁亚洲综合公司 | 久久精品香蕉视频 | 日韩欧美精品在线 | 在线观看a视频 | 午夜精品一区二区三区四区 | 美女久久久久久久久久久 | 国产在线视频资源 | 偷拍久久久 | 精品久久久久久久久久久院品网 | 18国产精品白浆在线观看免费 | 亚洲午夜精品久久久久久久久 | 亚洲精品白浆高清久久久久久 | 国产视频九色蝌蚪 | 日韩专区一区二区 | 中文字幕在线观看网站 | 99九九免费视频 | 美女久久99| 成人欧美一区二区三区在线观看 | 黄色的视频 | 人人玩人人添人人 | 中文字幕免费国产精品 | 亚洲精品在线看 | 国产精品乱码一区二三区 | 欧美一级黄色网 | 亚洲综合色婷婷 | 久久综合欧美精品亚洲一区 | 国产久视频 | 欧美日本不卡视频 | 美女精品在线 | 国产成人三级三级三级97 | 中文字幕你懂的 | 18pao国产成视频永久免费 | 9ⅰ精品久久久久久久久中文字幕 | 丁香五月亚洲综合在线 | 成年人在线观看免费视频 | 色网站免费在线看 | 国产精品美女免费视频 | 天堂av观看 | 免费看片黄色 | 亚洲精品高清在线观看 | 精品特级毛片 | 人人澡人摸人人添学生av | 亚洲午夜精品一区二区三区电影院 | 色综合五月天 | 一区二区三区在线观看中文字幕 | 久草网在线观看 | 久草在线播放视频 | 亚洲成人影音 | 天天综合狠狠精品 | 亚洲97在线| av黄色av| 久久久久久高潮国产精品视 | 99久久精品免费一区 | 2018好看的中文在线观看 | 中文字幕丝袜美腿 | www.久艹| 西西www4444大胆视频 | 一区二区理论片 | 中文字幕黄色av | 91最新视频在线观看 | 91 中文字幕 | 在线观看黄av | 久久久久这里只有精品 | 麻豆av一区二区三区在线观看 | 不卡电影一区二区三区 | 国产一区二区在线免费 | 久久草视频 | 四虎永久免费 | 久久久三级视频 | 国产一区免费视频 | 日韩免费区 | 精品国产成人在线 | 免费看日韩 | 婷婷丁香在线视频 | 欧美另类重口 | 日韩精品一区在线观看 | 久草视频播放 | 久草网在线视频 | 九月婷婷人人澡人人添人人爽 | 日韩不卡高清 | 久久久网| 91在线91拍拍在线91 | 91中文字幕在线播放 | 久久午夜国产精品 | 999日韩 | 日韩久久精品一区二区 | www.天天操 | 日韩精品不卡 | 久久新视频 | 正在播放五月婷婷狠狠干 | 久艹在线观看视频 | 亚洲最新av网址 | 美女免费av| 99久久99久国产黄毛片 | 青青河边草免费视频 | 日韩免费一级a毛片在线播放一级 | 女人18片毛片90分钟 | 精品福利av | 中文字幕av全部资源www中文字幕在线观看 | 在线观看中文字幕dvd播放 | 免费观看www视频 | 中文字幕亚洲五码 | 欧美九九九 | av三级在线看 | 日韩av在线一区二区 | 国产资源在线播放 | 美女视频黄是免费的 | 美女视频黄的免费的 | 91av福利视频| 欧美伦理电影一区二区 | 91污污视频在线观看 | 欧美精品免费一区二区 | 日韩二区三区在线观看 | 伊色综合久久之综合久久 | 精品一区av | 欧美三级免费 | 色狠狠婷婷 | 亚洲小视频在线 | 国产在线观看国语版免费 | 国产精品精| 国产精品黄网站在线观看 | 亚洲理论在线 | 亚洲国产欧美在线看片xxoo | 国产99久久精品一区二区300 | 久久天天躁狠狠躁夜夜不卡公司 | 91视频首页| 在线观看中文字幕2021 | 国产色视频网站2 | 日韩视频一区二区在线 | av在观看 | 日韩激情免费视频 | 日本成人免费在线观看 | av大全免费在线观看 | 久久99久| 91精品一 | 91 在线视频 | 992tv人人草| 亚洲精品影院在线观看 | 国产清纯在线 | 久久一区国产 | 91成年人视频 | 日韩精品专区在线影院重磅 | 91 在线视频 | 一区二区观看 | 久草在线| 激情欧美丁香 | 精品国产一区二区三区久久久久久 | 91九色网站| 在线观看黄污 | 亚洲国产精品小视频 | 国产老妇av | 久久免费视频6 | 中文字幕第 | 欧美性大战久久久久 | 天天干天天干天天干 | 中文字幕在线观看你懂的 | 公与妇乱理三级xxx 在线观看视频在线观看 | 国产精品久久久久一区二区三区 | 狠狠操操 | 国产精品免费看 | 国产一区二区不卡视频 | 日本性视频 | 精品久久久99 | 九九99 | 麻豆成人网 | 97在线影院 | 久久久久久久免费观看 | 日韩一区在线免费观看 | 免费看短 | 一区二区三区在线视频111 | 免费a视频 | www黄色av | 五月天九九 | 五月婷婷欧美视频 | 日本系列中文字幕 | 欧美另类tv | 在线观看黄色的网站 | 91精品在线播放 | 精品一区二区日韩 | 男女拍拍免费视频 | 不卡av电影在线观看 | 中文字幕乱在线伦视频中文字幕乱码在线 | 国内成人综合 | 欧美日韩在线播放 | 成人精品久久久 | 国语对白少妇爽91 | 亚洲天堂网站 | 免费日韩 精品中文字幕视频在线 | 日韩三级不卡 | 人人干免费 | 日韩在线观看av | 国产精品第一 | 最新真实国产在线视频 | 亚洲国产精品va在线看黑人 | 狠狠gao | 不卡的av在线 | 免费在线播放av电影 | 99视频导航 | 日韩系列在线观看 | 免费看毛片网站 | 狠狠色丁香久久婷婷综合五月 | 三级黄色理论片 | 人成午夜视频 | 亚洲作爱 | 免费观看成年人视频 | 成人国产精品久久久久久亚洲 | 91九色国产在线 | 日韩有码第一页 | 国产色拍拍拍拍在线精品 | 午夜久操 | 国产精品一区二区av | 国产欧美在线一区二区三区 | 精品亚洲男同gayvideo网站 | 一区二区不卡 | 久久精品毛片 | 色多多污污在线观看 | 亚洲三级网 | 毛片网站免费在线观看 | 亚洲人成人在线 | 欧美日韩中文在线 | 国产日韩精品一区二区三区 | 91视频下载| 国产偷国产偷亚洲清高 | 成人午夜av电影 | a视频在线观看免费 | 国产a国产a国产a | 国产激情久久久 | 又黄又爽又色无遮挡免费 | 日韩一区二区三区不卡 | 欧美a在线看 | 国产最新在线 | 超碰97国产精品人人cao | 激情婷婷 | 天天色视频 | 国产成人高清 | 六月激情久久 | 精品99久久| 亚洲一级黄色大片 | 久久久精品在线观看 | 亚洲精品欧洲精品 | 国产一二三四在线视频 | 激情久久久 | 人人爽人人舔 | 亚洲欧美国产日韩在线观看 | 中文字幕一区二区三区四区视频 | 欧美精选一区二区三区 | 中文国产在线观看 | 青青草国产免费 | 国产一区在线观看免费 | 91在线永久| 国产精品激情偷乱一区二区∴ | 99免费在线 | 中文字幕免费一区 | 中文字幕免费在线 | 操操操com| 激情综合狠狠 | 麻豆国产精品一区二区三区 | 精品国产一区二区三区噜噜噜 | 久久九九国产视频 | 天天天在线综合网 | 免费av在线网站 | 97天天干| 日韩免费观看一区二区 | 成人黄色电影在线 | 日韩电影在线观看一区 | 免费瑟瑟网站 | 国内精品久久久久久久 | 99久久精品无码一区二区毛片 | 国产精品不卡在线观看 | 国产亚洲精品久久久久久久久久 | 日本丰满少妇免费一区 | 月丁香婷婷 | 女人高潮特级毛片 | 中文字幕亚洲欧美日韩2019 | а中文在线天堂 | 丝袜美腿亚洲 | 中文字幕黄网 | 国产一区精品在线观看 | 成人在线视频在线观看 | 精品中文字幕在线观看 | 五月婷婷精品 | 天天爽夜夜爽人人爽曰av | 国产一级黄 | 狠狠色噜噜狠狠狠合久 | 欧美日韩1区2区 | 久久嗨| 97精品国产97久久久久久粉红 | 在线看一区 | 国产精品九九久久久久久久 | 亚洲国产日韩欧美在线 | 欧美综合在线视频 | 91精品视频在线观看免费 | 久久精品中文视频 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 国产v视频 | 视频一区在线播放 | 黄污在线看 | 91精品视频免费 | 四虎影视成人精品国库在线观看 | 97免费公开视频 | 欧美日韩免费一区二区 | 成人av资源网站 | 日本成人黄色片 | 国产精品久久毛片 | 四虎国产精品成人免费4hu | 91视频在线国产 | 4438全国亚洲精品在线观看视频 | 成人av电影免费 | 日本中文不卡 | 日日躁夜夜躁aaaaxxxx | 又黄又爽又无遮挡免费的网站 | 国产 欧美 在线 | 一区二区三区日韩在线观看 | 亚洲一区 av| 欧美人操人 | 免费视频久久久久久久 | 999国内精品永久免费视频 | 又黄又爽又刺激的视频 | 欧美成人在线免费 | 国产免费观看视频 | 伊人电影天堂 | 国产精品久久久久久爽爽爽 | 午夜视频日本 | 九九九热精品免费视频观看 | 亚洲专区中文字幕 | 色网站在线 | 激情网综合| 亚洲传媒在线 | 欧美一区二区三区免费观看 | 亚洲综合视频网 | 激情网站网址 | 狠狠色狠狠综合久久 | 国产精品手机在线播放 | 久久调教视频 | 韩国av一区二区 | 亚洲欧美视频 | 亚洲国产精品va在线看黑人动漫 | 亚洲精品国产成人av在线 | 亚洲美女免费精品视频在线观看 | 97免费公开视频 | 天堂av在线网站 | 中文在线中文a | 久久久国产成人 | 日韩欧美久久 | 国产视频69 | 中文字幕2021 | 又黄又爽的视频在线观看网站 | www.97视频 | 国产精品久久久久久久久久 | 国产精品白丝jk白祙 | 99久久影视 | 欧美日本啪啪无遮挡网站 | 一级黄色片在线免费观看 | 91大神免费在线观看 | 99re6热在线精品视频 | 日韩欧美视频在线观看免费 | 欧美激情亚洲综合 | 亚洲小视频在线观看 | 伊人永久在线 | 91免费在线视频 | 美女网站视频免费都是黄 | 日韩色中色 | 国产成人精品一区二区 | 久草视频看看 | 91在线视频免费91 | 国产精品毛片久久蜜 | 精品女同一区二区三区在线观看 | www.com久久久| 日韩精品一区二区三区电影 | 国产无套一区二区三区久久 | 人人爽人人插 | 人人爽人人片 | 成人久久久久久久久久 | 一区二区成人国产精品 | 麻豆免费视频网站 | 免费精品久久久 | 色资源中文字幕 | 网站你懂的 | 97超碰色 | 亚洲无吗av| 久久99在线| 国产精品久久久久久一二三四五 | 午夜一级免费电影 | 91精品综合在线观看 | 91豆花在线 | 国产精品初高中精品久久 | 六月激情丁香 | 免费看片网址 | 国产精品免费久久久久影院仙踪林 | 在线不卡的av | 中文字幕在线一区二区三区 | 日韩理论在线 | 天天插日日插 | 国产精品成人久久久久 | 99色精品视频 | 国产精品入口麻豆www | 日韩三级视频在线观看 | 91精品国产一区二区三区 | 国产精品乱码高清在线看 | 亚洲黄在线观看 | 99国产情侣在线播放 | 麻豆免费视频 | 激情五月婷婷激情 | 97精品国产手机 | 国产精品99久久久久久久久 | 午夜影院一区 | 97精品国产91久久久久久 | 国语黄色片 | 成年美女黄网站色大片免费看 | 一区精品久久 | 国产h在线观看 | 808电影| 天堂av影院 | 亚洲国产日韩精品 | 免费一级片在线 | 免费看的黄色 | 精品免费国产一区二区三区四区 | 五月婷婷视频 | 国产精品久久久久一区二区三区 | 国产黄色片在线免费观看 | 国产拍揄自揄精品视频麻豆 | 久久国内视频 | 人人超碰人人 | 一区二区三区影院 | 亚洲一区二区三区在线看 | 久久草| 超级碰碰碰视频 | 99久久婷婷国产精品综合 | 国产精品久久久精品 | www.色就是色 | 伊人午夜 | 国产精品网红直播 | 操操综合网 | 手机看片国产日韩 | 国产视频一区精品 | 国产精品乱码久久久 | 免费亚洲精品视频 | 手机av永久免费 | av高清网站在线观看 |