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

Mybatis-Plus官方分庫分表神器,一個依賴輕松搞定!

共 34146字,需瀏覽 69分鐘

 ·

2022-07-06 11:35


點(diǎn)擊上方“Java技術(shù)江湖”,選擇“設(shè)為星標(biāo)

回復(fù)”666“獲取全網(wǎng)最熱的Java核心知識點(diǎn)整理


文章來源:http://suo.nz/18CuNV


目錄
  • 前言

  • 主要功能

  • 使用


前言


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


主要功能


如下:

  • 字典綁定

  • 字段加密

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

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

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

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

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


使用

?

| 依賴導(dǎo)入

Spring Boot 引入自動依賴注解包:

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-mate-starter</artifactId>
  <version>1.0.8</version>
</dependency>

注解(實(shí)體分包使用):
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-mate-annotation</artifactId>
  <version>1.0.8</version>
</dependency>


| 字段數(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<StringString> SEX_MAP = new ConcurrentHashMap<StringString>() {{
        put("0", "女");
        put("1", "男");
    }};

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


| 字段加密

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

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

| 字段脫敏

屬性 @FieldSensitive 注解即可自動按照預(yù)設(shè)策略對源數(shù)據(jù)進(jìn)行脫敏處理,默認(rèn) SensitiveType 內(nèi)置 9 種常用脫敏策略。

例如:中文名、銀行卡賬號、手機(jī)號碼等脫敏策略。也可以自定義策略如下:

@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ù)及控制臺( 普通參數(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
    // 多個敏感詞 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
    @GetMapping("/info")
    public String info(Article article) throws Exception {
        return ParamsConfig.toJson(article);
    }


    // 添加一個敏感詞然后再去觀察是否生效 http://localhost:8080/add
    // 觀察【貓】這個詞被過濾了 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("插入一個敏感詞:" + sensitiveWordsMapper.insert(new SensitiveWords(id, "貓")));
            // 插入一個敏感詞,刷新算法引擎敏感詞
            SensitiveWordsProcessor.reloadSensitiveWords();
        }
        return "ok";
    }

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


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

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

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

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


不僅僅可以固定執(zhí)行,也可以動態(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<IDdl> consumer
{
        // 多數(shù)據(jù)源指定,主庫初始化從庫自動同步
        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<String> getSqlFiles(
{
        return Arrays.asList("db/user-mysql.sql");
    }
}

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

@Sharding 注解使數(shù)據(jù)源不限制隨意使用切換,你可以在 mapper 層添加注解,按需求指哪打哪??!
@Mapper
@Sharding("mysql")
public interface UserMapper extends BaseMapper<User{

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


你也可以自定義策略統(tǒng)一調(diào)兵遣將:
@Component
public class MyShardingStrategy extends RandomShardingStrategy {

    /**
     * 決定切換數(shù)據(jù)源 key {@link ShardingDatasource}
     *
     * @param group 動態(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 # 從庫讀寫分離時候負(fù)責(zé) sql 查詢操作,主庫 master 默認(rèn)可以不寫
          ...
      postgres:
        - key: node1 # 數(shù)據(jù)節(jié)點(diǎn)
          ...


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

部分配置如下:
/**
 * <p>
 * 性能分析攔截器,用于輸出每條 SQL 語句及其執(zhí)行時間
 * </p>
 */

@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í)行最大時長,超過自動停止運(yùn)行,有助于發(fā)現(xiàn)問題。
     */

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

    private boolean format = false;
    /**
     * 是否寫入日志文件<br>
     * true 寫入日志文件,不阻斷程序執(zhí)行!<br>
     * 超過設(shè)定的最大執(zhí)行時長異常提示!
     */

    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 耗時
        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<Integer> 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<Integer> 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)制造錯誤
    // 注釋 ShardingConfig 注入 dataSourceProvider 可測試事務(wù)無效情況
    @GetMapping("/test")
    public String test(Boolean error) {
        return buyService.buy(null != error && error);
    }
}


| 數(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ī)號字段(自己判斷處理)
        @DataColumn(alias = "u", name = "mobile")
})
@Select("select u.* from user u")
List<User> selectTestList(IPage<User> 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<DataColumnProperty> 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())) {
                        // 支持一個自定義條件
                        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 110


了解更多 mybatis-mate 使用示例詳見:
https://gitee.com/baomidou/mybatis-mate-examples

再見 Navicat !這個工具才是YYDS!


oppo后端16連問


求你了,別在高并發(fā)場景中使用悲觀鎖了!


關(guān)注公眾號【Java技術(shù)江湖】后回復(fù)“PDF”即可領(lǐng)取200+頁的《Java工程師面試指南》

強(qiáng)烈推薦,幾乎涵蓋所有Java工程師必知必會的知識點(diǎn),不管是復(fù)習(xí)還是面試,都很實(shí)用。



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

手機(jī)掃一掃分享

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

手機(jī)掃一掃分享

分享
舉報(bào)

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 免费视频在线观看一区| 91视频一区二区| 国产AV一级| 影音先锋成人在线| 亚洲色777| 爱搞搞就要爱搞搞| 奇米色网| 最新三级网站| 亚洲无码在线播放| 美国操逼片| 日本少妇性爱视频| 亚洲成人不卡| 欧美一区二区三区精品| 欧美日韩视频在线| 久久视频一二| 爱爱视频免费网站| a三级片| 青草在线视频| 99在线精品视频观看| 一区二区三区精品视频| 国产成人无码毛片| 亚洲日本中文| 天天射日日干| 色哟哟视频在线观看| 在线观看日韩av| 四虎高清无码| 北条麻妃一区二区三区在线 | 91大神精品| 成人网站中文字幕| 一插菊花综合| 国产女人18毛片水真多18精品| 亚洲三级片免费观看| 天堂а√在线中文在线新版| 在线观看A片| 一本一道无码免费看视频| 熟妇偷拍| 在线aⅴ| 悠悠AV导航| 亚洲性爱在线观看| 天天日天天射天天干| 亚洲视频免费在线播放| 一区二区三区免费播放| 欧美久久久久久久| 国产美女免费视频| 91精品国产综合久久久蜜臀粉嫩 | 美女极度色诱图片www视频| 美日韩一区| 久久你懂的| 国产欧美视频在线| 操逼91小视频| 久草91| 男女内射视频| 波多野吉衣毛片| 各种妇女撒尿mm毛免费网站| 黄色小视频在线免费看| 99久久久精品| 激情五月伊人| 亚洲AV人人夜夜澡人人| 无码国产99精品久久久久网站| 大香蕉88| 欧美韩日| 大香蕉伊人在线手机网| 国产777| 操逼综合| 在线中文字幕视频| 人人操夜夜操| 激情五月天网| 色婷婷色99国产综合精品| 五月丁香999| 国产三级片在线观看视频| 大香蕉性爱网| 99久久久无码国产精品性波多| 免费一级网站| 精品视频免费在线| 北条麻妃九九九在线视频| 男人的天堂视频在线观看| 亚洲国产成人自拍| 九九视屏| 偷拍视频网站北条麻妃| 性感成人在线| 日韩无码网站| 苍井空亚洲精品AA片在线播放| 综合久久久| 国产成人AV在线| 亚洲高清无码专区| 欧美成人a| 无码视频网| 黄色影院在线观看| 三级片无码在线观看| 高清无码做爱视频| 午夜精东影业传媒在线观看| 成人久久久久一级大黄毛片中国| 大香蕉东京热| 婷婷丁香六月天| 青青草原黄色视频| 国产无码AV在线| 免费黄色欧美| 欧美sesese| 亚洲大片免费看| 熟妇槡BBBB槡BBBB图| 激情无码一区二区三区| 精品国产va久久久久久久| 北条麻妃在线一区二区| AV大片在线观看| 国内视频一区| 亚洲综合色网站| 人人看人人澡| 就要干就要操| 亚洲成人精品一区二区| 国产手机精品视频| 日韩香蕉视频| 内射免费网站| 看一级黄色片| 久久免费国产视频| 乱伦内射| 国产成人无码区免费AV片在线| 欧美八区| 久草福利在线视频| 国模在线| 国产成人AⅤ| 色婷婷丁香五月天| 精品视频一区二区三区| 亚洲一级无码| 日本三级片在线动| 久久亚洲Aⅴ成人无码国产丝袜 | 午夜A区| 国产成人无码永久免费| 懂色av,蜜臀AV粉嫩av| 一区二区三区四区久久| 日韩AV无码电影| 在线观看黄色片| 国产乱子伦-区二区三区| 成人无码在线播放| 狠狠干狠狠操| 撸撸操在线视频观看只有精品| 久草在在线视频| AV一二区| 国产精品无码乱伦| 在线成人毛片| 亚洲AA视频| 日韩免费AV电影| 欧美亚洲成人电影| 国产在线1| 人人看人人射| 国产精品久久久久精| 欧美亚洲视频在线观看| 亚洲欧美日本在线| 97超碰人人摸| 性爱视频网页| 亚洲免费成人网| 色婷婷激情视频| 国产免费看片| 日本乱伦中文字幕| 爱草视频| 国产激情在线视频| 吴梦梦md0069| 中文无码99| 国产在线接入| 在线观看一区二区三区四区| 影音先锋成人在线资源| 天天操人人| 欧美日本在线观看| 大鸡吧网站| 天天干天天爽| 成人电影亚洲天堂| 操逼的视频| 青青青草视频在线| 无码人妻精品一区二区蜜桃漫画| 91视频免费| 逼特逼视频在线| 国产黄色视频网站在线观看| 强开小嫩苞一区二区电影| 五月婷婷亚洲| 神马午夜福利视频| 久色性爱视频| 中文字幕高清无码在线播放| 国产日日日| 国产亚洲99久久精品熟女| 麻豆AV在线播放| 日本狠狠操| 日产无码久久久久久| 久久久久大香蕉| 大香蕉伊人在线视频| 国产18欠欠欠一区二区| 五月天视频网| 欧美A级成人婬片免费看| 日韩黄| 毛片在线观看视频| 天天色天天爱| av超碰在线| 久久久久久久久毛片| 青青草婷婷| 国产精品久久久久久无人区| 久久人人操人人| 狠狠躁日日躁夜夜躁2022麻豆| 97中文在线| 成人片网站在线观看| 国产激情一区二区三区| 国产AA片| 中文精品字幕人妻熟女| 欧美天天干| 天天操天天谢| 国产无码操逼视频| 2026国产精品视频| 麻豆视频一区二区| 色77777| 四川少妇搡bbbb搡bbbb| 成人特级毛片| 亚洲成人观看| 不卡视频一区| 就爱搞搞| 青青草原免费在线视频| 日韩在线一级片| 青青操人人操| 国产亚洲精品成人a| 五月丁香六月婷婷综合| 高清视频一区二区| 91内射| 亚洲国产精品18久久久久久| 日本啪啪网站| 大香蕉久久久久久| 亚洲www啪成人一区二区麻豆| 另类老妇性BBBWBBW| 高潮91PORN蝌蚪九色| 国产精彩无码视频| 操逼视频免费播放| 日本高清无码| 97免费在线视频| 欧美老女人操逼视频| 五月中文字幕| 人人操人人摸人人干| 国产内射久久| 午夜人妻AV| 西西午夜视频| 日韩免费在线观看| 国产丝袜久久| 国产搡BBB爽爽爽视频| 国产成人无码一区二区在线播放 | 亚洲精品免费观看| 日本伊人在线综合视频| 日日干网| 99久久精品国产一区二区成人 | 亚洲无码成人片| 欧美日韩成人电影| 日韩精品毛片一区二区视频免费| 另类性爱视频| 国精产品一二四区黑人| 黄片av| 免费高清无码在线| 亚洲欧美影院| 丰满的人妻一区二区三区果冻| Al激情欧美| 人妻丰满精品一区二区| 日本免费高清视频| 青青草手机在线视频| 中文字幕在线有码| 狠狠操AV| 亚洲高清免费| 久久精品人妻| 91新视频| 国产免费一区二区在线A片视频| 九九性视频| jt33免费观看高清| 日韩1区| 黑人无码| 乱伦播放五月天| 中文无码日本一级A片人| 日本www色| 嫖中国站街老熟女HD| 吹潮喷水高潮HD| 国产成人精品视频免费| 玖玖爱资源站| 亚洲中文字幕在线视频播放| 97超碰在| 欧美成人精品无| 欧美国产第一页| 69国产精品| 在线无码视频| 激情五月天开心网| 91人妻人人澡人人爽人人爽| 久久成人电影院| 亚洲三级在线播放| 日韩操比| 十八禁网站在线| 99精品视频国产| 口爆av| 99大香蕉视频| 熟妇熟女一区二区三区| 麻豆mdapp01.tⅴ| 蜜桃视频网站在线观看| 亚洲视频91| 日本黄色视频免费观看| 成人亚洲精品一区二区三区| 一二三区免费视频| 久草成人| 婷婷成人在线| 牛牛影视av老牛影视av| 欧美高清在线综合| 熟女熟妇人妻一区二区三区| 国产一区二区视频在线观看| 精品中文字幕在线播放| 免费日韩无码| 亚洲成人视频网站| 人妻互换一二三区免费| 中文无码在线| 狼人社區91國產精品| 天天干在线观看视频| 少妇中文字幕| 91最新网址| 人人操碰成人网| 在线观看日韩视频| 亚洲v视频| 狼友视频免费观看| 日日日操| 永井玛丽亚av无码中出流出| 77777精品成人免费A片| 午夜在线观看视频18| 欧美爱爱免费看| 日韩不卡在线观看| 久久内射| 中文字幕VA| 河南少妇搡BBBB搡BBBB| 免费观看的av| 草b视频| 四川少妇BBB凸凸凸BBB安慰我| 天天插天天狠| 欧美人人操| 热久久最新地址| 美女久久久| 免费观看久久久| 思思热99| 国产高清毛片| 亚洲欧美日本在线| 亲子伦视频一区二区三区| 91人人干| 精品成人久久| 亚洲激情婷婷| 东北骚妇大战黑人视频| 俺去俺来也www色官网cms| 色狠狠网| 欧美性色网| 天堂无线av无码av| 亚洲无码AV网站| av高清无码| 大香蕉少妇| www香蕉成人片com| 日逼大香蕉| 伊人久久免费视频| 国产精品无码成人AV电影| 亚洲爱爱网| 菊花插综合网| 免费人成网站| caobi999| 欧美日韩黄色片| 色婷婷天天操天天干| 国产A片网站| 伊人大香蕉网| 100国产精品人妻无码| 五月婷婷五月天| 一区二区三区四区在线视频| 国产精品丝袜| 99久久婷婷国产综合精品hsex,亚| 俺也去俺也来| 欧美XXXXBBBB| а√在线中文8| 97日韩天堂| 欧美精品一卡二卡| 一区二区三区免费| 草草视频在线观看| 偷窥美鲍| 亚洲激情内射| 日本操B久久| 日韩亚洲中文字幕| 另类老妇性bbwbbwbbw| 91碰碰| 国产精品色情A级片| 国产丝袜在线视频| 激情av天堂| 操逼福利视频| 三级无码av| 91啦丨露脸丨熟女色啦| 91丨PORNY丨在线中文| 男人天堂手机在线| 日韩不卡免费| 精品国产一区二区三区久久久蜜月 | 亚洲人人妻| 中文在线资源| 狼人色影院| 日韩AV电影网| 丁香五月大香蕉| 俺来也最新网址| 中文字幕黄色电影| 成人综合大香蕉| 五月精品| 一本之道高清数码大全| 欧美成人精品AAA| 黄色一级视频在线观看| 超碰欧美| www.插插| 国产精品一区网站| 欧美成人激情视频| 97香蕉久久夜色精品国产| 91成人福利| 国产一级二级三级久久久| 无码成人片| 欧美熟妇搡BBBB搡BBBBB| 操东北女人| 亚洲欧美日韩高清| 四川搡BBBBB搡BBB| 中文字幕人妻互换av久久| 中文字幕五月天| 五月天无码免费视频| 亚洲秘无码一区二区三区,| 狠狠色噜噜狠狠狠888| 高清无码在线观看18| 日本A一级片| 高清无码视频免费观看| 日韩黄在线| 日韩欧美v| 日韩欧美国产成人| 最近中文字幕免费MV第一季歌词怀孕 | 日韩大片免费观看| 亚洲精品911| 成人免费无码激情AV片| 精品国产91| 久久国产亚洲| 久久久久久久久久久久久自慰小片| 亚洲黄色一区| 精品国产123| 国产成人无码一区二区在线| 五月激情六月婷婷| 美日韩视频欧美一区二区视频| 亚洲免费一级| 精品国产AV色一区二区深夜久久 | 午夜成人福利视频在线观看| 丝袜足交在线| av网站导航| 免费成人黄色| 亚洲另类天堂| 中字av| 久久五月天婷婷| аⅴ资源新版在线天堂| 久色无码| 亚洲精品人伦一区二区| 蜜桃影院| 91蜜桃婷婷狠狠久久综合9色| 大香蕉做爱| 另类综合激情| 少妇大战28厘米黑人| 99er在线观看视频| 中文字幕线观看| 你懂的在线播放| 东方AV在| 香蕉成人视频| 亚州成人| 四川美人搡BBw搡BBw| 久久久中文字幕| 婷婷丁香综合| 大香蕉75在线| 精品黄色毛片| 亚洲AV无码成人精品区欧洲| AV天堂资源| 无码av亚洲一区二区毛片公司| 亚洲成人网在线观看| 啊v视频在线| 久久久久久精品国产三级| 琪琪色在线观看| 亚洲一区二区免费视频| 轻轻操内射无码| 狠狠色丁香| 国产黄片一区二区三区| 日韩人妻精品无码久久边| 四川少扫搡BBBBB搡B| 无码一区二区高清| se99av| 亚洲AV无码成人精品区欧洲| 日韩码波多野结衣| 亚洲日韩国产AV| 大香蕉人人| 亚洲无码AV片| 日韩视频免费在线| 久久精品在线观看| 乱伦无码视频| 亚洲AV无码久久久| www.天天射视频| 一级黄色视频在线观看| 开心激情网五月天| 免费日韩AV| 国产一区二区av| 日韩无码AV一区二区| 黄色小说在线看| 中国老太卖婬HD播放| 免费观看黄色片| 2025国产在线| 亚洲视频网址| 黄色大片在线免费观看| sese在线| 秋霞丝鲁片一区二区三区手机在绒免| 日本50路熟女| 欧美日批| 成人精品一区二区区别解析 | 国产黄色视频免费在线观看| 国语A片| 91精品久久久久久久| 亚洲日韩欧美一区二区| 夜夜撸天天操| 亚洲天堂2014| 操逼视频在线免费观看| 国产精品粉嫩福利在线| 中文字幕+乱码+中文乱码91在线观看 | 91在线视频免费观看| 久久成人国产| 无码人妻精品一区二区蜜桃网站| 日韩欧美综合| AV资源在线播放| 69av在线观看视频| 伊人日逼| 国产性爱精品影片免费看| 亚洲av高清无码| 久久永久免费视频| 亚洲一区视频在线| 操逼逼一区二区三区| 国产久久久久久久| 亚洲国产精品二二三三区| xxxxx无码| 日韩美女毛片| 97超碰在线免费观看| 麻豆国产91在线播放| 黄色一级片在线| 国产成人精品亚洲男人的天堂| 中文字幕三级片| 成人无码三级| 熟女人妻在线观看| 国产无遮挡又黄又爽又色视频软件| 亚洲福利影院| 在线操| 亚洲精品久久久久久久久豆丁网 | 亚洲人成色777777无码| 无码一区二区黑人猛烈视频网站| 亚洲AV无码国产精品二区| 77777色婷婷| 青草无码视频| 人人操超碰在线| 91无码人妻精品一区二区三区四| 91狠狠爱| 成人AV无码| 在线免费观看一区| 91三级在线观看| 久视频在线观看| 国产一级免费在线观看| 在线视频中文字幕| 亚洲精品456| 搡女人视频国产一级午夜片| 国产91白丝在线播放| 最新av网| 国产91人| 大香蕉福利视频| 国产成人AV在线播放| 99热这里只有精| 九九九视频在线观看| 中文字幕免费中文| 中文字幕激情精品| 大香蕉视频网| 日韩成人在线观看视频| 国产美女一级真毛片酒店| 亚洲精品成人网站| 爱搞在线观看wwww| 无码视频在线| 97国产在线视频| 日韩午夜福利| 国产第一精品| 性爱免费视频网站| 大香蕉综合伊人| 91精品老司机| 国产又粗又大又爽91嫩草| www.911国产| 乱伦内射| 香蕉一区二区| 亚洲天堂影音先锋| 欧美老熟妇BBBBB搡BBB| 伊人网在线免费视频| 俺去也| 国产精品久久久久永久免费看| 色婷婷色99国产综合精品| 熟女综合| 欧美一级A片在线观看| 久久久久久久久久久久高清毛片一级| 中国人妻HDbute熟睡| 亚洲欧美大香蕉视频网| 特级WWW444至码| 国内成人精品| 日本综合久久| 高清无码黄| 在线免费观看黄色视频网站| 色中色AV| 男女AV在线免费观看| 精品无码久久| 国产黄色电影| 中文字幕+乱码+中文乱码91| 国产av中文字幕| 亚洲v欧美| 国产成人无码精品久在线观看| AV四虎| 中文激情网| 制服.丝袜.亚洲.中文.豆花| 日本亚洲欧洲免费| 中出欧美亚洲| 午夜操| 91在线无码| 亚洲免费在线视频观看| 人人妻人人妻| 在线观看成年人视频| 中文子幕免费毛片| 中文字幕在线一区二区a| 精品丰满人妻一区二区三区免费观| 欧一美一婬一伦一区二区三区自慰国 | 亚洲无码在线视频播放| 国产一片黑夜内射| 91无码人妻一区二区成人aⅴ| h视频在线观看网站| 三级黄,色| 理论毛片| 日韩视频成人| 国产乱码| 亚洲AⅤ欧美AⅤ| 欧美日韩狠狠操在线观看视频| 国产一级a毛一级a爰片| 四川少妇搡BBBB搡BBB视频网| 亚洲精品一区二三区不卡| 国产AV不卡| 欧美三级大片| 熟妇人妻丰满久久久久久久无码 | 免费视频一区二区| 欧美国产精品| 激情五月天网站| 国产黄色片在线观看| 国产精品AV在线| 高清AV无码| 亚洲高清无码中文字幕| 91在线无精精品秘白丝| 亚洲欧洲成人| 亚洲精品色| 中文字幕一区在线| 亚洲人成色777777无码| 黑人猛躁白人BBBBBBBBB| 2021国产视频| 亚洲无码视频看看| 国产香蕉在线视频| 99热免费精品| 国产免费福利| 老师搡BBBB搡BBB| 麻豆精品无码| 一个人看的www日本高清视频| 黄色一级片免费| 国产91久久婷婷一区二区| 国产一级生活片| 亚洲婷婷在线视频| 丰满熟妇高潮呻吟无码| 啪啪免费| 国产综合久久久777777色胡同| 天天操人人操| 色色免费| 亚洲无码三级视频| 国产黄片一区二区三区| 美女A级毛片| 想要xx视频| 激情五月婷婷综合| 99久久伊人| 中文无码在线观看中文字幕av中文 | 四川BBBB擦BBBB| 欧美精品99| 亚洲一区二区无码| 亚洲资源在线| 亚洲色图欧美| 青青草原av| 中文字幕永久在线| 婷婷丁香五月激情一区综合网| 韩国高清无码60.70.80 | 午夜福利日本| 91视频入口| 亚洲熟妇在线观看一区二区| 操逼免费视频网站| 久久九九电影| 欧美熟女在线| 自拍偷拍| 偷拍亚洲天堂| 色射网| 久久亭亭| 中文在线永久免费观看| 成人乱无码AV在线观看| 亚洲精品一区二三区不卡| 欧美一级婬片免费视频黄| 午夜福利院| 亚洲av电影在线观看| 国产a区| i美女福利视频| 手机看片福利一区二区| 黄色免费在线观看网站| 欧美自拍一区| 欧美日韩视频免费观看| 足交在线播放| 影音先锋AV资源在线| 亚洲白浆| 亚洲男人的天堂视频网在线观看+720P| 中文字幕精品在线视频| 日韩不卡在线观看| 成人做爰100片免费观看视频| 国产伊人久久| H无码| 国产成人无码A片免费看| 亚洲精品视频在线| 木下凛凛子AV888AV在线观看 | 国产精品女人777777| 中文字幕+乱码+中文乱码视频在线观看| 国产白丝精品91爽爽久久| 噜噜噜在线视频| 国产不卡在线观看| 夜夜撸网站| 亚洲AV无码成人精品国产五月天| 四虎成人网站| 国产乱子伦真实精品| 精品久久久久久久| 四虎激情影院| 亚洲一级无码视频| 精品视频免费在线| 亚洲男人的天堂av| 天天视频国产| 视色影院| 神马久久午夜| 一级免费视频| 日韩一级| 久久艹艹| A∨无码| 日韩一区二区三区无码电影| 久久久久久久久久久国产| 欧美a片在线观看| 日本熟妇一区二区三区| 北条麻妃二区| 亚洲va在线va天堂va偷拍| 欧美黄色激情视频网站| 久久网一区| 免费在线观看黄色网址| 最近日本中文字幕中文翻译歌词| 日韩AV无码专区亚洲AV| 亚洲中文字幕一| 久久久噜噜噜久久中文字幕色伊伊 | 丝袜美腿亚洲综合| 乱子伦国产精品| 免费视频一区二区| 这里视频很精彩免费观看电视剧最新 | 看一级黄色毛片| 黄色a片在线观看| 亚洲AV毛片成人精品网站| 韩国一区二区三区| 欧美黄色成人网站| A黄色片| 人妻在线观看| 九九九成人视频| 欧美日韩三级在线| 欧洲三级网观看| 99在线看| 精品乱子伦一区二区三区免费播放 | 天天操超碰| 久久狼人| 亚洲图片欧美另类| 老熟女乱伦| 你懂的在线视频| 超碰自拍99| 丁香五月综合啪啪| 骚逼黄片| 亚洲精品成人7777777| 9I成人免费版| 日本三级片免费观看| 深爱开心激情| 国产一区二三区| 久久一| 岛国精品在线播放| 亚洲第一成人网站| 三级高清无码视频| 操婷婷逼| 国产精品久久久久精| 人人澡人人干| 国产精品久久久久久久久免费无码| 中文字幕日韩无码片| 中文无码AV在线| 日韩一区二区三| 国产91精品看黄网站在线观看| 久久久久久亚洲| 久久久少妇| 亚洲AV毛片成人精品网站| 日韩无码视频网| 日产毛片| 日韩欧美在线观看视频| 国产精品国内自产| 91一二区| 99这里有精品| 毛片在线视频| 四虎色情| 国产天堂在线观看| 天堂AV在线免费观看| 亚洲视频天堂| 国产精品无毛五区六区| 在线不卡无码| 日本电影一区二区三区| 大香蕉看片| 亚洲视频区| 无码精品人妻一区二区欧美| 天天日天天干美女| 日本熟妇高潮BBwBBwBBw| 亚洲人妻在线视频| 午夜福利手机在线| 特黄色A级片视频| 奇米影视77777| 狠狠躁日日躁夜夜躁A片无码| 嫩BBB嗓BBBB榛BBBB| 亚洲成人黄色在线| 一级特黄妇女高潮AA片免费播放| 一级欧美视频| 国产又粗又大又爽91嫩草| 大香蕉尹人在线视频| 影音先锋久久久| 亚洲视频免费完整版在线播放 | 怡红院麻豆| 蜜桃成人无码区免费视频网站| 3344gc在线观看入口| 国产又爽又黄免费视频网站| 五月天四房播播| 91香蕉网| 国产色情视频| 中文字幕浅井香舞被黑人俘虏| 成年人免费公开视频| 无码无码无码| 无码人妻av黄色一区二区三区| 91双飞会所双飞在线| 亚洲高清无码中字| A视频免费观看| 天堂中文在线资源| 手机看片福利视频| 天天草天天撸| h片在线观看免费| 日本性爱中文字幕| AV资源在线免费观看| 嫩BBB槡BBBB槡BBBB视频-百度| 苍井空无码| 中国毛片网站| 二区三区免费| 91人妻无码成人精品一区二区| 日韩无任何视频在线观看| 国产秘精品区二区三区日本| 无码视频韩国| 影音先锋一区二区三区| 老女人操屄| 日韩中文字幕在线免费观看| 国产在线小电影| 99re2| 一区二区成人视频| 亚洲高清无码中文字幕| 中文爱爱视频| av乱伦小说| 亚洲无码一本道| 99唉撸吧视频免费| 欧美AAA大片| a4yy午夜福利| 五月天综合网| 国产精品成| 午夜久久久| 天天操天天操| 中文字幕+乱码+中文乱码91在线观看| 国产情侣在线视频| 欧美99| 51妺妺嘿嘿午夜成人| 亚洲成人AV在线播放| 丁香六月婷婷| 欧美AⅤ视频| 91久久香蕉囯产熟女线看蜜桃| 麻豆精东一区二区欧美国产| 精品免费在线| 欧美三级电影在线观看| 国产中文字幕AV在线播放| 欧美天天撸| 人人澡人人干| 婷婷激情五月综合| 久久久精品网站| 波多野结衣AV在线播放| 亚洲高清视频无码| 青青草原黄色视频| 操b视频网站| 成年人黄色视频免费观看| 欧美性BBB槡BBB槡BBB| 口爆在线| 日本黄色片在线播放| 亚洲一区在线免费观看| 撸一撸成人在线做爱视频。| 一区二区三区无码精品| 一区在线观看视频| 国产精品毛片A√一区| 安徽妇搡BBBB搡BBBB按摩| 亚洲成人无码电影| 七区九区一区在线| 一级黄色录像带|