国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

Mybatis-Plus 支持分庫分表了?-官方神器發(fā)布!

共 15118字,需瀏覽 31分鐘

 ·

2021-12-10 00:19

今天介紹一個(gè) MyBatis - Plus 官方發(fā)布的神器:mybatis-mate 為 mp 企業(yè)級模塊,支持分庫分表,數(shù)據(jù)審計(jì)、數(shù)據(jù)敏感詞過濾(AC算法),字段加密,字典回寫(數(shù)據(jù)綁定),數(shù)據(jù)權(quán)限,表結(jié)構(gòu)自動(dòng)生成 SQL 維護(hù)等,旨在更敏捷優(yōu)雅處理數(shù)據(jù)。

主要功能

  • 字典綁定

  • 字段加密

  • 數(shù)據(jù)脫敏

  • 表結(jié)構(gòu)動(dòng)態(tài)維護(hù)

  • 數(shù)據(jù)審計(jì)記錄

  • 數(shù)據(jù)范圍(數(shù)據(jù)權(quán)限)

  • 數(shù)據(jù)庫分庫分表、動(dòng)態(tài)據(jù)源、讀寫分離、數(shù)- - 據(jù)庫健康檢查自動(dòng)切換。

2、使用

2.1 依賴導(dǎo)入

Spring Boot 引入自動(dòng)依賴注解包
<dependency>
??<groupId>com.baomidougroupId>

??<artifactId>mybatis-mate-starterartifactId>
??<version>1.0.8version>
dependency>

注解(實(shí)體分包使用)

<dependency>
??<groupId>com.baomidougroupId>

??<artifactId>mybatis-mate-annotationartifactId>
??<version>1.0.8version>
dependency>

2.2 字段數(shù)據(jù)綁定(字典回寫)

例如 user_sex 類型 sex 字典結(jié)果映射到 sexText 屬性

@FieldDict(type?=?"user_sex", target =?"sexText")
private?Integer sex;

private?String?sexText;

實(shí)現(xiàn) IDataDict 接口提供字典數(shù)據(jù)源,注入到 Spring 容器即可。

@Component
public?class?DataDict?implements?IDataDict {

????/**
?????* 從數(shù)據(jù)庫或緩存中獲取
?????*/

????private?Map<String,?String> SEX_MAP =?new?ConcurrentHashMap<String,?String>() {{
????????put("0",?"女");
????????put("1",?"男");
????}};

????@Override
????public?String?getNameByCode(FieldDict fieldDict,?String?code) {
????????System.err.println("字段類型:"?+ fieldDict.type() +?",編碼:"?+ code);
????????return?SEX_MAP.get(code);
????}
}

2.3 字段加密

屬性 @FieldEncrypt 注解即可加密存儲(chǔ),會(huì)自動(dòng)解密查詢結(jié)果,支持全局配置加密密鑰算法,及注解密鑰算法,可以實(shí)現(xiàn) IEncryptor 注入自定義算法。

@FieldEncrypt(algorithm = Algorithm.PBEWithMD5AndDES)
private?String?password;

2.4 字段脫敏

屬性 @FieldSensitive 注解即可自動(dòng)按照預(yù)設(shè)策略對源數(shù)據(jù)進(jìn)行脫敏處理,默認(rèn) SensitiveType 內(nèi)置 9 種常用脫敏策略。
例如:中文名、銀行卡賬號(hào)、手機(jī)號(hào)碼等 脫敏策略。也可以自定義策略如下:
@FieldSensitive(type?=?"testStrategy")
private?String?username;

@FieldSensitive(type?= SensitiveType.mobile)
private?String?mobile;

自定義脫敏策略 testStrategy 添加到默認(rèn)策略中注入 Spring 容器即可。

@Configuration
public?class?SensitiveStrategyConfig?{

????/**
?????* 注入脫敏策略
?????*/

????@Bean
????public?ISensitiveStrategy?sensitiveStrategy()?{
????????// 自定義 testStrategy 類型脫敏處理
????????return?new?SensitiveStrategy().addStrategy("testStrategy", t -> t +?"***test***");
????}
}

例如文章敏感詞過濾

/**
?* 演示文章敏感詞過濾
?*/

@RestController
public?class?ArticleController?{
????@Autowired
????private?SensitiveWordsMapper sensitiveWordsMapper;

????// 測試訪問下面地址觀察請求地址、界面返回?cái)?shù)據(jù)及控制臺(tái)( 普通參數(shù) )
????// 無敏感詞 http://localhost:8080/info?content=tom&see=1&age=18
????// 英文敏感詞 http://localhost:8080/info?content=my%20content%20is%20tomcat&see=1&age=18
????// 漢字敏感詞 http://localhost:8080/info?content=%E7%8E%8B%E5%AE%89%E7%9F%B3%E5%94%90%E5%AE%8B%E5%85%AB%E5%A4%A7%E5%AE%B6&see=1
????// 多個(gè)敏感詞 http://localhost:8080/info?content=%E7%8E%8B%E5%AE%89%E7%9F%B3%E6%9C%89%E4%B8%80%E5%8F%AA%E7%8C%ABtomcat%E6%B1%A4%E5%A7%86%E5%87%AF%E7%89%B9&see=1&size=6
????// 插入一個(gè)字變成非敏感詞 http://localhost:8080/info?content=%E7%8E%8B%E7%8C%AB%E5%AE%89%E7%9F%B3%E6%9C%89%E4%B8%80%E5%8F%AA%E7%8C%ABtomcat%E6%B1%A4%E5%A7%86%E5%87%AF%E7%89%B9&see=1&size=6
????@GetMapping("/info")
????public?String?info(Article article)?throws?Exception?{
????????return?ParamsConfig.toJson(article);
????}


????// 添加一個(gè)敏感詞然后再去觀察是否生效 http://localhost:8080/add
????// 觀察【貓】這個(gè)詞被過濾了 http://localhost:8080/info?content=%E7%8E%8B%E5%AE%89%E7%9F%B3%E6%9C%89%E4%B8%80%E5%8F%AA%E7%8C%ABtomcat%E6%B1%A4%E5%A7%86%E5%87%AF%E7%89%B9&see=1&size=6
????// 嵌套敏感詞處理 http://localhost:8080/info?content=%E7%8E%8B%E7%8C%AB%E5%AE%89%E7%9F%B3%E6%9C%89%E4%B8%80%E5%8F%AA%E7%8C%ABtomcat%E6%B1%A4%E5%A7%86%E5%87%AF%E7%89%B9&see=1&size=6
????// 多層嵌套敏感詞 http://localhost:8080/info?content=%E7%8E%8B%E7%8E%8B%E7%8C%AB%E5%AE%89%E7%9F%B3%E5%AE%89%E7%9F%B3%E6%9C%89%E4%B8%80%E5%8F%AA%E7%8C%ABtomcat%E6%B1%A4%E5%A7%86%E5%87%AF%E7%89%B9&see=1&size=6
????@GetMapping("/add")
????public?String?add()?throws?Exception?{
????????Long id =?3L;
????????if?(null?== sensitiveWordsMapper.selectById(id)) {
????????????System.err.println("插入一個(gè)敏感詞:"?+ sensitiveWordsMapper.insert(new?SensitiveWords(id,?"貓")));
????????????// 插入一個(gè)敏感詞,刷新算法引擎敏感詞
????????????SensitiveWordsProcessor.reloadSensitiveWords();
????????}
????????return?"ok";
????}

????// 測試訪問下面地址觀察控制臺(tái)( 請求json參數(shù) )
????// idea 執(zhí)行 resources 目錄 TestJson.http 文件測試
????@PostMapping("/json")
????public?String?json(@RequestBody Article article)?throws?Exception?{
????????return?ParamsConfig.toJson(article);
????}
}

2.5 DDL 數(shù)據(jù)結(jié)構(gòu)自動(dòng)維護(hù)

解決升級表結(jié)構(gòu)初始化,版本發(fā)布更新 SQL 維護(hù)問題,目前支持 MySql、PostgreSQL。

@Component
public?class?PostgresDdl?implements?IDdl?{

????/**
?????* 執(zhí)行 SQL 腳本方式
?????*/

????@Override
????public?List?getSqlFiles()?{
????????return?Arrays.asList(
????????????????// 內(nèi)置包方式
????????????????"db/tag-schema.sql",
????????????????// 文件絕對路徑方式
????????????????"D:\\db\\tag-data.sql"
????????);
????}
}

不僅僅可以固定執(zhí)行,也可以動(dòng)態(tài)執(zhí)行??!

ddlScript.run(new StringReader("DELETE?FROM?user;\n" +
????????????????"INSERT?INTO?user?(id, username,?password, sex, email)?VALUES\n" +
????????????????"
(20,?'Duo',?'123456',?0,?'[email protected]');"));

它還支持多數(shù)據(jù)源執(zhí)行!!!

@Component
public?class?MysqlDdl?implements?IDdl?{

????@Override
????public?void?sharding(Consumer consumer)?
{
????????// 多數(shù)據(jù)源指定,主庫初始化從庫自動(dòng)同步
????????String?group?=?"mysql";
????????ShardingGroupProperty sgp = ShardingKey.getDbGroupProperty(group);
????????if?(null?!= sgp) {
????????????// 主庫
????????????sgp.getMasterKeys().forEach(key -> {
????????????????ShardingKey.change(group?+ key);
????????????????consumer.accept(this);
????????????});
????????????// 從庫
????????????sgp.getSlaveKeys().forEach(key -> {
????????????????ShardingKey.change(group?+ key);
????????????????consumer.accept(this);
????????????});
????????}
????}

????/**
?????* 執(zhí)行 SQL 腳本方式
?????*/

????@Override
????public?List?getSqlFiles()?
{
????????return?Arrays.asList("db/user-mysql.sql");
????}
}

2.6 動(dòng)態(tài)多數(shù)據(jù)源主從自由切換

@Sharding 注解使數(shù)據(jù)源不限制隨意使用切換,你可以在 mapper 層添加注解,按需求指哪打哪?。?/span>

@Mapper
@Sharding("mysql")
public interface UserMapper extends BaseMapper {

????@Sharding("postgres")
????Long selectByUsername(String username);
}

你也可以自定義策略統(tǒng)一調(diào)兵遣將

@Component
public?class?MyShardingStrategy?extends?RandomShardingStrategy?{

????/**
?????* 決定切換數(shù)據(jù)源 key {@link?ShardingDatasource}
?????*
?????*?@param?group 動(dòng)態(tài)數(shù)據(jù)庫組
?????*?@param?invocation {@link?Invocation}
?????*?@param?sqlCommandType {@link?SqlCommandType}
?????*/

????@Override
????public?void?determineDatasourceKey(String group, Invocation invocation, SqlCommandType sqlCommandType)?{
????????// 數(shù)據(jù)源組 group 自定義選擇即可, keys 為數(shù)據(jù)源組內(nèi)主從多節(jié)點(diǎn),可隨機(jī)選擇或者自己控制
????????this.changeDatabaseKey(group, sqlCommandType, keys -> chooseKey(keys, invocation));
????}
}

可以開啟主從策略,當(dāng)然也是可以開啟健康檢查!具體配置:

mybatis-mate:
??sharding:
????health: true # 健康檢測
????primary: mysql # 默認(rèn)選擇數(shù)據(jù)源
????datasource:
??????mysql: # 數(shù)據(jù)庫組
????????-?key: node1
??????????...
????????-?key: node2
??????????cluster: slave # 從庫讀寫分離時(shí)候負(fù)責(zé) sql 查詢操作,主庫 master 默認(rèn)可以不寫
??????????...
??????postgres:
????????-?key: node1 # 數(shù)據(jù)節(jié)點(diǎn)
??????????...

2.7 分布式事務(wù)日志打印

部分配置如下:

/**
?*


?* 性能分析攔截器,用于輸出每條 SQL 語句及其執(zhí)行時(shí)間
?*


?*/

@Slf4j
@Component
@Intercepts({@Signature(type?= StatementHandler.class, method =?"query", args = {Statement.class, ResultHandler.class}),
????????@Signature(type?= StatementHandler.class, method =?"update", args = {Statement.class}),
????????@Signature(type?= StatementHandler.class, method =?"batch", args = {Statement.class})})
public?class?PerformanceInterceptor?implements?Interceptor {
????/**
?????* SQL 執(zhí)行最大時(shí)長,超過自動(dòng)停止運(yùn)行,有助于發(fā)現(xiàn)問題。
?????*/

????private?long maxTime =?0;
????/**
?????* SQL 是否格式化
?????*/

????private?boolean?format =?false;
????/**
?????* 是否寫入日志文件

?????* true 寫入日志文件,不阻斷程序執(zhí)行!

?????* 超過設(shè)定的最大執(zhí)行時(shí)長異常提示!
?????*/

????private?boolean?writeInLog =?false;

????@Override
????public?Object?intercept(Invocation invocation) throws Throwable {
????????Statement statement;
????????Object?firstArg = invocation.getArgs()[0];
????????if?(Proxy.isProxyClass(firstArg.getClass())) {
????????????statement = (Statement) SystemMetaObject.forObject(firstArg).getValue("h.statement");
????????}?else?{
????????????statement = (Statement) firstArg;
????????}
????????MetaObject stmtMetaObj = SystemMetaObject.forObject(statement);
????????try?{
????????????statement = (Statement) stmtMetaObj.getValue("stmt.statement");
????????}?catch?(Exception e) {
????????????// do nothing
????????}
????????if?(stmtMetaObj.hasGetter("delegate")) {//Hikari
????????????try?{
????????????????statement = (Statement) stmtMetaObj.getValue("delegate");
????????????}?catch?(Exception e) {

????????????}
????????}

????????String?originalSql =?null;
????????if?(originalSql ==?null) {
????????????originalSql = statement.toString();
????????}
????????originalSql = originalSql.replaceAll("[\\s]+",?" ");
????????int index = indexOfSqlStart(originalSql);
????????if?(index >?0) {
????????????originalSql = originalSql.substring(index);
????????}

????????// 計(jì)算執(zhí)行 SQL 耗時(shí)
????????long start = SystemClock.now();
????????Object?result = invocation.proceed();
????????long timing = SystemClock.now() - start;

????????// 格式化 SQL 打印執(zhí)行結(jié)果
????????Object?target = PluginUtils.realTarget(invocation.getTarget());
????????MetaObject metaObject = SystemMetaObject.forObject(target);
????????MappedStatement ms = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
????????StringBuilder formatSql =?new?StringBuilder();
????????formatSql.append(" Time:").append(timing);
????????formatSql.append(" ms - ID:").append(ms.getId());
????????formatSql.append("\n Execute SQL:").append(sqlFormat(originalSql, format)).append("\n");
????????if?(this.isWriteInLog()) {
????????????if?(this.getMaxTime() >=?1?&& timing >?this.getMaxTime()) {
????????????????log.error(formatSql.toString());
????????????}?else?{
????????????????log.debug(formatSql.toString());
????????????}
????????}?else?{
????????????System.err.println(formatSql);
????????????if?(this.getMaxTime() >=?1?&& timing >?this.getMaxTime()) {
????????????????throw?new?RuntimeException(" The SQL execution time is too large, please optimize ! ");
????????????}
????????}
????????return?result;
????}

????@Override
????public?Object?plugin(Object?target) {
????????if?(target?instanceof?StatementHandler) {
????????????return?Plugin.wrap(target,?this);
????????}
????????return?target;
????}

????@Override
????public?void?setProperties(Properties prop) {
????????String?maxTime = prop.getProperty("maxTime");
????????String?format = prop.getProperty("format");
????????if?(StringUtils.isNotEmpty(maxTime)) {
????????????this.maxTime = Long.parseLong(maxTime);
????????}
????????if?(StringUtils.isNotEmpty(format)) {
????????????this.format =?Boolean.valueOf(format);
????????}
????}

????public?long getMaxTime() {
????????return?maxTime;
????}

????public?PerformanceInterceptor setMaxTime(long maxTime) {
????????this.maxTime = maxTime;
????????return?this;
????}

????public?boolean?isFormat() {
????????return?format;
????}

????public?PerformanceInterceptor setFormat(boolean?format) {
????????this.format = format;
????????return?this;
????}

????public?boolean?isWriteInLog() {
????????return?writeInLog;
????}

????public?PerformanceInterceptor setWriteInLog(boolean?writeInLog) {
????????this.writeInLog = writeInLog;
????????return?this;
????}

????public?Method getMethodRegular(Class clazz,?String?methodName) {
????????if?(Object.class.equals(clazz)) {
????????????return?null;
????????}
????????for?(Method method : clazz.getDeclaredMethods()) {
????????????if?(method.getName().equals(methodName)) {
????????????????return?method;
????????????}
????????}
????????return?getMethodRegular(clazz.getSuperclass(), methodName);
????}

????/**
?????* 獲取sql語句開頭部分
?????*
?????* @param sql
?????* @return
?????*/

????private?int indexOfSqlStart(String?sql) {
????????String?upperCaseSql = sql.toUpperCase();
????????Set?set?=?new?HashSet<>();
????????set.add(upperCaseSql.indexOf("SELECT "));
????????set.add(upperCaseSql.indexOf("UPDATE "));
????????set.add(upperCaseSql.indexOf("INSERT "));
????????set.add(upperCaseSql.indexOf("DELETE "));
????????set.remove(-1);
????????if?(CollectionUtils.isEmpty(set)) {
????????????return?-1;
????????}
????????List list =?new?ArrayList<>(set);
????????Collections.sort(list, Integer::compareTo);
????????return?list.get(0);
????}

????private?final?static?SqlFormatter sqlFormatter =?new?SqlFormatter();

????/**
?????* 格式sql
?????*
?????* @param boundSql
?????* @param format
?????* @return
?????*/

????public?static?String?sqlFormat(String?boundSql,?boolean?format) {
????????if?(format) {
????????????try?{
????????????????return?sqlFormatter.format(boundSql);
????????????}?catch?(Exception ignored) {
????????????}
????????}
????????return?boundSql;
????}
}

使用:

@RestController
@AllArgsConstructor
public class TestController {
????private?BuyService?buyService;

????// 數(shù)據(jù)庫 test 表 t_order 在事務(wù)一致情況無法插入數(shù)據(jù),能夠插入說明多數(shù)據(jù)源事務(wù)無效
????// 測試訪問 http://localhost:8080/test
????// 制造事務(wù)回滾 http://localhost:8080/test?error=true 也可通過修改表結(jié)構(gòu)制造錯(cuò)誤
????// 注釋 ShardingConfig 注入 dataSourceProvider 可測試事務(wù)無效情況
????@GetMapping("/test")
????public?String?test(Boolean error) {
????????return?buyService.buy(null != error && error);
????}
}

2.8 數(shù)據(jù)權(quán)限

mapper 層添加注解:

// 測試 test 類型數(shù)據(jù)權(quán)限范圍,混合分頁模式
@DataScope(type =?"test", value = {
????????// 關(guān)聯(lián)表 user 別名 u 指定部門字段權(quán)限
????????@DataColumn(alias =?"u", name =?"department_id"),
????????// 關(guān)聯(lián)表 user 別名 u 指定手機(jī)號(hào)字段(自己判斷處理)
????????@DataColumn(alias =?"u", name =?"mobile")
})
@Select("select u.* from user u")
List selectTestList(IPage page, Long id,?@Param("name") String username);

模擬業(yè)務(wù)處理邏輯:

@Bean
public?IDataScopeProvider dataScopeProvider() {
????return?new?AbstractDataScopeProvider() {
????????@Override
????????protected?void?setWhere(PlainSelect plainSelect,?Object[] args, DataScopeProperty dataScopeProperty) {
????????????// args 中包含 mapper 方法的請求參數(shù),需要使用可以自行獲取
????????????/*
????????????????// 測試數(shù)據(jù)權(quán)限,最終執(zhí)行 SQL 語句
????????????????SELECT u.* FROM user u WHERE (u.department_id IN ('1', '2', '3', '5'))
????????????????AND u.mobile LIKE '%1533%'
?????????????*/

????????????if?("test".equals(dataScopeProperty.getType())) {
????????????????// 業(yè)務(wù) test 類型
????????????????List dataColumns = dataScopeProperty.getColumns();
????????????????for?(DataColumnProperty dataColumn : dataColumns) {
????????????????????if?("department_id".equals(dataColumn.getName())) {
????????????????????????// 追加部門字段 IN 條件,也可以是 SQL 語句
????????????????????????Set<String> deptIds =?new?HashSet<>();
????????????????????????deptIds.add("1");
????????????????????????deptIds.add("2");
????????????????????????deptIds.add("3");
????????????????????????deptIds.add("5");
????????????????????????ItemsList itemsList =?new?ExpressionList(deptIds.stream().map(StringValue::new).collect(Collectors.toList()));
????????????????????????InExpression inExpression =?new?InExpression(new?Column(dataColumn.getAliasDotName()), itemsList);
????????????????????????if?(null?== plainSelect.getWhere()) {
????????????????????????????// 不存在 where 條件
????????????????????????????plainSelect.setWhere(new?Parenthesis(inExpression));
????????????????????????}?else?{
????????????????????????????// 存在 where 條件 and 處理
????????????????????????????plainSelect.setWhere(new?AndExpression(plainSelect.getWhere(), inExpression));
????????????????????????}
????????????????????}?else?if?("mobile".equals(dataColumn.getName())) {
????????????????????????// 支持一個(gè)自定義條件
????????????????????????LikeExpression likeExpression =?new?LikeExpression();
????????????????????????likeExpression.setLeftExpression(new?Column(dataColumn.getAliasDotName()));
????????????????????????likeExpression.setRightExpression(new?StringValue("%1533%"));
????????????????????????plainSelect.setWhere(new?AndExpression(plainSelect.getWhere(), likeExpression));
????????????????????}
????????????????}
????????????}
????????}
????};
}

最終執(zhí)行 SQL 輸出:

SELECT?u.*?FROM?user?u?
??WHERE?(u.department_id?IN?('1',?'2',?'3',?'5'))?
??AND?u.mobile?LIKE?'%1533%'?LIMIT?1,?10

目前僅有付費(fèi)版本,了解更多 mybatis-mate 使用示例詳見:

https://gitee.com/baomidou/mybatis-mate-examples



如有文章對你有幫助,

在看”和轉(zhuǎn)發(fā)是對我最大的支持!

一款牛逼的Java面試題庫,點(diǎn)擊下圖查看詳細(xì)內(nèi)容


瀏覽 34
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評論
圖片
表情
推薦
點(diǎn)贊
評論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 欧美性国产| yjizz国产| 俺去也| 国产一区二区视频在线观看| 精品蜜桃秘一区二区三区在线播放 | 午夜激情视频在线观看| 少妇搡BBBB搡BBB搡造水多 | 中文无码播放| 3d啪啪动漫| 操B视频在线免费观看| 操逼视频网| 一级大片| 特级婬片AAAAAAA级| 无码9999| 亚洲欧洲精品成人久久曰影片| 天天搞天天曰在线观看| 高清国产AV| 久久成人小电影| 亚洲视频无码在线| 国产一区二区波多野结衣| 亚洲成人网站视频| 国产一级内射| 一级黄色电影在线观看| 欧美在线视频播放| 在线播放国产精品| 国产成人三级片在线观看| 草比网| 亚洲黄色电影网站| 嫩小槡BBBB槡BBBB槡漫画| 九九热re99re6在线精品| 黄色亚洲网站| 超碰在线观看免费版| 国产欧美一区二区三区国产幕精品 | 亚洲福利在线免费观看| 人人妻日日摸狠狠躁| 久久精品大屁股| 国产亚洲视频在线观看| 国产成人AV在线播放| 91av久久| 欧美精品乱码99久久蜜桃| 亚洲AV永久无码国产精品久久| VA电影| 中文字幕婷婷| 国产一级婬片A片| 香蕉三级片| 91av久久| 永久久久久久久| 青娱乐国产av| 亚洲伦理一区二区| 色色色成人视频| 另类AV| 天天看天天射| 国产三级电影在线观看| 久久久噜噜噜| 亚洲人天堂| 自拍超碰在线| 夜夜爽7777精品国产三级| 星空AV| 欧美精品在线免费| 精品91美女| 爽好紧别夹喷水欧美| 中文字幕乱| 91在线看片| 麻豆911| 蜜臀久久99精品久久久久酒店更新时间 | 国产九九在线视频| 日韩无码免费电影| 岛国电影av| 蜜臀久久99久久久久久宅男 | 日韩逼逼| 日韩香蕉网| 中国老少配BBwBBwBBW| 久久a久久| 国产av探花| 最近日韩中文字幕中文翻译歌词| 日本免费爱爱视频| 日韩性爱网| 亚洲AV无码成人精品区欧洲| 三级亚洲| 日韩有码电影| 狼人香蕉网| www九九九| AV黄色在线| 自拍偷拍激情视频| 久草网视频| 91密臀| 操逼免费观看视频| 亚洲欧美另类图片| 人人操人人透| 亚洲欧美日韩性爱| 亚州精品国产精品乱码不99勇敢| 法国《少女日记》电影| 在线看片a| 婷婷五月天久久| 亚洲天堂无码视频| 九色PORNY自拍视频| 亚洲国产精品久久人人爱| 亚洲中文字幕高清| 欧美黄色三级片| 国产精品93333333| 欧美日韩在线电影| 能看的av| 久久999| 成人看片| 91免费高清视频| 高清无码中文字幕在线观看| 日本免费不卡| 亚洲视频a| 99xav| 亚洲无码一二区| 中文字幕一区二区二三区四区| 在线观看黄色网| 婷婷射图| 欧美中文字幕在线播放| 色呦呦在线| 无套免费视频欧美| 男女拍拍免费视频| 日本中文字幕在线播放| 爆乳尤物一区二区三区| 亚洲视频久久| 中文无码日本一级A片久久影视| 极品少妇AV| 国产色情视频| 91人妻人人爽| 欧美精品秘一区二区三区蜜臀| 色噜噜av| 神马午夜福利视频| 亚洲综合自拍| 爱爱网址| 色999网址| 天天噜噜色| 午夜操一操一级| 国产无遮挡又黄又爽在线观看| 久久a久久| 成人国产精品秘欧美高清| zzjicom| 免费看片av| 操穴网| 亚洲男同tv| 久久99精品国产.久久久久久| 91西安站街老熟女露脸| www.久久久| 九九热re99re6在线精品| 欧美18禁网站| 欧美成人一级A片| 俺来也俺也去| 操逼A片| 國產美女AV操逼網站| 国产精品怡红院有限公司| 天天插天天爽| 成人免费视频一区| 超碰1999| 口工视频| 欧美激情无码一区二区三区张丽 | 日本欧美一级| 麻豆视频国产| 国产无码激情| 91久久久久| 日韩本色一区| 日本三级久久| 伊人网导航| 亚洲精品影视| 中文字幕35页| 男人天堂视频网| 五月丁香成人网| 一级成人片| 色婷婷av| 淫色网址| 天天日天天操天天爽| 人人超碰在线| 精品人妻二区三区蜜桃| 亚洲国产免费| 在线一级片| 亚洲无码高清在线| AAA级片| 九热视频| 人人操人人干人人看| 69婷婷国产精品| 天天插夜夜操| 日韩91视频| 欧美一二三区黄色免费视屏| 黄色片视频日本| 天天射天天日天天干| 澳门午夜| 无码不卡在线| 午夜成人黄片| 欧美色色色| 人妻人人干| 在线观看中文字幕一区| 免费69视频看片| 亚洲三级黄色视频| 中文字幕亚洲在线观看| 久久国产V一级毛多内射| 91人妻一区二区| 熟女影音先锋| 欧一美一婬一伦一区二区三区黑人-亚 | 亚洲综合91| 丁香五月在线观看| 成人A片在线播放| av一卡二卡| h片在线免费观看视频| 黄片网站在线看| 99久久婷婷国产综合精品草原| 日韩福利| 天天干天天色天天射| 欧美一级黃色A片免费看蜜桃熟了| 在线亚洲色图| 国产黄色精品视频| 国产www| 99精品视频北条麻妃国产版| 日本草逼网| 久久无码一区二区| 亚洲免费成人网站| 国产熟女乱伦| 精品一区二区三区四区学生| 亚洲AV无码久久寂寞少妇多毛| 在线观看网址你懂的| 国产毛片一区二区三区| 一区二区免费视频| 六月婷婷七月丁香| 老师搡BBBB搡BBB| 天天做夜夜操| 亚洲在线免费视频| 插吧插吧综合网| 日韩不卡一区二区三区| 在线观看免费国产| 91乱子伦国产乱子伦!| 国精品无码人妻一区二区三区免费 | 久久精品一区二区三区蜜芽的特点 | 亚洲性爱AV网站| 制服丝袜一区| 翔田千里无码播放| 欧美群交在线| 亚洲无码一级电影| 人人天天久久| 精品久久电影| 日逼一级片| 青青啪啪啪| 另类老妇极品BBWBBw| 久久538| 一级片在线观看视频| 久久久18禁一区二区三区精品 | 久久538| 国产高清无码视频在线观看| 中文字幕88页| 大地av| 日本黄色一级| 麻豆天美蜜桃91| 加勒比综合无码| A级免费毛片| 香蕉婷婷| 国产一级影院| 成人丁香五月| 色欲一区| 兔子先生和優奈玩游戲脫衣服,運氣報表優奈輸到脫精光 | 亚洲福利视频网| 亚洲性爱工厂| 黄A在线| 亚洲国产爱| 91视频在线观看免费| 好爽~要尿了~要喷了~同桌| 乱伦视频91| 国产乱国产乱300精品| 国产欧美一区二区三区视频| 六月综合网| 国产精品成人影视| 91成人做爰A片| 操穴网| 在线视频日本| 一区二区三区国产| 免费看污网站| 成人黄色免费观看| 中文无码在线观看| 婷婷五月色播| 天天插天天狠天天透| 一区二区三区国产| 国产欧美日韩综合在线视频| 色综合天天综合网国产成人网| h片在线播放| 国产无遮挡又黄又爽又色视频软件| 免费的av网站| 午夜无码视频| 韩国无码中文| 亚洲精品久久久久久久久豆丁网| 黄色视频在线观看免费| 99久久久精品久久久久久| 黄片网页| 在线无码| 婷婷精品免费| 成人乱无码AV在线观看| 国际精品久久久| 日产精品久久久一区二区| 日本一级黃色大片看免费| 国产精品AV网站| 国产av资源网| 国产AA| 日韩一级网| 亚洲精品中文字幕在线观看| 黄色视频在线观看免费| 黑人毛片91久久久久久| 超碰在线大香蕉| 国产欧美日韩成人| 爱逼综合| 大鸡巴导航| 最近中文字幕av| 日韩国产一区二区| 中文字幕永久在线5| AV无码一区二区三区| 精品1234| 一级无码在线| 欧美XXX视频| 久久黄色视频| 国产伊人网| 成人国产综合| 久操电影网| 久久精品亚洲无码| 成人免费黄| 亚洲男人的天堂AV| 日韩精品无码一区二区| 国产精品宾馆| 内射无码专区久久亚洲| 自拍偷拍一区二区三区| 人人操比| 日韩精品一区二区三区四区蜜桃视频| 黄色视频毛片一一| 91视频久久| 思思热免费视频| 超碰三级| 日韩中文无码一级A片| 国产视频第一页| 免费一级片| 国产精品宾馆在线| 天天天天天天干| 蜜桃久久久亚洲| 偷拍视频网站| 国精产品九九国精产品| AV中文字幕网| 一级a片在线免费观看| 特级西西444www大精品| 一本大道香蕉av久久精东影业| 色情网站在线| 成人精品无码| 亚洲另类图片小说| 久久人妻中文字幕| 久久国产热| 成人性爱视频在线观看| 国产3p绿帽骚妻视频| 豆花视频logo进入官网| 97人妻人人操| 日本成人三级片| 99re热在线视频| 9l视频自拍蝌蚪9l成人蝌蚪| 中国免费看片| 日本老熟妇| 男女操逼视频网站免费观看| 尤物91| 日皮做爱视频网站| 中文字幕在线观看二区| 天堂无码视频| 大学生一级特黄大片| AV解说| 亚洲色鬼| 亚洲AAA| 囯产精品久久久| 青青草原av| 一区二区三区四区五区| 亚洲久久久| 青草无码| 中文字幕一区二区无码成人| 久久婷婷婬片A片AAA| 亚洲AV无码乱码精品| 午夜福利视频3000| 亚洲成人无码在线观看| 操操片| 亚洲欧美色图| 777777国产7777777| 午夜操p| 精品人妻二区三区蜜桃| 日本一级片在线播放| 这里只有精品在线观看| 久热9191| AV在线资源网| 亚洲色成人中文字幕在线| 做爱无码| 久久久久成人视频| 亚洲免费高清视频| 日韩毛片大全| 高清无码在线看| 黄色在线视频观看| 亚洲综合伊人| 日韩91在线| 亚洲AV三级片| 日韩美女操逼| 久久国产一级片| www.亚洲成人| 日本国产黄色| 在线观看中文字幕av| 激情久久av| 麻豆传媒视频观看| 亚洲色图自拍| 操碰在线| 国产主播中文字幕| 中文字幕东京热加勒比| 欧美在线成人视频| 色五月婷婷视频| 日韩国产中文字幕| 日韩在线99| 亚洲最大成人网站| 成人毛片在线视频| 日本成人中文字幕在线观看| 日日夜夜AV| 中字幕视频在线永久在线观看免费| 97超碰人妻| 91社区成人影院| 综合+夜夜| 西西人体44www大胆无码| 亚洲婷婷丁香| 中文字幕在线观看高清| 日韩字幕无码| 一区二区三区不卡视频| 国产精品久久久久久无码人妻 | 69天堂| 特级艺体西西444WWw| 国产人妻精品一区二区三区不卡| 残忍另类BBWBBWBBW| www.久久精品视频| 黄色一级A片| 五月天AV在线| 男女视频网站在线观看| 婷婷精品国产a久久综合| 亚洲制服中文字幕| 欧美色性乐汇操日本娘们| 亚洲无码一区在线| 无码av无码AV| 91精品国产91久久久久久久久久| 久久久久久久久免费视频| 国产少妇| 中文字幕日本无码| 在线国产黄色| 在线视频日韩| 国产人妖AV| 美女性爱3P视频| 伊人久久爱| 天天视频入口| 大香蕉黄色电影| 亚洲天码中字| 蝌蚪窝在线视频观看| www.俺去也| 高清无码黄| 国产AV无码影院| 玖玖成人| 熟女综合网| 黄色片在线视频| 操逼视频在线免费观看| 青青在线免费视频| 国产精品51麻豆cm传媒| 久久久久大香蕉| 好吊顶亚洲AV大香蕉色色| 99久久99久久99久久久99国产 | 国产精品国产精品国产专区不52 | 久久久久99精品成人片直播| 性色网站| 国产精品主播| 少妇久久久久久久久久| 91熟女丰满原味| 最近中文字幕mv第三季歌词| 屁屁影院CCYYCOM国产| 成人网站在线免费看| 中文字幕操逼| 好逼天天操| 99热国产精品| 在线无码电影| 久久国产香蕉| 蕉久中文字慕| a视频免费在线观看| 婷婷国产成人精品视频| 人妻超碰在线| 亚洲天堂2017| 国产伦精品一区二区三区视频女| 福利大香蕉| 日逼一级片| 国产无码中文| 在线观看中文字幕一区| 爆乳一区二区三区AV| 91欧美视频| 天干天干天夜夜| 亚洲AV综合色区无码国产播放| 中文字幕在线观看日韩| 欧美成年人网站| 97精品人人A片免费看| 亚洲另类视频| 成人精品无码免费视频| 水蜜桃成人网| 岛国A视频| 日韩黄色小说| 亚洲欧美网站| 欧美精品成人网站| 日韩天堂av| 欧美福利| 91蜜桃在线观看| 亚欧黄色| 免费无码视频一区二区| 91探花国产综合在线精品| 尤物在线免费视频| 丁香五月伊人| 伊人免费视频| 内射无码专区久久亚洲| 中文字幕乱伦视频| 一区二区三区精品婷婷| 亚洲无码在线播放| 青娱乐在线视频精品| 久一在线| 欧美午夜精品久久久| 日韩毛片网站| 五月天国产| 俺也要操| 国产精品色婷婷99久久精品| 亭亭五月天| 人人澡人人澡人人| 天天天天日天天干| 五月天在线电影| 国产激情综合五月久久| 91人人妻人人澡人人爽| 人人操国产| 少妇人妻一级A毛片| 狠狠躁夜夜躁人人爽人妻| 久久夜色精品国产欧美乱极品 | 成人黄色一级片| 东京热黄色| aav在线| 午夜三级视频| 丁香婷婷色五月| 怡春院在线| 亚洲天堂视频在线观看免费| 日韩黄色精品| 日本久久精品| 91香蕉视频| 亚洲在线无码视频| 中国一级黄色毛片| 中文字幕无码观看| 亚欧综合在线| 亚洲图片激情乱伦小说| 水果派av解说| 视频二区中文字幕| 国产精品无码在线播放| 国产精品香蕉国产| 操逼无码精品| 操逼精品| 伊人大香蕉久久| 日本内射在线播放| 国产成人久久777777| 国产色婷婷一区二区| 亚洲精品99| 少妇综合网| 99er在线视频| 色噜噜人妻av中文字幕| 老鸭窝成人| 激情麻豆论坛| 人人妻人人澡人人爽人人| AV免费在线播放| 色情一级AA片免费观看| 男人手机天堂| 亚洲香蕉国产| 午夜精品18码视频国产17c| 亚洲WWW| 在线色| 亚洲无码123| 久久免费视频,久久免费视频| 操逼视频试看| 一级做a视频| 亚洲视频在线免费观看| 中文毛片| 精品一级| 亚洲Av无码成人专区擼| 亚洲乱伦网站| av三级网站| 444444在线观看免费高清电视剧木瓜一 | 97AV人妻无码视频二区| 国产我不卡| 91视频电影| 青草视频精品| 韩国无码视频| 超碰乱伦| 日韩在线电影| 熟女18p| 三上悠亚无码破解69XXX| 午夜福利AV在线| 久久久永久免费视频| 蜜乳AV一区二区三区| 日本成人中文字幕在线观看| 大香蕉啪啪| 丰满BBwBBwBBwBBW| 亚洲精品播放| 国产av毛片| 精品丰满人妻一区二区三区免费观 | 欧美一区视频| 国内免费AV| 亚洲欧美成人在线观看| 成人免费三级| 另类老妇极品BBWBBw| 亚洲少妇性爱视频| 3DAV一区二区三区动漫| 最美孕交vivoestv另类| 夜夜撸视频| 日逼视频免费观看| 高清av在线| 日韩精品一区在线观看| 成人av中文字幕| 91在线无码精品秘入口男同| 秋霞一区二区| 黄色日逼网站| 欧美色影院| 台湾无码精品| 日本性欧美| 中文字幕一区二区三区人妻在线视频| 五月丁香欧美性爱| 日日干视频| 亚洲成人免费视频| 人妻人人爱| 男人的天堂视频| 一级A黄色片| 国产欧美日韩| 免费在线观看a片| 中文字幕15页| 欧美日韩成人一区二区三区| 国产精品一区二区在线观看| 一级黄色A片视频| 亚洲一区二区免费视频| 亚洲AV电影在线| 免费的AV网站| 蜜桃成人久久| 中文字幕69| 亚欧在线视频| 91av电影网| 日本午夜三级视频| 麻豆MD传媒MD0071| 亚洲一区二区黄色电影视频网站| 欧美无人区码suv| 日本Sm/调教/捆绑/紧缚| 国产成人在线免费观看| 福利毛片| 日韩高清无码专区| jk在线观看| 福利三区| 国产精品免费一区二区三区都可以 | 国产人国产视频成人免费观看…| 亚洲欧洲有码在线| 胖老板办公室沙发无套爆秘书| 青青操在线视频| 久久高清免费视频| 一区二区三区无码视频| 制服.丝袜.亚洲.中文豆花| 97精品国产| 亚洲天堂免费视频| 综合+夜夜| 精品福利在线观看| 日韩一区二区三区四区| 色天堂影院| 黄色成人18| 奇米影视亚洲春色| 亚洲第一网站| 男女拍拍| 亚洲无码影院| 亚洲天堂无码| 底流量AV电影在线| 午夜无码鲁丝午夜免费| 午夜成人福利视频在线观看| 天堂麻豆天美| 精品国产乱码久久久久夜深人妻| 三级黄色免费| 国产一级二级三级视频| 亚洲成人福利电影| 日日碰狠狠躁久久躁婷婷| 熟妇高潮一区二区高潮| 色婷婷Av一区| 中文字幕在线无码观看| 粉嫩99国产精品久久久久久人妻| 成人性爱视频免费在线观看| 一级片免费观看视频| 大香蕉久久精品| 一边做一边说国语对白| 成人午夜啪免费视频在线观看软件| 久久久久a| 精东av| 艹逼在线观看| 狠狠干天天日| 色综合国产| 免费看成人A片无码照片88hⅤ| 亚洲国产精品成人久久蜜臀| 久久久成人免费电影| 天天爽天天射| 高清无码视频在线免费观看| 操逼一区二区| 婷婷五月天中文字幕| 88AV在线| 熟妇人妻中文字幕无码老熟妇| 一级a片免费看| 人妻一区二区三区| 神马Aⅴ| 亚洲精品成人片在线观看精品字幕| 日韩中文字幕无码人妻| 欧美日韩一区二区三区视频| 99r6热只有精品免费观看| 无码AV电影在线观看| 2024国产精品| 波多野结衣一二三区| 中文字幕在线电影| 骚五月| 九哥草逼网| 99久久婷婷国产综合精品电影 | 97色色婷婷| 久久久久久综合| 2025av天堂| 97人人爱| 亚洲人妻AV| 精品成人| 欧美操女人| 无码视频免费播放| 少妇搡BBBB搡BBB搡18禁| 91大奶熟女| 亚洲AV黄片| 国产无遮挡又黄又爽| 91久久婷婷国产| 四虎性爱| 欧美精品久久久久久久多人混战| 色眯眯久久爱| 成人黄色性视频| 色九九视频| 嫩BBB槡BBBB槡BBBB免费视频| 中文字幕高清无码在线| 久久久一| 性无码一区二区三区无码免费| 国产丨熟女丨国产熟女视频| 91精品国产乱码久久久竹菊| 99精品视频在线观看| 久久精彩| 黄色视频在线观看大全| 日韩第五页| 久热精品在线观看视频| 人妻体内射精一区二区三区| 成人特级毛片| 亚洲第一影院| 高清无码学生妹| 亚洲欧美高清视频| 少妇厨房愉情理伦BD在线观| 免费色色| 亚洲乱码在线观看| 综合色网站| 极品人妻疯狂3p超刺激| 深爱婷婷| 操逼逼一区二区三区| 国产ts视频| 国产又爽又黄免费观看| 亚洲日韩欧美成人| 欧美日韩一区二区在线观看| 欧美性猛交XXXX乱大交3| 成人A片视频| 亚洲国产一区二区三区四区| 亚洲无码一区二区三区妃光| 蜜桃人妻无码AV天堂三区| 精品乱子伦一区二区三区在线播放 | 激情六月婷婷| 女人A片一级黄色| 高清无码一区二区在线| 色老板网址| 黄片小视频在线观看| 黄网站免费在线观看| 久草资源在线| 色就是欧美| 久久久久久久AV| 亚洲无码人妻视频| 91丝袜| 操碰视频| 久草视频99| 国产超级无码高清在线视频观看| 学生妹一级片内射视频| 成人四区| 无码人妻av黄色一区二区三区| 亚洲中文字幕av| A片免费的| 中文字幕日本成人| 国产精品视频网站| 亚洲一本| 韩国高清无码60.70.80| 青青草Av| 影音先锋在线视频观看| 国产日韩欧美一区二区| www.久久99| 深爱婷婷网| h成人在线| 少妇bbb搡bbbb搡bbbb| 日韩人妻视频| 欧美精产国品一二三产品动漫| 精品九九九九九九| 女生自慰网站免费| 亚洲精品不卡| 91视频一区二区三区| 三级AV在线免费观看| 成人一级黄色电影| 91精片| 日韩黄色小视频| 欧美综合网| 免费黄色小视频在线观看| 少妇精品久久久久久久久久 | 夜夜躁狠狠躁日日躁av| 欧美成人精品a| 亚洲av无码精品| 亚洲熟妇AV日韩熟妇在线| 日逼欧美| 日韩操b| 亚洲视频456| 亚洲成人av在线播放| 白嫩外女BBwBBwBBw| 操毛| 西西www444无码免费视频| 日本黄A三级三级三级| 久久久夜夜夜| 69av在线播放| 五月婷婷免费视频| 婷婷六月色| 苍井空一区二区三区| 日韩精品无码一区二区| 亚洲无吗在线播放| 精品国内自产拍在线观看视频| 超碰99热| 久青草视频| 影音先锋久久久久AV综合网成人| 内射婷婷| 男女无码| 日日免费视频| 国产三级黄色| 亚洲AV无码乱码精| 色网在线观看| 国产精品黄视频| 一级无码在线观看| 久久悠悠| 欧美www| 四虎在线免费视频| 在线播放一区| 五月丁香在线| 在线看的av| 久久久久9| 日韩A视频| 久色入口| 人人操国产| 69成人精品国产| 国产AV无遮挡| 亚洲第一色| 久草超碰在线| 亚洲成人少妇老妇a视频在线 | 亚洲第一伊人| 伊人影院在线免费观看| 亚洲成人无码网站| 欧美大香蕉网| 黄色18禁| 欧美日韩在线看| 国产免费小视频| 欧美亚洲综合在线观看| 大学生一级特黄大片| 黄页网站免费观看| 怡春院熟女精品AV| 中文字幕超清在线观看| 无码乱伦视频| 国产精品国内自产拍| 亚洲AV成人电影| 免费看一级A片| 男人天堂中文字幕| 一区二区三区四区av| 国产一级AV国产免费| 成人做爰免费网站2023| XXXX国产| 美日韩中文字幕| 欧美操女人| 国产亚洲成人综合| 亚洲无码精品在线| 最新av资源| 蝌蚪久久| 欧美一级在线视频| 亚洲口味重一级黄片| 在线黄色视频网站| 三级片无码视频| 欧美日本色| 青娱乐精品在线| 国产suv精品一区二区6| 欧美熟女一区| 中文字幕欧美视频| 欧美激情视频一区二区三区不卡| 人妻国产| www.99视频| 久久伊人春色| 七十路の高齢熟女千代子下载 | 亚洲欲色| 亚洲av资源| 吴梦梦无码| 一区二区三区无码高清| 免费在线成人网| 婷婷五月天电影网| 人人澡人人添人人爽人人| 婷婷开心色四房播播免费| 日韩成人一级片|