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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

使用Mybatis自定义插件实现不侵入业务的公共参数自动追加

發(fā)布時間:2023/12/29 windows 45 coder
生活随笔 收集整理的這篇文章主要介紹了 使用Mybatis自定义插件实现不侵入业务的公共参数自动追加 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

背景

后臺業(yè)務(wù)開發(fā)的過程中,往往會遇到這種場景:需要記錄每條記錄產(chǎn)生時間、修改時間、修改人及添加人,在查詢時查詢出來。
以往的做法通常是手動在每個業(yè)務(wù)邏輯里耦合上這么一塊代碼,也有更優(yōu)雅一點的做法是寫一個攔截器,然后在Mybatis攔截器中為實體對象中的公共參數(shù)進行賦值,但最終依然需要在業(yè)務(wù)SQL上手動添加上這幾個參數(shù),很多開源后臺項目都有類似做法。

這種做法往往不夠靈活,新增或修改字段時每處業(yè)務(wù)邏輯都需要同步修改,業(yè)務(wù)量大的話這么改非常麻煩。

最近在我自己的項目中寫了一個Mybatis插件,這個插件能夠?qū)崿F(xiàn)不修改任何業(yè)務(wù)邏輯就能實現(xiàn)添加或修改時數(shù)據(jù)庫公共字段的賦值,并能在查詢時自動查詢出來。

實現(xiàn)原理

Mybatis提供了一系列的攔截器,用于實現(xiàn)在Mybatis執(zhí)行的各個階段允許插入或修改自定義邏輯。

Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)

我這里用的是Executor,它能做到在所有數(shù)據(jù)庫操作前后執(zhí)行一些邏輯,甚至可以修改Mybatis的上下文參數(shù)后繼續(xù)執(zhí)行。
在Mybaits的攔截器中,可以拿到MappedStatement對象,這里面包含了一次數(shù)據(jù)庫操作的原始SQL以及實體對象與結(jié)果集的映射關(guān)系,為了實現(xiàn)公共參數(shù)自動攜帶,我們就需要在攔截器中修改原始SQL:

  1. Insert操作:自動為Insert語句添加公共字段并賦值
  2. Update操作:自動為Update語句添加公共字段并賦值
  3. Select操作:自動為Select語句的查詢參數(shù)上添加上公共字段

以及修改實體對象與結(jié)果集的映射關(guān)系,做到自動修改查詢語句添加公共字段后能夠使Mybatis將查出的公共字段值賦給實體類。

簡單來說就是修改MappedStatement中的SqlSource以及ResultMap

修改SqlSource

在SqlSource中,包含了原始待執(zhí)行的SQL,需要將它修改為攜帶公共參數(shù)的SQL。
需要注意的是Mybatis的SqlSource、ResultMap中的屬性僅允許初次構(gòu)造SqlSource對象時進行賦值,后續(xù)如果需要修改只能通過反射或者新構(gòu)造一個對象替換舊對象的方式進行內(nèi)部參數(shù)修改。

直接貼出來代碼,這里新構(gòu)造了SqlSource對象,在里面實現(xiàn)了原始SQL的解析修改:
SQL的動態(tài)修改使用了JSQLParser將原始SQL解析為AST抽象語法樹后做參數(shù)追加,之后重新解析為SQL,使用自定義SqlSource返回修改后的SQL實現(xiàn)SQL修改

static class ModifiedSqlSourceV2 implements SqlSource {
        private final MappedStatement mappedStatement;
        private final Configuration configuration;

        public ModifiedSqlSourceV2(MappedStatement mappedStatement, Configuration configuration) {
            this.mappedStatement = mappedStatement;
            this.configuration = configuration;
        }

        @Override
        public BoundSql getBoundSql(Object parameterObject) {
            // 獲取原始的 BoundSql 對象
            BoundSql originalBoundSql = mappedStatement.getSqlSource().getBoundSql(parameterObject);

            // 獲取原始的 SQL 字符串
            String originalSql = originalBoundSql.getSql();
            log.debug("公共參數(shù)添加 - 修改前SQL:{}", originalSql);

            // 創(chuàng)建新的 BoundSql 對象
            String modifiedSql;
            try {
                modifiedSql = buildSql(originalSql);
                log.debug("公共參數(shù)添加 - 修改后SQL:{}", modifiedSql);
            } catch (JSQLParserException e) {
                log.error("JSQLParser解析修改SQL添加公共參數(shù)失敗, 繼續(xù)使用原始SQL執(zhí)行" , e);
                modifiedSql = originalSql;
            }
            BoundSql modifiedBoundSql = new BoundSql(configuration, modifiedSql,
                    originalBoundSql.getParameterMappings(), parameterObject);
            // 復(fù)制其他屬性
            originalBoundSql.getAdditionalParameters().forEach(modifiedBoundSql::setAdditionalParameter);
            modifiedBoundSql.setAdditionalParameter("_parameter", parameterObject);

            return modifiedBoundSql;
        }

        private String buildSql(String originalSql) throws JSQLParserException {
            Statement statement = CCJSqlParserUtil.parse(originalSql);

            switch(mappedStatement.getSqlCommandType()) {
                case INSERT -> {
                    if(statement instanceof Insert insert) {
                        insert.addColumns(new Column(CREATE_BY_COLUMN), new Column(CREATE_TIME_COLUMN));
                        ExpressionList expressionList = insert.getItemsList(ExpressionList.class);
                        Timestamp currentTimeStamp = new Timestamp(System.currentTimeMillis());

                        if (!expressionList.getExpressions().isEmpty()) {
                            // 多行插入 行構(gòu)造器解析
                            if (expressionList.getExpressions().get(0) instanceof RowConstructor) {
                                expressionList.getExpressions().forEach((expression -> {
                                    if (expression instanceof RowConstructor rowConstructor) {
                                        rowConstructor.getExprList().getExpressions().add(new StringValue(getCurrentUser()));
                                        rowConstructor.getExprList().getExpressions().add(new TimestampValue().withValue(currentTimeStamp));
                                    }
                                }));
                            } else {
                                // 其余默認單行插入
                                expressionList.addExpressions(new StringValue(getCurrentUser()), new TimestampValue().withValue(currentTimeStamp));
                            }
                        }

                        return insert.toString();
                    }
                }
                case UPDATE -> {
                    if(statement instanceof Update update) {
                        List<UpdateSet> updateSetList = update.getUpdateSets();
                        UpdateSet updateBy = new UpdateSet(new Column(UPDATE_BY_COLUMN), new StringValue(getCurrentUser()));
                        Timestamp currentTimeStamp = new Timestamp(System.currentTimeMillis());
                        UpdateSet updateTime = new UpdateSet(new Column(UPDATE_TIME_COLUMN), new TimestampValue().withValue(currentTimeStamp));
                        updateSetList.add(updateBy);
                        updateSetList.add(updateTime);

                        return update.toString();
                    }
                }
                case SELECT -> {
                    if(statement instanceof Select select) {
                        SelectBody selectBody = select.getSelectBody();
                        if(selectBody instanceof PlainSelect plainSelect) {
                            TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
                            List<String> tableNames = tablesNamesFinder.getTableList(select);

                            List<SelectItem> selectItems = plainSelect.getSelectItems();
                            tableNames.forEach((tableName) -> {
                                String lowerCaseTableName = tableName.toLowerCase();
                                selectItems.add(new SelectExpressionItem().withExpression(new Column(new Table(tableName), CREATE_BY_COLUMN)).withAlias(new Alias(lowerCaseTableName + "_" + CREATE_BY_COLUMN)));
                                selectItems.add(new SelectExpressionItem().withExpression(new Column(new Table(tableName), CREATE_TIME_COLUMN)).withAlias(new Alias(lowerCaseTableName + "_" + CREATE_TIME_COLUMN)));
                                selectItems.add(new SelectExpressionItem().withExpression(new Column(new Table(tableName), UPDATE_BY_COLUMN)).withAlias(new Alias(lowerCaseTableName + "_" + UPDATE_BY_COLUMN)));
                                selectItems.add(new SelectExpressionItem().withExpression(new Column(new Table(tableName), UPDATE_TIME_COLUMN)).withAlias(new Alias(lowerCaseTableName + "_" + UPDATE_TIME_COLUMN)));
                            });

                            return select.toString();
                        }
                    }
                }
                default -> {
                    return originalSql;
                }
            }
            return originalSql;
        }
}

修改ResultMap

ResultMap中存放了結(jié)果列與映射實體類屬性的對應(yīng)關(guān)系,這里為了自動生成公共屬性的結(jié)果映射,直接根據(jù)當前ResultMap中存儲的結(jié)果映射實體類的名稱作為表名,自動建立與結(jié)果列的映射關(guān)系。

就是說數(shù)據(jù)庫表對應(yīng)的實體類的名字需要與數(shù)據(jù)庫表保持一致(但是實體類名可以是數(shù)據(jù)庫表的名字的駝峰命名,如表user_role的實體類需要命名為UserRole),只要遵守這個命名規(guī)則即可實現(xiàn)查詢結(jié)果中自動攜帶公共參數(shù)值
如下為添加公共參數(shù)結(jié)果映射的代碼

private static List<ResultMapping> addResultMappingProperty(Configuration configuration, List<ResultMapping> resultMappingList, Class<?> mappedType) {
        // resultMappingList為不可修改對象
        List<ResultMapping> modifiableResultMappingList = new ArrayList<>(resultMappingList);

        String []checkList = {CREATE_BY_PROPERTY, CREATE_TIME_PROPERTY, UPDATE_BY_PROPERTY, UPDATE_TIME_PROPERTY};
        boolean hasAnyTargetProperty = Arrays.stream(checkList).anyMatch((property) -> ReflectionUtils.findField(mappedType, property) != null);

        // 用于防止映射目標為基本類型卻被添加映射 導(dǎo)致列名規(guī)則 表名_列名 無法與映射的列名的添加規(guī)則 映射類型名_列名 相照應(yīng)
        // 從而導(dǎo)致映射類型為基本類型時會生成出類似與string_column1的映射名 而產(chǎn)生找不到映射列名與實際結(jié)果列相照應(yīng)的列名導(dǎo)致mybatis產(chǎn)生錯誤
        // 規(guī)則: 僅映射類型中包含如上四個字段其一時才會添加映射
        if(hasAnyTargetProperty) {
            // 支持類型使用駝峰命名
            String currentTable = upperCamelToLowerUnderscore(mappedType.getSimpleName());

            // 映射方式 表名_公共字段名 在實體中 表名與實體名相同 則可完成映射
            modifiableResultMappingList.add(new ResultMapping.Builder(configuration, CREATE_BY_PROPERTY, currentTable + "_" + CREATE_BY_COLUMN, String.class).build());
            modifiableResultMappingList.add(new ResultMapping.Builder(configuration, CREATE_TIME_PROPERTY, currentTable + "_" + CREATE_TIME_COLUMN, Timestamp.class).build());
            modifiableResultMappingList.add(new ResultMapping.Builder(configuration, UPDATE_BY_PROPERTY, currentTable + "_" + UPDATE_BY_COLUMN, String.class).build());
            modifiableResultMappingList.add(new ResultMapping.Builder(configuration, UPDATE_TIME_PROPERTY, currentTable + "_" + UPDATE_TIME_COLUMN, Timestamp.class).build());
        }

        return modifiableResultMappingList;
}

構(gòu)建MappedStatement

原本的由Mybatis創(chuàng)建的MappedStatement無法直接修改,因此這里手動通過ResultMap.Builder()構(gòu)造一個新的MappedStatement,同時保持其余參數(shù)不變,只替換SqlSource、ResultMap為先前重新創(chuàng)建的對象。

public MappedStatement buildMappedStatement(Configuration newModifiedConfiguration, MappedStatement mappedStatement) {
        SqlSource modifiedSqlSource = new ModifiedSqlSourceV2(mappedStatement, newModifiedConfiguration);

        List<ResultMap> modifiedResultMaps = mappedStatement.getResultMaps().stream().map((resultMap) -> {
            List<ResultMapping> resultMappingList = resultMap.getResultMappings();
            // 為每個resultMap中的resultMappingList添加公共參數(shù)映射
            List<ResultMapping> modifiedResultMappingList = addResultMappingProperty(newModifiedConfiguration, resultMappingList, resultMap.getType());

            return new ResultMap.Builder(newModifiedConfiguration, resultMap.getId(), resultMap.getType(), modifiedResultMappingList, resultMap.getAutoMapping()).build();
        }).toList();

        // 構(gòu)造新MappedStatement 替換SqlSource、ResultMap、Configuration
        MappedStatement.Builder newMappedStatementBuilder = new MappedStatement.Builder(newModifiedConfiguration, mappedStatement.getId(), modifiedSqlSource, mappedStatement.getSqlCommandType())
                .cache(mappedStatement.getCache()).databaseId(mappedStatement.getDatabaseId()).dirtySelect(mappedStatement.isDirtySelect()).fetchSize(mappedStatement.getFetchSize())
                .flushCacheRequired(mappedStatement.isFlushCacheRequired())
                .keyGenerator(mappedStatement.getKeyGenerator())
                .lang(mappedStatement.getLang()).parameterMap(mappedStatement.getParameterMap()).resource(mappedStatement.getResource()).resultMaps(modifiedResultMaps)
                .resultOrdered(mappedStatement.isResultOrdered())
                .resultSetType(mappedStatement.getResultSetType()).statementType(mappedStatement.getStatementType()).timeout(mappedStatement.getTimeout()).useCache(mappedStatement.isUseCache());
        if(mappedStatement.getKeyColumns() != null) {
            newMappedStatementBuilder.keyColumn(StringUtils.collectionToDelimitedString(Arrays.asList(mappedStatement.getKeyColumns()), ","));
        }
        if(mappedStatement.getKeyProperties() != null) {
            newMappedStatementBuilder.keyProperty(StringUtils.collectionToDelimitedString(Arrays.asList(mappedStatement.getKeyProperties()), ","));
        }
        if(mappedStatement.getResultSets() != null) {
            newMappedStatementBuilder.resultSets(StringUtils.collectionToDelimitedString(Arrays.asList(mappedStatement.getResultSets()), ","));
        }
        return newMappedStatementBuilder.build();
}

到這里為止,已經(jīng)完全實現(xiàn)了修改原始SQL、修改結(jié)果映射的工作了,將修改后的MappedStatement對象往下傳入到invoke()即可但是還能改進。

改進

在Mybatis攔截器中可以通過MappedStatement.getConfiguration()拿到整個Mybatis的上下文,在這個里面可以拿到所有Mybatis的所有SQL操作的映射結(jié)果以及SQL,可以一次性修改完后,將Configuration作為一個緩存使用,每次有請求進入攔截器后就從Configuration獲取被修改的MappedStatement后直接invoke,效率會提升不少。
經(jīng)給改進后,除了應(yīng)用啟動后執(zhí)行的第一個SQL請求由于需要構(gòu)建Configuration會慢一些,之后的請求幾乎沒有產(chǎn)生性能方面的影響。

現(xiàn)在唯一的性能消耗是每次執(zhí)行請求前Mybatis會調(diào)用我們自己重新定義的SqlSource.getBoundSql()將原始SQL解析為AST后重新構(gòu)建生成新SQL的過程了,這點開銷幾乎可忽略不計。如果想更進一步的優(yōu)化,可以考慮將原始SQL做key,使用Caffeine、Guava緩存工具等方式將重新構(gòu)建后的查詢SQL緩存起來(Update/Insert由于追加有時間參數(shù)的原因,不能被緩存),避免多次重復(fù)構(gòu)建SQL帶來的開銷

完整實現(xiàn)

經(jīng)過優(yōu)化后,整個插件已經(jīng)比較完善了,能夠滿足日常使用,無論是單表查詢,還是多表聯(lián)查,嵌套查詢都能夠?qū)崿F(xiàn)無侵入的參數(shù)追加,目前僅實現(xiàn)了創(chuàng)建人、創(chuàng)建時間、修改人、修改時間的參數(shù)追加&映射綁定,如有需要的可以自行修改。

我把它放到了GitHub上,并附帶有示例項目:https://github.com/Random-pro/ExtParamInterctptor
覺得好用的歡迎點點Star

使用的人多的話,后續(xù)會將追加哪些參數(shù)做成動態(tài)可配置的,等你們反饋

插件使用示例

所有的新增操作均會被自動添加創(chuàng)建人、創(chuàng)建時間。更新操作則會被自動添加更新人、更新時間。正常使用Mybatis操作即可,與原先無任何差別就不在這里給出示例了,如果需要示例請前往我在GitHub上的示例項目。

  1. 單表查詢

    // 實體類Child(類名對應(yīng)具體的表名 使用駝峰命名法,如表名為user_role,則類名應(yīng)寫為UserRole)
    @Data
    public class Child extends BaseDomain {
      private int childId;
      private int parentId;
      private String childName;
      private String path;
    }
    
    // 公共字段
    @Data
    public class BaseDomain {
      private String createBy;
      private Date createTime;
      private String updateBy;
      private Date updateTime;
    }
    
    // Mapper接口
    @Mapper
    public interface TestMapper {
      @Select("SELECT id as childId, name as childName, parent_id as parentId, path FROM child")
      List<Child> getChildList();
    }
    
    // Controller
    @RestController
    @RequestMapping("user")
    public record UserController(TestMapper testMapper) {
      @GetMapping("getChildList")
      public List<Child> getChildList() {
        return testMapper.getChildList();
      }
    }
    

    訪問user/getChildList獲取結(jié)果:

    [
        {
            "createBy": "sun11",
            "createTime": "2023-12-18T07:58:58.000+00:00",
            "updateBy": "random",
            "updateTime": "2023-12-18T07:59:19.000+00:00",
            "childId": 1,
            "parentId": 1,
            "childName": "childName1_1",
            "path": "childPath1_1"
        },
        {
            "createBy": "sun12",
            "createTime": "2023-12-18T07:58:59.000+00:00",
            "updateBy": "RANDOM",
            "updateTime": "2023-12-18T07:59:20.000+00:00",
            "childId": 2,
            "parentId": 1,
            "childName": "childName1_2",
            "path": "childPath1_2"
        },
        {
            "createBy": "sun21",
            "createTime": "2023-12-18T07:59:00.000+00:00",
            "updateBy": "randompro",
            "updateTime": "2023-12-18T07:59:21.000+00:00",
            "childId": 3,
            "parentId": 2,
            "childName": "childName2_1",
            "path": "childPath2_2"
        }
    ]
    
  2. 多表查詢

    // 實體類Base(類名對應(yīng)具體的表名 使用駝峰命名法,如表名為user_role,則類名應(yīng)寫為UserRole) 注意:當關(guān)聯(lián)多個表時,需要取哪個表里的公共字段(創(chuàng)建人、創(chuàng)建時間等字段)則將映射實體類名命名為該表的表名
    @Data
    public class Base extends BaseDomain {
      private int id;
      private String baseName;
      private String basePath;
      private List<Child> pathChildList;
    }
    
    @Data
    public class Child extends BaseDomain {
      private int childId;
      private int parentId;
      private String childName;
      private String path;
    }
    
    // 公共字段
    @Data
    public class BaseDomain {
      private String createBy;
      private Date createTime;
      private String updateBy;
      private Date updateTime;
    }
    
    // Mapper接口
    @Mapper
    public interface TestMapper {
      @Select("SELECT BASE.ID as id , BASE.BASE_NAME as baseName, CHILD.PATH as basePath FROM BASE, CHILD WHERE BASE.ID = CHILD.PARENT_ID")
      List<Base> getBaseAndChildPath();
    }
    
    // Controller
    @RestController
    @RequestMapping("user")
    public record UserController(TestMapper testMapper) {
      @GetMapping("getBaseAndChildPath")
      public List<Base> getBaseAndChildPath() {
        return testMapper.getBaseAndChildPath();
      }
    }
    

    訪問user/getBaseAndChildPath獲取結(jié)果:

    [
        {
            "createBy": "sun_base",
            "createTime": "2023-12-18T07:59:29.000+00:00",
            "updateBy": "random_base",
            "updateTime": "2023-12-18T08:00:09.000+00:00",
            "id": 1,
            "baseName": "baseName1",
            "basePath": "childPath1_1",
            "pathChildList": null
        },
        {
            "createBy": "sun_base",
            "createTime": "2023-12-18T07:59:29.000+00:00",
            "updateBy": "random_base",
            "updateTime": "2023-12-18T08:00:09.000+00:00",
            "id": 1,
            "baseName": "baseName1",
            "basePath": "childPath1_2",
            "pathChildList": null
        },
        {
            "createBy": "sun2_base",
            "createTime": "2023-12-18T07:59:30.000+00:00",
            "updateBy": "randompro_base",
            "updateTime": "2023-12-18T08:00:09.000+00:00",
            "id": 2,
            "baseName": "baseName2",
            "basePath": "childPath2_2",
            "pathChildList": null
        }
    ]
    
  3. 多表嵌套查詢

    // 實體類Base(類名對應(yīng)具體的表名 使用駝峰命名法,如表名為user_role,則類名應(yīng)寫為UserRole) 嵌套查詢中使用到的多個實體若均可映射到對應(yīng)表中的如上四個字段的值(只要該實體通過繼承、直接添加的方式獲取到了以上聲明的四個實體屬性的getter/setter方法即可)
    @Data
    public class Base extends BaseDomain {
      private int id;
      private String baseName;
      private String basePath;
      private List<Child> pathChildList;
    }
    
    @Data
    public class Child extends BaseDomain {
      private int childId;
      private int parentId;
      private String childName;
      private String path;
    }
    
    // 公共字段
    @Data
    public class BaseDomain {
      private String createBy;
      private Date createTime;
      private String updateBy;
      private Date updateTime;
    }
    
    // Mapper接口
    @Mapper
    public interface TestMapper {
      List<Base> getPathList();
    }
    
    // Controller
    @RestController
    @RequestMapping("user")
    public record UserController(TestMapper testMapper) {
      @GetMapping("getPathList")
      public List<Base> getPathList() {
        return testMapper.getPathList();
      }
    }
    

    Mapper.xml:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.live.mapper.TestMapper">
    
        <resultMap type="com.live.domian.Base" id="PathDomainMap">
            <result property="id"    column="id"    />
            <result property="baseName" column="base_name"/>
            <result property="basePath" column="base_path"/>
    
            <collection property="pathChildList" ofType="com.live.domian.Child">
                <id property="childId" column="child_id"/>
                <result property="parentId" column="parent_id"/>
                <result property="childName" column="child_name"/>
                <result property="path" column="path"/>
            </collection>
        </resultMap>
    
        <select id="getPathList" resultMap="PathDomainMap">
            SELECT base.id, base.base_name, base.base_path, child.id AS child_id, child.name AS child_name,
                  child.path, child.parent_id FROM base LEFT JOIN child ON base.id = child.parent_id
        </select>
    </mapper>
    

    訪問user/getPathList獲取結(jié)果,可見嵌套查詢中每個層次都取到了公共字段createBy、createTime、updateBy、updateTime的值:

    [
        {
            "createBy": "sun_base",
            "createTime": "2023-12-18T07:59:29.000+00:00",
            "updateBy": "random_base",
            "updateTime": "2023-12-18T08:00:09.000+00:00",
            "id": 1,
            "baseName": "baseName1",
            "basePath": "basePath1",
            "pathChildList": [
                {
                    "createBy": "sun12",
                    "createTime": "2023-12-18T07:58:59.000+00:00",
                    "updateBy": "RANDOM",
                    "updateTime": "2023-12-18T07:59:20.000+00:00",
                    "childId": 2,
                    "parentId": 1,
                    "childName": "childName1_2",
                    "path": "childPath1_2"
                },
                {
                    "createBy": "sun11",
                    "createTime": "2023-12-18T07:58:58.000+00:00",
                    "updateBy": "random",
                    "updateTime": "2023-12-18T07:59:19.000+00:00",
                    "childId": 1,
                    "parentId": 1,
                    "childName": "childName1_1",
                    "path": "childPath1_1"
                }
            ]
        },
        {
            "createBy": "sun2_base",
            "createTime": "2023-12-18T07:59:30.000+00:00",
            "updateBy": "randompro_base",
            "updateTime": "2023-12-18T08:00:09.000+00:00",
            "id": 2,
            "baseName": "baseName2",
            "basePath": "basePath2",
            "pathChildList": [
                {
                    "createBy": "sun21",
                    "createTime": "2023-12-18T07:59:00.000+00:00",
                    "updateBy": "randompro",
                    "updateTime": "2023-12-18T07:59:21.000+00:00",
                    "childId": 3,
                    "parentId": 2,
                    "childName": "childName2_1",
                    "path": "childPath2_2"
                }
            ]
        }
    ]
    

    嵌套查詢中,如果只希望獲取到特定的表的那四個公共屬性,則把不希望獲取公共屬性的表對應(yīng)的實體類中的四個映射屬性去掉(若使用BaseDomain繼承來的四個屬性的的話去掉繼承BaseDomain)即可

總結(jié)

以上是生活随笔為你收集整理的使用Mybatis自定义插件实现不侵入业务的公共参数自动追加的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

亚洲免费黄色 | 色偷偷av男人天堂 | 色综合天天色 | 在线观看日韩免费视频 | 久久黄色影院 | 一区二区电影网 | 99re亚洲国产精品 | 日韩大片在线免费观看 | 激情综合站 | 亚洲永久国产精品 | 一区二区不卡视频在线观看 | av资源免费观看 | 人人草在线视频 | 在线精品视频免费观看 | 99精品视频免费观看 | 久久精品99国产精品日本 | 9999在线观看 | av不卡在线看 | 色88久久 | 国产精品国产三级国产aⅴ无密码 | 福利一区二区三区四区 | 国产中文字幕视频在线观看 | 97综合在线 | 黄污网站在线观看 | 免费精品视频 | 超碰资源在线 | 亚洲,国产成人av | 人人干人人搞 | 国产高清精 | 亚洲欧美国产精品久久久久 | 日韩在线免费播放 | 人交video另类hd | 97免费在线观看视频 | 一级黄色片在线 | 97品白浆高清久久久久久 | 一区二区中文字幕在线 | 免费 在线 中文 日本 | 国产免费观看久久 | 国产精品 中文在线 | 亚洲成年人免费网站 | 精品久久久成人 | 福利视频午夜 | 久久99精品热在线观看 | 韩日电影在线观看 | 国产日产在线观看 | 亚洲精品在 | www黄色软件 | 91av片| 欧美小视频在线观看 | 91在线蜜桃臀 | 五月激情久久 | 欧美日韩1区2区 | 免费成人av | av电影一区 | 一区二区三区精品在线视频 | 午夜.dj高清免费观看视频 | 欧美日韩精品久久久 | 午夜影院在线观看18 | 久久五月婷婷综合 | av在线影视| 狠狠色丁香婷婷综合基地 | 最新av免费在线观看 | 6080yy午夜一二三区久久 | 欧美日韩中文字幕视频 | 国产又粗又猛又爽又黄的视频免费 | www.五月天婷婷 | 精品中文字幕在线 | 亚洲一区动漫 | 91久久爱热色涩涩 | 中文字幕精品一区二区三区电影 | 国产精品 久久 | 日韩精品欧美精品 | 欧美一级片免费播放 | 成人97视频一区二区 | 午夜精品久久 | 九九免费在线观看 | 国产最顶级的黄色片在线免费观看 | 精品国产欧美一区二区 | 色婷婷亚洲| 一区二区三区免费在线 | 黄色免费观看网址 | 911在线| 在线观看视频99 | 亚洲欧美一区二区三区孕妇写真 | www.色国产 | zzijzzij亚洲日本少妇熟睡 | 九九热只有这里有精品 | 精品久久精品 | 国产999精品久久久久久 | 成人网在线免费视频 | 五月婷婷香蕉 | 国内精品久久久久久久久久久久 | 欧美日本在线视频 | 国产精品 日韩精品 | 中文字幕亚洲欧美日韩 | 91久久久久久国产精品 | 国产在线观看高清视频 | 精品毛片一区二区免费看 | 日韩精品一区二区三区视频播放 | 国产在线1区 | 国产成人精品av在线 | 中文字幕一区二区三区在线播放 | 日本美女xx| 婷婷丁香激情网 | 最近免费观看的电影完整版 | 精品国产亚洲一区二区麻豆 | 欧美一区二区三区免费观看 | 韩国精品福利一区二区三区 | 免费精品人在线二线三线 | 日韩综合一区二区三区 | 在线视频婷婷 | 久久久久五月 | 黄色成人影视 | 日韩精品极品视频 | 国产va饥渴难耐女保洁员在线观看 | 五月天久久久久久 | 超碰免费在线公开 | 国内丰满少妇猛烈精品播放 | 91免费黄视频 | 美女视频永久黄网站免费观看国产 | 99国产视频在线 | 免费看av片网站 | 成年人免费观看国产 | 欧美日韩性 | 亚洲欧洲精品一区二区精品久久久 | 午夜久久久久久久久久久 | 伊人资源视频在线 | 欧美天天综合网 | 中文字幕在线观看第三页 | 公与妇乱理三级xxx 在线观看视频在线观看 | 国产黄色大片 | 在线观看韩日电影免费 | 欧美精品在线免费 | 国产黄a三级 | 久久激情小视频 | 一二区电影 | 97视频在线观看网址 | 亚洲一区美女视频在线观看免费 | 特级毛片网 | 日韩欧美精品免费 | 五月婷婷综合在线视频 | 91成人亚洲| www.久久色 | 久久久免费精品视频 | 亚洲综合精品在线 | 日韩视频免费观看高清完整版在线 | 久久激情五月丁香伊人 | 91黄色小网站 | 最近日本mv字幕免费观看 | 超碰99人人| 亚洲专区视频在线观看 | 久久久99精品免费观看app | 成人四虎影院 | 在线免费观看视频一区二区三区 | 久久久久观看 | 亚洲综合色视频 | 日韩欧美中文 | 亚洲天天做 | 天天综合天天做天天综合 | 久久久久国产精品免费免费搜索 | 色五月成人 | av亚洲产国偷v产偷v自拍小说 | 国产精品一区二区在线观看免费 | 国产精品美女免费看 | 欧美精品国产综合久久 | 久久精品牌麻豆国产大山 | 尤物一区二区三区 | 欧美日韩啪啪 | 在线国产一区 | 在线影院中文字幕 | 久久99日韩 | 国产成人中文字幕 | 伊人天天色 | 色婷婷成人网 | 91视频久久久久久 | 色综合久久久久综合体桃花网 | 午夜久久久精品 | 日韩免费三级 | 色免费在线| a级免费观看| 人人爽人人爽人人爽 | 国产一区二区三区四区大秀 | 91精品999 | 日韩精品一区二区在线观看视频 | 狠狠狠色狠狠色综合 | 国产精品一区二区在线免费观看 | 激情五月婷婷网 | 久久99精品国产91久久来源 | 91在线视频在线 | 亚洲 中文 在线 精品 | 午夜久久久久久久久久久 | 久久久久亚洲精品男人的天堂 | 中文在线亚洲 | 国内久久精品视频 | 久久人人爽人人片av | 日韩精品中字 | 99精品视频免费看 | 国产黄a三级 | 久久久受www免费人成 | 操少妇视频 | 色多多在线观看 | 正在播放国产一区 | 最近av在线 | 色先锋av资源中文字幕 | av女优中文字幕在线观看 | 五月天激情开心 | 四虎海外影库www4hu | 天天干天天碰 | 视频国产在线观看18 | 中文字幕在线一区二区三区 | 亚洲国产综合在线 | 国产色在线,com | 91在线中文 | 天天操天天能 | www.国产高清 | 国产精品99久久久久久武松影视 | 免费视频18| 欧美另类成人 | 99爱在线 | 国产一区麻豆 | 亚洲激情久久 | 久草精品视频在线观看 | 国内精品免费久久影院 | 成人在线观看av | 国产美女视频一区 | 开心色停停 | 五月开心六月伊人色婷婷 | av一区二区在线观看中文字幕 | 国产精品久久久久久久久久久久久久 | 天天射天天干 | 国产伦理一区二区三区 | 欧美性另类 | 国产中文字幕在线免费观看 | 五月婷婷另类国产 | 波多野结衣一区二区 | 99精品国自产在线 | 久久在线观看 | 天天色天天爱天天射综合 | 国产一区免费在线观看 | 91精品视屏 | 24小时日本在线www免费的 | 午夜av在线免费 | 在线观看黄色免费视频 | 91精品国产91p65 | 免费男女羞羞的视频网站中文字幕 | 久久视频这里有精品 | 欧美日韩伦理在线 | 天天操夜夜想 | 国产精品淫片 | 免费高清无人区完整版 | 久青草影院 | 在线精品视频在线观看高清 | 国产成人av福利 | 久久免费久久 | av成人动漫在线观看 | 综合网成人 | 日韩偷拍精品 | 国产美女无遮挡永久免费 | 国产福利精品视频 | 亚洲三级网站 | 久久久久久久久久久久国产精品 | 日日夜夜免费精品 | 婷婷激情综合 | 91 在线视频 | 一本一道久久a久久综合蜜桃 | 日韩精品在线免费观看 | 五月婷婷久草 | 成人作爱视频 | 夜夜澡人模人人添人人看 | 激情综合网五月 | 91精选在线 | 久久99中文字幕 | 天天射天天色天天干 | 国产日产av | 亚洲无吗视频在线 | 二区三区av | 欧洲精品一区二区 | 99久久综合国产精品二区 | 亚洲视频大全 | 黄色免费av | 久久男人影院 | 最近高清中文在线字幕在线观看 | 操久 | 在线观看中文字幕dvd播放 | 日韩午夜网站 | 国产精品久久久久久久午夜片 | 九九热精品视频在线播放 | 97夜夜澡人人双人人人喊 | 中文字幕一区二区在线观看 | 久久电影国产免费久久电影 | 狠狠色狠狠色合久久伊人 | 久久社区视频 | 在线观看欧美成人 | 久久精品久久99 | 天天操网站 | 在线观看亚洲免费视频 | 国产成人久久精品一区二区三区 | 人人干人人模 | www成人av | 亚洲人成人在线 | 国产中文在线视频 | 99九九视频 | 成人黄色影片在线 | 精品亚洲免费 | 精品国产乱码久久久久久三级人 | 激情五月婷婷 | 欧美色噜噜噜 | 国产黄色在线看 | 97在线观看视频 | 日韩精品一二三 | 黄色成人在线网站 | 国产一区二区三区高清播放 | 精品免费久久 | 91九色在线观看视频 | 欧美日韩国产一区二 | 狠色狠色综合久久 | 一级黄视频 | 婷婷久月| 成人国产精品一区二区 | 天天操人 | 人人超在线公开视频 | 最新中文在线视频 | 亚洲精品乱码久久久久久久久久 | 免费看色网站 | 99精品视频免费看 | 三级黄色三级 | 色婷婷久久久综合中文字幕 | 亚洲午夜久久久影院 | 欧美精品久久久久久久久免 | 人人爽人人爽人人片 | 亚洲综合网站在线观看 | 91精品国产高清自在线观看 | 欧美国产91 | 99高清视频有精品视频 | 日韩精品久久中文字幕 | 欧美在线free | 狠狠干激情 | 久久情侣偷拍 | 97在线观看| 日韩精品一区电影 | 色婷婷在线观看视频 | 国产小视频你懂的在线 | 免费在线观看不卡av | 亚洲欧美日韩中文在线 | 五月婷婷激情综合网 | 91免费试看| 欧美小视频在线 | 在线欧美日韩 | 午夜 在线| 国产视频精品免费 | 99免费精品| 午夜12点| 国产精品美女久久久久久免费 | 亚洲午夜av电影 | 国产精品久久久久久久久婷婷 | 激情 亚洲| 一区二区三区观看 | 九九九热精品免费视频观看网站 | 丝袜美女视频网站 | 欧洲视频一区 | 成人免费毛片aaaaaa片 | 日韩精品一区二区三区不卡 | 国产精品一区二区免费看 | www.婷婷com | 久草在线在线视频 | 日韩欧美视频免费观看 | 国产传媒中文字幕 | 97香蕉超级碰碰久久免费软件 | 免费日韩 精品中文字幕视频在线 | 日韩最新理论电影 | 99精品免费久久久久久久久 | 国产亚洲精品日韩在线tv黄 | 国产第一页在线观看 | 在线免费黄色av | 在线导航av| 日韩在线看片 | 一级黄色片在线观看 | 美国三级黄色大片 | 欧美性生活免费看 | 99久久国产免费,99久久国产免费大片 | 天天操网站 | 天天色天天草天天射 | 日韩欧美区 | 最近中文字幕完整高清 | 色婷婷狠狠五月综合天色拍 | 91九色成人| 国产精品淫 | 久久精品看 | 国产色视频网站 | 日韩电影中文 | 国产中文字幕大全 | 日韩久久精品一区二区三区 | 91在线永久 | 久久免费视频网 | 日日操日日干 | 日本精品中文字幕在线观看 | 一区二区精品视频 | 主播av在线| 顶级bbw搡bbbb搡bbbb| 久久五月天色综合 | 婷婷激情欧美 | 色视频网站在线观看一=区 a视频免费在线观看 | 超碰人人做 | 天天天天天天天操 | 黄色大片国产 | 日韩欧美在线观看一区二区 | 中文字幕在线视频第一页 | 精品久久久久久久久久久久 | 亚洲国产小视频在线观看 | 日韩欧美精品在线观看视频 | 99精品在线视频播放 | 亚洲天堂网在线视频观看 | 91精选在线 | 69av视频在线 | 日韩精品一区二区三区免费观看视频 | 天堂视频一区 | 在线观看黄a| 久久99亚洲网美利坚合众国 | 91成人在线免费观看 | 成年人在线观看视频免费 | www日韩精品 | 午夜 免费 | 亚洲精品乱码久久久久久 | 97av免费视频| 亚洲欧美日韩国产一区二区三区 | 91精品国产欧美一区二区成人 | 91视频专区 | 狠狠色丁婷婷日日 | 亚洲精品伦理在线 | 久久99国产精品二区护士 | 成人免费看电影 | 久久久久久久久久久成人 | 中文字幕在线观看日本 | 色老板在线视频 | 国产免费又粗又猛又爽 | 91在线免费视频 | 久久精品99国产精品酒店日本 | 毛片永久新网址首页 | 91完整版观看 | va视频在线观看 | 免费一级片在线 | 久久久精品网站 | 午夜.dj高清免费观看视频 | 99在线视频免费观看 | 香蕉影院在线 | 91传媒在线 | 中文免费在线观看 | 成人国产在线 | 99在线观看视频网站 | 亚洲国产日韩av | 国产精品乱码久久久久 | 天天干天天操天天射 | 超碰免费97| 久久久精品一区二区三区 | 久久久久久久久久久久久国产精品 | 国产精品对白一区二区三区 | 国产青春久久久国产毛片 | 日韩精品一区二区三区中文字幕 | 日韩大片免费在线观看 | aaa亚洲精品一二三区 | 国产精品久久久久9999吃药 | 日日夜夜骑 | 六月婷色 | 超碰在线cao | 国产美女精品 | 国产精品自产拍在线观看桃花 | 国产一区二区久久 | 亚洲精品在线一区二区三区 | 激情在线网址 | 欧美精品做受xxx性少妇 | 国产91精品看黄网站 | 三级黄色在线观看 | 1024手机在线看 | 久久久久久久久久久久99 | 久久香蕉电影 | 成人一级片在线观看 | 在线免费高清一区二区三区 | 最新久久久 | 欧美午夜理伦三级在线观看 | 曰本三级在线 | 亚洲国产精品500在线观看 | 午夜影院一级 | 91成人午夜| 国产日韩一区在线 | 日本久久成人 | 天天爽天天射 | 国产精品va在线观看入 | 一区二区电影网 | 国产成人精品一区二 | 97国产情侣爱久久免费观看 | 黄色三级免费片 | 欧美日韩国产精品一区 | 免费网站黄 | 久要激情网 | 久操视频在线观看 | 中文字幕日本特黄aa毛片 | 亚洲欧美视频网站 | 欧美天堂视频在线 | 正在播放国产91 | 女人18毛片a级毛片一区二区 | 久久福利电影 | 日日干日日色 | 免费看成人a | 久久这里只有精品9 | 女人18毛片a级毛片一区二区 | 久久天天综合网 | 99国产精品一区二区 | 亚洲无吗视频在线 | 久久欧洲视频 | 玖玖玖在线 | 青草视频在线播放 | 91福利社区在线观看 | 久久黄色a级片 | 久久精品中文 | 精品久久1| 亚洲精品国偷拍自产在线观看 | 日韩欧美国产精品 | 九色91在线视频 | 久久狠狠亚洲综合 | 激情自拍av | 久久婷婷国产色一区二区三区 | 激情大尺度视频 | 成人在线免费视频 | 日韩一二三 | 欧美一级专区免费大片 | 成人黄色电影在线观看 | 国产一区二区三区在线免费观看 | 欧美日韩中文国产一区发布 | 中文字幕日韩在线播放 | 在线一二三区 | 久久精品久久久久久久 | 500部大龄熟乱视频 欧美日本三级 | 91av视频免费在线观看 | 免费91麻豆精品国产自产在线观看 | 国产精品淫 | 国产成人黄色av | 亚洲国产精品免费 | 999成人网 | 中文字幕免 | 在线观看亚洲国产精品 | 日韩免费视频 | www.少妇| 97操操操| 色com网 | 在线观看中文字幕一区二区 | 麻豆一区二区三区视频 | 久久婷婷一区二区三区 | 又色又爽又黄 | 亚洲三级精品 | 欧美专区国产专区 | 国产精品成人自产拍在线观看 | 日日夜夜干 | 亚洲乱码一区 | 成人永久视频 | 亚洲 欧美日韩 国产 中文 | 亚洲国产成人在线播放 | 成人黄色片免费看 | 精品久久中文 | 亚洲一区二区视频 | 免费特级黄毛片 | 久久久婷 | 中文在线中文资源 | 欧美俄罗斯性视频 | 久久久久高清毛片一级 | 免费av在线播放 | 亚洲成av人片一区二区梦乃 | 日韩综合一区二区三区 | 天天操人人干 | 国产伦理久久精品久久久久_ | 特级黄色片免费看 | 天天综合色 | 激情网婷婷 | 91av在线不卡| 国产精品毛片久久久久久久 | 国产亚洲视频在线 | 久久九九精品 | 国产一区二区网址 | 日本中文字幕视频 | 亚洲精品国产欧美在线观看 | 免费三级黄色片 | 三级av免费观看 | 1000部国产精品成人观看 | 91精品爽啪蜜夜国产在线播放 | 欧美淫aaa免费观看 日韩激情免费视频 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 天堂视频中文在线 | 天堂va欧美va亚洲va老司机 | 亚洲欧洲精品一区二区精品久久久 | 日韩精品一二三 | 日韩视频免费播放 | 91在线亚洲| 麻豆小视频在线观看 | 国产精品永久免费 | 欧美一二三在线 | 综合中文字幕 | 在线免费av播放 | 一级性视频 | 在线免费视频一区 | 久草综合在线观看 | 亚洲一区网 | 一色屋精品视频在线观看 | 天天操天天操天天操 | 久久精品中文字幕免费mv | 99久久精品久久久久久清纯 | 91免费在线视频 | 国产精华国产精品 | 欧美天天干 | 亚洲激情p | 美女搞黄国产视频网站 | 国产成人精品女人久久久 | 综合激情伊人 | 久久亚洲专区 | 99国产情侣在线播放 | 深夜免费福利网站 | 欧美日韩大片在线观看 | 国产精品视频大全 | 最新中文在线视频 | 91精品国产欧美一区二区成人 | 美国av片在线观看 | 97热在线观看 | 日韩高清久久 | 国产91电影在线观看 | 韩日精品在线观看 | avhd高清在线谜片 | 国产 视频 高清 免费 | 亚洲精品在线一区二区 | 欧美另类交在线观看 | 国产精品欧美日韩在线观看 | 亚洲乱码国产乱码精品天美传媒 | 手机av电影在线观看 | 西西人体www444 | 亚洲免费成人av电影 | 久久色网站 | 国产破处在线视频 | www.黄色片网站 | 在线91精品 | 久久五月婷婷综合 | 国产美女无遮挡永久免费 | 国产三级国产精品国产专区50 | 少妇啪啪av入口 | 91传媒在线观看 | 免费看十八岁美女 | 天天干,天天操 | 国产成人精品一区一区一区 | 久久人人爽人人爽人人片av免费 | 少妇18xxxx性xxxx片 | 九九有精品 | 欧美日产一区 | 丁香花五月 | 婷婷色在线视频 | 国产九色在线播放九色 | av理论电影 | 人人舔人人爱 | 日韩激情影院 | 91片黄在线观 | 夜夜爽88888免费视频4848 | 欧美在线视频二区 | 亚洲伦理一区二区 | 欧美激情va永久在线播放 | 狠狠干夜夜操 | 天天操·夜夜操 | 日韩精品免费一区 | 欧美一级免费 | 国产999精品久久久久久绿帽 | a特级毛片 | 一区二区三区韩国免费中文网站 | 最近日本字幕mv免费观看在线 | 日日草天天草 | 午夜视频一区二区三区 | 久久综合九色综合久久久精品综合 | 欧美激情第十页 | 狠狠干成人综合网 | 国产免费一区二区三区网站免费 | 在线 成人 | 在线观看中文字幕av | 99欧美精品| 丁香五月亚洲综合在线 | 亚洲综合少妇 | 在线观看免费福利 | 久久久久久蜜av免费网站 | 免费看黄在线 | 在线观看av小说 | 91亚洲欧美 | 人人草在线观看 | www九九热| 精品一区二区在线免费观看 | 成人黄色在线 | 国产精品黑丝在线观看 | www178ccom视频在线 | 免费一区在线 | 欧美性色综合网站 | 欧美日韩高清在线 | 亚洲综合视频在线观看 | 日本在线中文 | 亚洲综合涩| 久久精品观看 | 五月婷婷久久综合 | 国产精品美女久久久免费 | 92av视频| 国产亚洲午夜高清国产拍精品 | av片中文| 日韩精品一区二区久久 | 天天干视频在线 | 国产亚洲精品综合一区91 | av在线一二三区 | 婷婷综合影院 | 国产尤物在线 | 丁香花五月 | 免费一级片在线观看 | 精品国产精品一区二区夜夜嗨 | 一区三区视频 | 最新中文字幕 | av免费线看 | 亚洲精品国偷拍自产在线观看蜜桃 | 在线日本看片免费人成视久网 | 中文字幕亚洲在线观看 | 日韩精品视频免费 | 最近中文字幕在线中文高清版 | 国产成人一二片 | 日韩99热| 久久精品在线视频 | 国产九九热视频 | 中文字幕视频播放 | 国产成人久久精品一区二区三区 | 日本一区二区三区视频在线播放 | 成人h电影在线观看 | 黄色片网站 | 一区中文字幕 | 九九免费在线观看视频 | 日韩最新中文字幕 | 亚洲欧美国产视频 | 国产成人精品亚洲 | 国产成人在线播放 | 中文字幕在线观看国产 | 国产欧美高清 | 日韩视频1 | 99re8这里有精品热视频免费 | 久久久免费精品 | 国产中文字幕在线播放 | 97超视频 | 婷婷丁香七月 | 香蕉97视频观看在线观看 | 色综合天天狠天天透天天伊人 | 婷久久| 麻豆超碰| 91超国产 | 激情综合网婷婷 | 久久在线视频在线 | 91精品在线视频观看 | 中文字幕a∨在线乱码免费看 | 美女久久视频 | av在线之家电影网站 | 久久婷婷综合激情 | 97色婷婷成人综合在线观看 | 日韩在线观看 | 日本午夜在线观看 | 九九视频精品在线 | 亚洲国产剧情av | 91在线看黄 | 国产粉嫩在线观看 | 精品色999| 色在线中文字幕 | 日日操网 | 黄色在线观看污 | 久久久久看片 | 成人资源站 | 丝袜足交在线 | 人人超碰免费 | 亚洲好视频 | 久久精品国产99国产 | 开心色激情网 | 成人h电影在线观看 | 毛片随便看 | 色婷婷天天干 | 一区二区三区污 | 国产一二区视频 | 黄色电影网站在线观看 | 69国产盗摄一区二区三区五区 | 九九一级片 | а天堂中文最新一区二区三区 | 久久国产福利 | 国产精品大片在线观看 | 中日韩在线视频 | 天天操天天射天天爱 | 国产 成人 久久 | 午夜精品麻豆 | 日韩在线播放欧美字幕 | 中文字幕资源网 | 99视频精品免费观看, | 97理论电影 | 97免费 | 高清不卡一区二区三区 | 日韩av美女| 美女免费视频观看网站 | av高清网站在线观看 | 亚洲黄色片在线 | 狠狠色狠狠色 | 国产精品久久久久久一区二区 | 国产黄色片久久 | 欧美一区日韩精品 | 日韩91在线 | 亚洲情感电影大片 | 九九久| 亚洲欧美日韩一二三区 | 国产精品久久久久久久久久新婚 | 国产免费一区二区三区最新6 | 免费欧美高清视频 | 久久精品亚洲综合专区 | 国产精品一区二区美女视频免费看 | 91在线看视频 | 日韩欧美一区视频 | 久久免费看 | 国产成人精品电影久久久 | 国产美女免费观看 | 国产专区欧美专区 | 亚洲免费视频在线观看 | 天天草天天爽 | 日韩丝袜 | 免费日韩av片 | 免费国产在线精品 | 久久精品视频国产 | 在线观看免费黄视频 | 天天天综合 | 精品国产一区二区三区久久久 | 99视频在线免费观看 | 欧美激情第28页 | 国产一区久久 | 国产黄色视 | 国产剧情在线一区 | 波多野结衣一区 | 91精品国产91久久久久 | 亚洲精品欧美专区 | 国产精品免费在线观看视频 | 国产一区欧美一区 | 免费网址你懂的 | 首页av在线| 一区二区中文字幕在线观看 | 亚洲综合在线观看视频 | 成人黄色国产 | 午夜久久久影院 | 超碰大片| 成人精品视频 | 久久爱www.| 狠狠狠色丁香综合久久天下网 | 久久精品久久精品久久 | 日韩va欧美va亚洲va久久 | 国产91精品在线播放 | 久久九九九九 | 91免费的视频在线播放 | 夜夜高潮夜夜爽国产伦精品 | 91亚洲精品乱码久久久久久蜜桃 | 韩日精品在线 | 成人激情开心网 | 成年一级片| 99精品视频在线播放免费 | 成人亚洲精品久久久久 | 久久久久久免费网 | 成年人在线观看 | 丁香激情综合国产 | 国产一区在线免费观看视频 | 青草视频在线免费 | 成人中文字幕+乱码+中文字幕 | 欧美激情亚洲综合 | 日韩电影一区二区三区在线观看 | 日韩欧美成人网 | 国产精品免费久久久久久 | 国产精品嫩草影院99网站 | 国偷自产中文字幕亚洲手机在线 | 在线精品在线 | 97成人精品区在线播放 | 日韩综合视频在线观看 | 婷婷丁香综合 | 久久久久久久久久久久久9999 | 99se视频在线观看 | 日韩在线第一 | 九九九九九精品 | 成人在线视 | 欧美性超爽 | 久久视频网址 | 中文字幕免费观看 | 在线婷婷| av经典在线| 久久久久久免费网 | 久久视| 开心色插 | 婷婷丁香自拍 | 超碰97在线看 | 日韩免| av不卡网站 | 91视频下载| 久久综合久久综合久久 | av大片免费在线观看 | 天堂av免费看 | 天堂在线一区 | 狠狠躁日日躁 | 午夜精品一区二区三区在线 | 久久成视频 | 亚洲在线免费视频 | 国产精品电影一区 | 97夜夜澡人人双人人人喊 | 香蕉影视app| 色综合天天色 | 一区二区三区韩国免费中文网站 | 在线观看mv的中文字幕网站 | www在线观看视频 | 四虎亚洲精品 | 久久视频这里有精品 | 久久这里只有精品久久 | 久久天天躁夜夜躁狠狠躁2022 | 国产精品青草综合久久久久99 | 亚洲a资源 | 成人av网站在线观看 | 福利视频 | 九九免费在线观看 | 99久久精品免费 | 少妇高潮冒白浆 | 在线v片| 91成人看片| 欧美日韩国产精品一区二区亚洲 | 久久精品精品电影网 | 欧美精品久久久久久 | 色婷婷狠狠干 | 国产又粗又猛又色又黄网站 | 又黄又刺激视频 | 天天摸天天干天天操天天射 | 97香蕉久久超级碰碰高清版 | 美女网站在线看 | 天天躁日日躁狠狠躁 | 免费能看的av | 涩涩成人在线 | 色综合天天天天做夜夜夜夜做 | 91精品综合在线观看 | 中文字幕 第二区 | 97超碰在线免费观看 | 国产一区二区在线看 | 国产视频一二三 | 国产毛片久久 | 在线精品视频免费播放 | 黄色一级免费 | 日韩sese| 国产精品99久久99久久久二8 | 四虎免费在线观看视频 | 天天操天天插 | 久久精品一二三区白丝高潮 | 视频一区二区精品 | 日本公乱妇视频 | av高清影院| 日韩电影中文字幕在线 | 丁香六月婷婷综合 | 亚洲成av人影院 | 91高清不卡| 国产精品淫 | 国产a级精品 | 天天躁日日 | 91污污视频在线观看 | 久久久www成人免费精品 | 精品日韩中文字幕 | 欧美va天堂在线电影 | 国产精品久久久久久久7电影 | 国产黄色免费电影 | 久久久免费网站 | 国产精品毛片一区二区 | 精品国产乱码久久 | 亚洲视频在线播放 | 91精品国产91久久久久福利 | 韩国精品在线 | 日韩免费一区二区在线观看 | 久久久久女人精品毛片 | 二区三区精品 | 亚洲丁香久久久 | 日韩在线观看小视频 | 日韩高清一二区 | 一级理论片在线观看 | 久久综合久久综合这里只有精品 | 国产黄a三级三级三级三级三级 | 国内免费久久久久久久久久久 | 亚洲国产成人久久 | 国产亚洲片 | 九九热免费在线视频 | 国产一二区精品 | 日本中文乱码卡一卡二新区 | 亚洲视频久久久久 | 国产在线观看你懂得 | 在线亚洲观看 | 在线亚洲天堂网 | 久草视频在线免费看 | 色综合久久久久久中文网 | 日韩欧美69 | 中文av在线免费观看 | 亚洲精品久久视频 | 999成人免费视频 | 香蕉视频4aa| 国产又粗又长又硬免费视频 | 精品毛片久久久久久 | 91天天视频 | 开心激情网五月天 | 久久草草影视免费网 | 亚洲精品视频在 |