关系数据库
============ 
mybatis-plus封装
- 支持多数据源自动切换
- 支持预置建库脚本
- 提供树型内部码生成工具

说明
---------------
多数据源
* 启用多数据源(默认为不启用)：persagy.common.dynamic.enabled=true
* 配置文件参考：com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties
* [配置文件示例](https://github.com/dynamic-datasource/dynamic-datasource-doc/blob/master/docs/guide/integration/Druid.md)
```
spring:
  datasource:
    druid:
      stat-view-servlet:
        enabled: true
        loginUsername: admin
        loginPassword: 123456
    dynamic:
      druid: #以下是支持的全局默认值
        initial-size:
        max-active:
        min-idle:
        max-wait:
        time-between-eviction-runs-millis:
        time-between-log-stats-millis:
        stat-sqlmax-size:
        min-evictable-idle-time-millis:
        max-evictable-idle-time-millis:
        test-while-idle:
        test-on-borrow:
        test-on-return:
        validation-query:
        validation-query-timeout:
        use-global-datasource-stat:
        async-init:
        clear-filters-enable:
        reset-stat-enable:
        not-full-timeout-retry-count:
        max-wait-thread-count:
        fail-fast:
        phyTimeout-millis:
        keep-alive:
        pool-prepared-statements:
        init-variants:
        init-global-variants:
        use-unfair-lock:
        kill-when-socket-read-timeout:
        connection-properties:
        max-pool-prepared-statement-per-connection-size:
        init-connection-sqls:
        share-prepared-statements:
        connection-errorretry-attempts:
        break-after-acquire-failure:
        filters: stat,wall # 注意这个值和druid原生不一致，默认启动了stat,wall
        wall:
            noneBaseStatementAllow:
            callAllow:
            selectAllow:
            selectIntoAllow:
            selectIntoOutfileAllow:
            selectWhereAlwayTrueCheck:
            selectHavingAlwayTrueCheck:
            selectUnionCheck:
            selectMinusCheck:
            selectExceptCheck:
            selectIntersectCheck:
            createTableAllow:
            dropTableAllow:
            alterTableAllow:
            renameTableAllow:
            hintAllow:
            lockTableAllow:
            startTransactionAllow:
            blockAllow:
            conditionAndAlwayTrueAllow:
            conditionAndAlwayFalseAllow:
            conditionDoubleConstAllow:
            conditionLikeTrueAllow:
            selectAllColumnAllow:
            deleteAllow:
            deleteWhereAlwayTrueCheck:
            deleteWhereNoneCheck:
            updateAllow:
            updateWhereAlayTrueCheck:
            updateWhereNoneCheck:
            insertAllow:
            mergeAllow:
            minusAllow:
            intersectAllow:
            replaceAllow:
            setAllow:
            commitAllow:
            rollbackAllow:
            useAllow:
            multiStatementAllow:
            truncateAllow:
            commentAllow:
            strictSyntaxCheck:
            constArithmeticAllow:
            limitZeroAllow:
            describeAllow:
            showAllow:
            schemaCheck:
            tableCheck:
            functionCheck:
            objectCheck:
            variantCheck:
            mustParameterized:
            doPrivilegedAllow:
            dir:
            tenantTablePattern:
            tenantColumn:
            wrapAllow:
            metadataAllow:
            conditionOpXorAllow:
            conditionOpBitwseAllow:
            caseConditionConstAllow:
            completeInsertValuesCheck:
            insertValuesCheckSize:
            selectLimit:
        stat:
          merge-sql:
          log-slow-sql:
          slow-sql-millis: 
      datasource:
        master:
          username: root
          password: 123456
          driver-class-name: com.mysql.jdbc.Driver
          url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic?characterEncoding=utf8&useSSL=false
          druid: # 以下是独立参数，每个库可以重新设置
            initial-size:
            validation-query: select 1 FROM DUAL #比如oracle就需要重新设置这个
            public-key: #（非全局参数）设置即表示启用加密,底层会自动帮你配置相关的连接参数和filter，推荐使用本项目自带的加密方法。
#           ......

# 生成 publickey 和密码，推荐使用本项目自带的加密方法。
# java -cp druid-1.1.10.jar com.alibaba.druid.filter.config.ConfigTools youpassword
```

预置建库脚本
* [参考配置](https://github.com/dynamic-datasource/dynamic-datasource-doc/blob/master/docs/guide/advance/Init-Schema-Data.md)
* 脚本文件放在resources目录，在默认数据源中增加配置：
  ```
  spring:
    datasource:
      dynamic:
        primary: order
        datasource:
          order:
            # 基础配置省略...
            schema: db/order/schema.sql # 配置则生效,自动初始化表结构。
            data: db/order/data.sql # 配置则生效,自动初始化数据。
            continue-on-error: true # 默认true,初始化失败是否继续
            separator: ";" # sql默认分号分隔符，一般无需更改
  ```
* 注意事项：
  - schema： 建立连接时会执行，因此建表应使用CREATE TABLE IF NOT EXISTS确保不会重复创建。
  - data: 建立连接时会执行，应确保数据不会重复插入。

树型内部码工具
* 可对实现ITreeEntity的model自动生成innerCode内部码。
	
自定义DB数据格式转换器
* 放入此目录中即可： com.persagy.**.typehandler
* json类型自动转换，需要配置@TableName(value = "tableName", autoResultMap = true)和字段@TableField(typeHandler = JacksonTypeHandler.class)

最新变化
---------------

注意事项
---------------
字符集配置：DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
* 在建库语句中标记字符集，代码中的建表语句不出现字符集相关的语句（导出时如果有则手动清除）。
* 字符集不一致修复sql：
```
-- 数据库字符集修改
ALTER DATABASE `${schema}` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
-- 表字符集修改
SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;') 
  FROM information_schema.TABLES WHERE TABLE_SCHEMA = '${schema}';
-- 拷贝查询到的结果并执行即可
```