Appearance
Mybatis相关配置
问题 1. 主键设置为自增
建议参考 mybatis plus 官方文档
AcuityMetaObjectHandler
注释掉调用的fillId(metaObject);
方法java@Override public void insertFill(MetaObject metaObject) { // 注释掉填充id的方法 // fillId(metaObject); }
@Override public void insertFill(MetaObject metaObject) { // 注释掉填充id的方法 // fillId(metaObject); }
修改
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)
修改
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 # 这里的可选值跟上一步一样。
- 自行将 acuity_pro_base、acuity_extend、acuity_pro_defaults 库的主键 id 设置为自增
问题 2. 不想继承 SuperEntity
、 Entity
、 TreeEntity
注意: 最好的方式是,我的代码别动! 你们新增的业务代码使用自己新建的父类实体,或者不继承任务父类实体。这样子改动最小!
不继承任何实体
手写代码的直接让自己的实体不继承任何父类即可。
使用代码生成器生成的代码若不想继承任何实体,在生成代码时,设置为 NONE 类型
javabuild.setSuperEntity(EntityType.NONE); // 参考代码生成器项目单元测试中的示例代码
build.setSuperEntity(EntityType.NONE); // 参考代码生成器项目单元测试中的示例代码
继承自建的父类实体
手写代码的直接让自己的实体类 继承自建的父类即可。
使用代码生成器需要在
EntityType
类中新增一个枚举值, 并在生成代码时,设置为自定义的类型javapublic 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"}), }
javabuild.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 的原始驱动和连接,关键配置 1 中 filters 配置slf4j ,关键配置 4和关键配置 5配置为true
问题 5. 自定义控制台打印的红色 sql 格式
直接修改 TenantP6SpyLogger 类
或者修改 spy.properties 文件中下面的配置类为你自己的
inilogMessageFormat=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