Skip to content

Mybatis相关配置

问题 1. 主键设置为自增

  1. 建议参考 mybatis plus 官方文档

  2. AcuityMetaObjectHandler 注释掉调用的 fillId(metaObject); 方法

    java
    @Override
    public void insertFill(MetaObject metaObject) {
    // 注释掉填充id的方法
     // fillId(metaObject);
    }
    @Override
    public void insertFill(MetaObject metaObject) {
    // 注释掉填充id的方法
     // fillId(metaObject);
    }
  3. 修改 SuperEntity 类上的注解

    java
    // 可选值: 自增=AUTO、 自己控制:INPUT、 跟随全局配置: NONE、  mp提供的雪花Id:ASSIGN_ID
    @TableId(value = "id", type = IdType.AUTO)
    // 可选值: 自增=AUTO、 自己控制:INPUT、 跟随全局配置: NONE、  mp提供的雪花Id:ASSIGN_ID
    @TableId(value = "id", type = IdType.AUTO)
  4. 修改 database.yml 配置文件 (acuity-boot 在 application.yml)

yaml
mybatis-plus:
  global-config:
    db-config:
      id-type: INPUT # 这里的可选值跟上一步一样。
mybatis-plus:
  global-config:
    db-config:
      id-type: INPUT # 这里的可选值跟上一步一样。
  1. 自行将 acuity_pro_base、acuity_extend、acuity_pro_defaults 库的主键 id 设置为自增

问题 2. 不想继承 SuperEntityEntityTreeEntity

注意: 最好的方式是,我的代码别动! 你们新增的业务代码使用自己新建的父类实体,或者不继承任务父类实体。这样子改动最小!

不继承任何实体

  1. 手写代码的直接让自己的实体不继承任何父类即可。

  2. 使用代码生成器生成的代码若不想继承任何实体,在生成代码时,设置为 NONE 类型

    java
    build.setSuperEntity(EntityType.NONE);    // 参考代码生成器项目单元测试中的示例代码
    build.setSuperEntity(EntityType.NONE);    // 参考代码生成器项目单元测试中的示例代码

继承自建的父类实体

  1. 手写代码的直接让自己的实体类 继承自建的父类即可。

  2. 使用代码生成器需要在 EntityType 类中新增一个枚举值, 并在生成代码时,设置为自定义的类型

    java
    public enum EntityType {
     // 参数1:自建父类全名    参数2:自建父类的公共字段
     MODEL("com..basic.base.entity.Model", new String[]{"id"}),
    }
    public enum EntityType {
     // 参数1:自建父类全名    参数2:自建父类的公共字段
     MODEL("com..basic.base.entity.Model", new String[]{"id"}),
    }
    java
    build.setSuperEntity(EntityType.MODEL);  // 参考代码生成器项目单元测试中的示例代码
    build.setSuperEntity(EntityType.MODEL);  // 参考代码生成器项目单元测试中的示例代码

问题 3. 修改数据源模式(多数据源类型)

yaml
acuity:
  mysql:
    database: acuity_defulats # SCHAMA DATASOURCE模式时,启动时连接的默认库
    # database: acuity_pro_none   #  none模式时,启动时连接的数据库
    # database: acuity_pro_column   #  column模式时,启动时连接的数据库
  database:
    tenantDatabasePrefix: acuity_pro_base # SCHAMA 模式时,租户库的前缀。 (none column DATASOURCE模式请忽略该字段)
    initDatabasePrefix: # DATASOURCE 和 DATASOURCE_COLUMN模式 租户库 前缀
      - acuity_ds_c_base
    multiTenantType: DATASOURCE # 可选值: NONE COLUMN SCHAMA DATASOURCE
acuity:
  mysql:
    database: acuity_defulats # SCHAMA DATASOURCE模式时,启动时连接的默认库
    # database: acuity_pro_none   #  none模式时,启动时连接的数据库
    # database: acuity_pro_column   #  column模式时,启动时连接的数据库
  database:
    tenantDatabasePrefix: acuity_pro_base # SCHAMA 模式时,租户库的前缀。 (none column DATASOURCE模式请忽略该字段)
    initDatabasePrefix: # DATASOURCE 和 DATASOURCE_COLUMN模式 租户库 前缀
      - acuity_ds_c_base
    multiTenantType: DATASOURCE # 可选值: NONE COLUMN SCHAMA DATASOURCE

问题 4. 启用控制台打印 可执行 sql(红色 sql 语句)

  • acuity-cloud-pro-datasource-column 和 acuity-boot-pro-datasource-column 项目
yaml
# databae.yml 文件
acuity:
  database:
    p6spy: true # oracle、mysql、sqlserver 都支持

spring:
  datasource:
    dynamic:
      # p6spy = true 时, dynamic 组件会将原生数据源代理成 p6spy 数据源
      p6spy: ${acuity.database.p6spy:false}
# databae.yml 文件
acuity:
  database:
    p6spy: true # oracle、mysql、sqlserver 都支持

spring:
  datasource:
    dynamic:
      # p6spy = true 时, dynamic 组件会将原生数据源代理成 p6spy 数据源
      p6spy: ${acuity.database.p6spy:false}
  • acuity-cloud-pro-column 和 acuity-cloud-pro-none 项目,使用 MySQL 或 SQL Server 时,只需要将 driverClassName 和 url 替换成 p6spy 的驱动和连接即可
yaml
# database.yml
acuity:
  sqlserver: &db-sqlserver
    driverClassName: com.p6spy.engine.spy.P6SpyDriver
    url: jdbc:p6spy:sqlserver://172.26.3.67:1433;DatabaseName=acuity_pro_column
  mysql: &db-mysql
    driverClassName: com.p6spy.engine.spy.P6SpyDriver
    url: jdbc:p6spy:mysql://127.0.0.1:3306/acuity_pro_column?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false&autoReconnect=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&nullCatalogMeansCurrent=true
# database.yml
acuity:
  sqlserver: &db-sqlserver
    driverClassName: com.p6spy.engine.spy.P6SpyDriver
    url: jdbc:p6spy:sqlserver://172.26.3.67:1433;DatabaseName=acuity_pro_column
  mysql: &db-mysql
    driverClassName: com.p6spy.engine.spy.P6SpyDriver
    url: jdbc:p6spy:mysql://127.0.0.1:3306/acuity_pro_column?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false&autoReconnect=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&nullCatalogMeansCurrent=true
  • acuity-cloud-pro-column 和 acuity-cloud-pro-none 项目,使用 Oracle 时,由于 oracle + druid + p6spy 组合使用时,druid 初始化数据源,执行 initCheck 方法时,driver.getMajorVersion() 方法获取到的是 p6spy 的版本,而非 Oracle 的真实版本,所以不能通过替换驱动和连接的方式来使用 p6spy。

但可以通过 druid 提供的 LogFilter 来打印可执行 SQL,配置如下:

yaml
acuity:
  oracle: &db-oracle-dev
    db-type: oracle
    validation-query: SELECT 'x' FROM DUAL
    filters: stat,wall,slf4j # 关键配置1: druid不支持使用p6spy打印日志,所以采用druid 的 slf4j 过滤器来打印可执行日志.  将 ${spring.datasource.druid.filter.slf4j.enabled} 改为true。
    username: "acuity_pro_column"
    password: "acuity_pro_column"
    driverClassName: oracle.jdbc.driver.OracleDriver # 关键配置2
    url: jdbc:oracle:thin:@172.26.3.67:1521:helowin # 关键配置3

spring:
  config:
    activate:
      on-profile: dev
  datasource:
    druid:
      <<: *db-oracle-dev
      filter:
        slf4j:
          enabled: true # 关键配置4 使用slf4j打印可执行日志时,改成true
          statement-executable-sql-log-enable: true # 关键配置5 打印类似 p6spy 的可执行SQL 日志
acuity:
  oracle: &db-oracle-dev
    db-type: oracle
    validation-query: SELECT 'x' FROM DUAL
    filters: stat,wall,slf4j # 关键配置1: druid不支持使用p6spy打印日志,所以采用druid 的 slf4j 过滤器来打印可执行日志.  将 ${spring.datasource.druid.filter.slf4j.enabled} 改为true。
    username: "acuity_pro_column"
    password: "acuity_pro_column"
    driverClassName: oracle.jdbc.driver.OracleDriver # 关键配置2
    url: jdbc:oracle:thin:@172.26.3.67:1521:helowin # 关键配置3

spring:
  config:
    activate:
      on-profile: dev
  datasource:
    druid:
      <<: *db-oracle-dev
      filter:
        slf4j:
          enabled: true # 关键配置4 使用slf4j打印可执行日志时,改成true
          statement-executable-sql-log-enable: true # 关键配置5 打印类似 p6spy 的可执行SQL 日志

关键配置 2关键配置 3使用 Oracle 的原始驱动和连接,关键配置 1filters 配置slf4j关键配置 4关键配置 5配置为true

问题 5. 自定义控制台打印的红色 sql 格式

  • 直接修改 TenantP6SpyLogger 类

  • 或者修改 spy.properties 文件中下面的配置类为你自己的

    ini
    logMessageFormat=com..basic.database.p6spy.TenantP6SpyLogger
    logMessageFormat=com..basic.database.p6spy.TenantP6SpyLogger

问题 6. 修改 COLUMN 租户模式全局拼接的租户 id 字段的字段名

yaml
acuity:
  database:
    tenantIdColumn: tenant_id
acuity:
  database:
    tenantIdColumn: tenant_id

问题 7. 保存后,如何获取实体的 id

java
User user = new User();
userService.save(user);
user.getId();
User user = new User();
userService.save(user);
user.getId();

问题 8. 为什么要在 acuity-xxx-base/src/main/resources 下面存放 xml ?

有些项目喜欢将 xml 和 mapper 都存放在 src/main/java 里面,其实存放在那里都行,但个人觉得 src/main/java 存放的应该是 java 类,src/main/resources 存放的应该是配置文件。

问题 9. 为什么要在 acuity-xxx-base/src/main/resources 下面新增 mapper_yyy 文件夹?

因为 acuity 项目模块拆分比较细,

问题 10. 为什么要在 acuity-xxx-base/src/main/resources 下面新增 mapper_yyy 文件夹下区分 base 和 ext 文件夹?

base 文件夹下存放的是代码生成器生成出来的原始配置,ext 文件夹下存放的是自己写的 sql,后期发生表结构变更是,方面重新生成代码,新生成的 xml 文件,直接覆盖 base 文件夹下的文件即可。

一个 Mapper 类,可以对应多个 xml,只要保证 xml 中 namespace 和 Mapper 的全路径一致即可!如:

  • BasePositionMapper.java
java
package top.acuity.box.base.dao.user;
public interface BasePositionMapper extends SuperMapper<BasePosition> {
}
package top.acuity.box.base.dao.user;
public interface BasePositionMapper extends SuperMapper<BasePosition> {
}
  • mapper_system/base/BasePositionMapper.xml
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="top.acuity.box.base.dao.user.BasePositionMapper">
</mapper>
<?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="top.acuity.box.base.dao.user.BasePositionMapper">
</mapper>
  • mapper_system/ext/BasePositionMapper.xml
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="top.acuity.box.base.dao.user.BasePositionMapper">
</mapper>
<?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="top.acuity.box.base.dao.user.BasePositionMapper">
</mapper>

mytabis plus 配置

更多 mytabis plus 配置参考 官方文档

yaml
# database.yml
mybatis-plus:
  mapper-locations:  
    - classpath*:mapper_**/**/*Mapper.xml
  typeAliasesPackage: top.acuity.box.*.entity;top.acuity.commons.database.mybatis.typehandler 
  typeEnumsPackage: top.acuity.box.*.enumeration
  global-config:
    db-config:
      id-type: INPUT
      insert-strategy: NOT_NULL
      update-strategy: NOT_NULL
      where-strategy: NOT_EMPTY
  configuration:
    #配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId)
    map-underscore-to-camel-case: true
    cache-enabled: false
    #配置JdbcTypeForNull, oracle数据库必须配置
    jdbc-type-for-null: 'null'
# database.yml
mybatis-plus:
  mapper-locations:  
    - classpath*:mapper_**/**/*Mapper.xml
  typeAliasesPackage: top.acuity.box.*.entity;top.acuity.commons.database.mybatis.typehandler 
  typeEnumsPackage: top.acuity.box.*.enumeration
  global-config:
    db-config:
      id-type: INPUT
      insert-strategy: NOT_NULL
      update-strategy: NOT_NULL
      where-strategy: NOT_EMPTY
  configuration:
    #配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId)
    map-underscore-to-camel-case: true
    cache-enabled: false
    #配置JdbcTypeForNull, oracle数据库必须配置
    jdbc-type-for-null: 'null'
  • mapper-locations: 扫描mapper.xml 路径
  • typeAliasesPackage: MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名)
  • typeEnumsPackage: 枚举类 扫描路径,如果配置了该属性,会将路径下的枚举类进行注入,让实体类字段能够简单快捷的使用枚举属性
  • db-config.idType: 全局默认主键类型
  • db-config.insert-strategy: 字段验证策略之 insert,在 insert 的时候的字段验证策略
  • db-config.update-strategy: 字段验证策略之 update,在 update 的时候的字段验证策略
  • db-config.where-strategy: 字段验证策略之 where,在 where 的时候的字段验证策略

druid监控页面

yaml
spring:
  datasource:
	  druid:
      enable: true
      stat-view-servlet:  #展示Druid的统计信息,StatViewServlet的用途包括:1.提供监控信息展示的html页面2.提供监控信息的JSON API
        enabled: true
         # 根据配置中的url-pattern来访问内置监控页面,内置监控页面的首页是/druid/index.html。例如:http://127.0.0.1:9000/druid/index.html
        url-pattern: /druid/*  
        #允许清空统计数据
        reset-enable: true   
        # 账号密码
        login-username: ''
        login-password: ''
        # 允许访问IP
        allow: ''
spring:
  datasource:
	  druid:
      enable: true
      stat-view-servlet:  #展示Druid的统计信息,StatViewServlet的用途包括:1.提供监控信息展示的html页面2.提供监控信息的JSON API
        enabled: true
         # 根据配置中的url-pattern来访问内置监控页面,内置监控页面的首页是/druid/index.html。例如:http://127.0.0.1:9000/druid/index.html
        url-pattern: /druid/*  
        #允许清空统计数据
        reset-enable: true   
        # 账号密码
        login-username: ''
        login-password: ''
        # 允许访问IP
        allow: ''

分页插件配置

yaml
acuity:
  databse:
		# 单页分页条数限制:每次最多查询多少条数据,-1表示不限制
    maxLimit: -1
    # 溢出总页数后是否进行处理:假设总数据只有10页,当你查询第11页以后的数据时,默认设置为查询第一页的数据
    overflow: true
    # 生成 countSql 优化掉 join, 现在只支持 left join
    optimizeJoin: true
acuity:
  databse:
		# 单页分页条数限制:每次最多查询多少条数据,-1表示不限制
    maxLimit: -1
    # 溢出总页数后是否进行处理:假设总数据只有10页,当你查询第11页以后的数据时,默认设置为查询第一页的数据
    overflow: true
    # 生成 countSql 优化掉 join, 现在只支持 left join
    optimizeJoin: true

欢迎使用天源云Saas快速开发系统