重构 apt 配置属性

processor.allInTables ---> processor.allInTables.enable
processor.tablesPackage ---> processor.allInTables.package
processor.tablesClassName ----> processor.allInTables.className
processor.mappersGenerateEnable ----> processor.mapper.generateEnable
processor.baseMapperClass ---> processor.mapper.baseClass
processor.mappersPackage ---> processor.mapper.package
processor.tablesNameStyle ---> processor.tableDef.propertiesNameStyle
processor.tablesDefSuffix ---> processor.tableDef.instanceSuffix
processor.entity.ignoreSuffixes ---> processor.tableDef.ignoreEntitySuffixes
This commit is contained in:
开源海哥 2023-07-02 12:02:37 +08:00
parent 5ea3b82aee
commit 462fa3b2bb
8 changed files with 95 additions and 79 deletions

View File

@ -17,17 +17,17 @@ MyBatis-Flex 使用了 APTAnnotation Processing Tool技术在项目编
| ------------------------------- | ------------------------ | -------------------------------------------------------- | ------------------------------------ |
| processor.enable | 全局启用apt开关 | true/false | true |
| processor.stopBubbling | 是否停止向上级合并配 | true/false | false |
| processor.mappersGenerateEnable | 开启 Mapper 自动生成 | true/false | false |
| processor.genPath | APT 代码生成路径 | 合法的绝对或相对路径 | target/generated-sources/annotations |
| processor.allInTables | 是否所有的类都生成在 Tables 类里 | true/false | false |
| processor.tablesPackage | Tables 类名 | 合法的包名 | ${entityPackage}.table |
| processor.tablesClassName | Tables 类名 | 合法的类名 | Tables |
| processor.baseMapperClass | 自定义 Mapper 的父类 | 全路径类名 | com.mybatisflex.core.BaseMapper |
| processor.mappersPackage | 自定义 Mapper 生成的包名 | 合法的包名 | ${entityPackage}.mapper |
| processor.allInTables.enable | 是否所有的类都生成在 Tables 类里 | true/false | false |
| processor.allInTables.tablesPackage | Tables 类名 | 合法的包名 | ${entityPackage}.table |
| processor.allInTables.tablesClassName | Tables 类名 | 合法的类名 | Tables |
| processor.mapper.generateEnable | 开启 Mapper 自动生成 | true/false | false |
| processor.mapper.baseClass | 自定义 Mapper 的父类 | 全路径类名 | com.mybatisflex.core.BaseMapper |
| processor.mapper.package | 自定义 Mapper 生成的包名 | 合法的包名 | ${entityPackage}.mapper |
| processor.tableDef.propertiesNameStyle | 生成辅助类的字段风格 | upperCase, lowerCase<br />upperCamelCase, lowerCamelCase | upperCase |
| processor.tableDef.instanceSuffix | 生成的表对应的变量后缀 | string | 空字符串 |
| processor.tableDef.classSuffix | 生成的表对应的变量后缀 | string | 空字符串 |
| processor.entity.ignoreSuffixes | 过滤 Entity 后缀 | string | - |
| processor.tableDef.classSuffix | 生成的 TableDef 类的后缀 | string | TableDef |
| processor.tableDef.ignoreEntitySuffixes | 过滤 Entity 后缀 | string | - |

View File

@ -90,20 +90,21 @@ public class MybatisFlexProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
if (!roundEnv.processingOver()) {
System.out.println("mybatis flex processor run start...");
// 不启用 APT 功能
if ("false".equalsIgnoreCase(configuration.get(ConfigurationKey.ENABLE))) {
return true;
}
System.out.println("mybatis flex processor run start...");
// 是否所有的类常量都生成在 Tables 类里
boolean allInTables = "true".equalsIgnoreCase(configuration.get(ConfigurationKey.ALL_IN_TABLES));
boolean allInTablesEnable = "true".equalsIgnoreCase(configuration.get(ConfigurationKey.ALL_IN_TABLES_ENABLE));
StringBuilder importBuilder;
StringBuilder fieldBuilder;
if (allInTables) {
if (allInTablesEnable) {
importBuilder = new StringBuilder();
fieldBuilder = new StringBuilder();
} else {
@ -113,15 +114,21 @@ public class MybatisFlexProcessor extends AbstractProcessor {
// 其他配置选项
String genPath = configuration.get(ConfigurationKey.GEN_PATH);
String tablesPackage = configuration.get(ConfigurationKey.TABLES_PACKAGE);
String mappersPackage = configuration.get(ConfigurationKey.MAPPERS_PACKAGE);
String baseMapperClass = configuration.get(ConfigurationKey.BASE_MAPPER_CLASS);
String tablesDefSuffix = configuration.get(ConfigurationKey.TABLES_DEF_SUFFIX);
String tablesNameStyle = configuration.get(ConfigurationKey.TABLE_NAME_STYLE);
String tablesClassName = configuration.get(ConfigurationKey.TABLES_CLASS_NAME);
String mappersGenerateEnable = configuration.get(ConfigurationKey.MAPPERS_GENERATE_ENABLE);
String[] entityIgnoreSuffixes = configuration.get(ConfigurationKey.IGNORE_SUFFIXES).split(",");
// all in Tables 配置
String allInTablesPackage = configuration.get(ConfigurationKey.ALL_IN_TABLES_PACKAGE);
String allInTablesClassName = configuration.get(ConfigurationKey.ALL_IN_TABLES_CLASS_NAME);
// mapper 配置
String mapperGenerateEnable = configuration.get(ConfigurationKey.MAPPER_GENERATE_ENABLE);
String mapperPackage = configuration.get(ConfigurationKey.MAPPER_PACKAGE);
String mapperBaseClass = configuration.get(ConfigurationKey.MAPPER_BASE_CLASS);
// tableDef 配置
String tableDefClassSuffix = configuration.get(ConfigurationKey.TABLE_DEF_CLASS_SUFFIX);
String tableDefInstanceSuffix = configuration.get(ConfigurationKey.TABLE_DEF_INSTANCE_SUFFIX);
String tableDefPropertiesNameStyle = configuration.get(ConfigurationKey.TABLE_DEF_PROPERTIES_NAME_STYLE);
String[] tableDefIgnoreEntitySuffixes = configuration.get(ConfigurationKey.TABLE_DEF_IGNORE_ENTITY_SUFFIXES).split(",");
// 如果不指定 Tables 生成包那么 Tables 文件就会和最后一个 entity 文件在同一个包
String entityClassReference = null;
@ -162,7 +169,7 @@ public class MybatisFlexProcessor extends AbstractProcessor {
String entityClassName = StrUtil.getClassName(entityClass);
// 处理 entity 后缀
for (String entityIgnoreSuffix : entityIgnoreSuffixes) {
for (String entityIgnoreSuffix : tableDefIgnoreEntitySuffixes) {
if (entityClassName.endsWith(entityIgnoreSuffix.trim())) {
entityClassName = entityClassName.substring(0, entityClassName.length() - entityIgnoreSuffix.length());
break;
@ -171,31 +178,32 @@ public class MybatisFlexProcessor extends AbstractProcessor {
// 生成 TableDef 文件
String tableDefPackage = StrUtil.buildTableDefPackage(entityClass);
String tableDefClassName = entityClassName.concat("TableDef");
String tableDefContent = ContentBuilder.buildTableDef(table, entityClass, entityClassName, allInTables, tableDefPackage, tableDefClassName, tablesNameStyle, tablesDefSuffix, columnInfoList, defaultColumns);
String tableDefClassName = entityClassName.concat(tableDefClassSuffix);
String tableDefContent = ContentBuilder.buildTableDef(table, entityClass, entityClassName, allInTablesEnable, tableDefPackage, tableDefClassName
, tableDefPropertiesNameStyle, tableDefInstanceSuffix, columnInfoList, defaultColumns);
processGenClass(genPath, tableDefPackage, tableDefClassName, tableDefContent);
if (allInTables) {
if (allInTablesEnable) {
// 标记 entity 如果没有配置 Tables 生成位置 entity 位置为准
entityClassReference = entityClass;
// 构建 Tables 常量属性及其导包
ContentBuilder.buildTablesField(importBuilder, fieldBuilder, table, entityClass, entityClassName, tablesNameStyle, tablesDefSuffix);
ContentBuilder.buildTablesField(importBuilder, fieldBuilder, table, entityClass, entityClassName, tableDefClassSuffix, tableDefPropertiesNameStyle, tableDefInstanceSuffix);
}
// 是否生成 Mapper 文件
if ("true".equalsIgnoreCase(mappersGenerateEnable) && table.mapperGenerateEnable()) {
String realMapperPackage = StrUtil.isBlank(mappersPackage) ? StrUtil.buildMapperPackage(entityClass) : mappersPackage;
if ("true".equalsIgnoreCase(mapperGenerateEnable) && table.mapperGenerateEnable()) {
String realMapperPackage = StrUtil.isBlank(mapperPackage) ? StrUtil.buildMapperPackage(entityClass) : mapperPackage;
String mapperClassName = entityClassName.concat("Mapper");
String mapperClassContent = ContentBuilder.buildMapper(entityClass, entityClassName, realMapperPackage, mapperClassName, baseMapperClass);
String mapperClassContent = ContentBuilder.buildMapper(entityClass, entityClassName, realMapperPackage, mapperClassName, mapperBaseClass);
processGenClass(genPath, realMapperPackage, mapperClassName, mapperClassContent);
}
// handle NPE, ensure TableDef already generate.
if (index == size && allInTables) {
if (index == size && allInTablesEnable) {
// 生成 Tables 文件
String realTablesPackage = StrUtil.isBlank(tablesPackage) ? StrUtil.buildTableDefPackage(entityClassReference) : tablesPackage;
String realTablesClassName = StrUtil.isBlank(tablesClassName) ? "Tables" : tablesClassName;
String tablesContent = ContentBuilder.buildTables(importBuilder, fieldBuilder, realTablesPackage, tablesClassName);
String realTablesPackage = StrUtil.isBlank(allInTablesPackage) ? StrUtil.buildTableDefPackage(entityClassReference) : allInTablesPackage;
String realTablesClassName = StrUtil.isBlank(allInTablesClassName) ? "Tables" : allInTablesClassName;
String tablesContent = ContentBuilder.buildTables(importBuilder, fieldBuilder, realTablesPackage, allInTablesClassName);
processGenClass(genPath, realTablesPackage, realTablesClassName, tablesContent);
}
}
@ -323,7 +331,6 @@ public class MybatisFlexProcessor extends AbstractProcessor {
}
private void processGenClass(String genBasePath, String genPackageName, String className, String genContent) {
Writer writer = null;
try {

View File

@ -53,9 +53,9 @@ public class ContentBuilder {
/**
* 构建 TableDef 文件内容
*/
public static String buildTableDef(Table table, String entityClass, String entityClassName, boolean allInTables,
public static String buildTableDef(Table table, String entityClass, String entityClassName, boolean allInTablesEnable,
String tableDefPackage, String tableDefClassName,
String tablesNameStyle, String tablesDefSuffix,
String tableDefPropertiesNameStyle, String tableDefInstanceSuffix,
List<ColumnInfo> columnInfoList, List<String> defaultColumns) {
StringBuilder content = new StringBuilder("package ");
content.append(tableDefPackage).append(";\n\n");
@ -63,19 +63,19 @@ public class ContentBuilder {
content.append("import com.mybatisflex.core.table.TableDef;\n\n");
content.append("// Auto generate by mybatis-flex, do not modify it.\n");
content.append("public class ").append(tableDefClassName).append(" extends TableDef {\n\n");
if (!allInTables) {
if (!allInTablesEnable) {
String schema = !StrUtil.isBlank(table.schema())
? table.schema()
: "";
String tableName = !StrUtil.isBlank(table.value())
? table.value()
: StrUtil.firstCharToLowerCase(entityClassName);
content.append(" public static final ").append(tableDefClassName).append(' ').append(StrUtil.buildFieldName(entityClassName.concat(tablesDefSuffix != null ? tablesDefSuffix.trim() : ""), tablesNameStyle))
content.append(" public static final ").append(tableDefClassName).append(' ').append(StrUtil.buildFieldName(entityClassName.concat(tableDefInstanceSuffix != null ? tableDefInstanceSuffix.trim() : ""), tableDefPropertiesNameStyle))
.append(" = new ").append(tableDefClassName).append("(\"").append(schema).append("\", \"").append(tableName).append("\");\n\n");
}
columnInfoList.forEach((columnInfo) -> {
content.append(" public QueryColumn ")
.append(StrUtil.buildFieldName(columnInfo.getProperty(), tablesNameStyle))
.append(StrUtil.buildFieldName(columnInfo.getProperty(), tableDefPropertiesNameStyle))
.append(" = new QueryColumn(this, \"")
.append(columnInfo.getColumn()).append("\"");
if (columnInfo.getAlias() != null && columnInfo.getAlias().length > 0) {
@ -83,14 +83,14 @@ public class ContentBuilder {
}
content.append(");\n");
});
content.append(" public QueryColumn ").append(StrUtil.buildFieldName("allColumns", tablesNameStyle)).append(" = new QueryColumn(this, \"*\");\n");
content.append(" public QueryColumn ").append(StrUtil.buildFieldName("allColumns", tableDefPropertiesNameStyle)).append(" = new QueryColumn(this, \"*\");\n");
StringJoiner defaultColumnJoiner = new StringJoiner(", ");
columnInfoList.forEach((columnInfo) -> {
if (defaultColumns.contains(columnInfo.getColumn())) {
defaultColumnJoiner.add(StrUtil.buildFieldName(columnInfo.getProperty(), tablesNameStyle));
defaultColumnJoiner.add(StrUtil.buildFieldName(columnInfo.getProperty(), tableDefPropertiesNameStyle));
}
});
content.append(" public QueryColumn[] ").append(StrUtil.buildFieldName("defaultColumns", tablesNameStyle)).append(" = new QueryColumn[]{").append(defaultColumnJoiner).append("};\n\n");
content.append(" public QueryColumn[] ").append(StrUtil.buildFieldName("defaultColumns", tableDefPropertiesNameStyle)).append(" = new QueryColumn[]{").append(defaultColumnJoiner).append("};\n\n");
content.append(" public ").append(tableDefClassName).append("(String schema, String tableName) {\n")
.append(" super(schema, tableName);\n")
.append(" }\n\n}\n");
@ -116,9 +116,9 @@ public class ContentBuilder {
* 构建 Tables 文件常量属性
*/
public static void buildTablesField(StringBuilder importBuilder, StringBuilder fieldBuilder, Table table,
String entityClass, String entityClassName, String tablesNameStyle, String tablesDefSuffix) {
String entityClass, String entityClassName, String tableDefClassSuffix, String tableDefPropertiesNameStyle, String tableDefInstanceSuffix) {
String tableDefPackage = StrUtil.buildTableDefPackage(entityClass);
String tableDefClassName = entityClassName.concat("TableDef");
String tableDefClassName = entityClassName.concat(tableDefClassSuffix);
importBuilder.append("import ").append(tableDefPackage).append('.').append(tableDefClassName).append(";\n");
String schema = !StrUtil.isBlank(table.schema())
? table.schema()
@ -127,7 +127,7 @@ public class ContentBuilder {
? table.value()
: StrUtil.firstCharToLowerCase(entityClassName);
fieldBuilder.append(" public static final ").append(tableDefClassName).append(' ')
.append(StrUtil.buildFieldName(entityClassName.concat(tablesDefSuffix != null ? tablesDefSuffix.trim() : ""), tablesNameStyle))
.append(StrUtil.buildFieldName(entityClassName.concat(tableDefInstanceSuffix != null ? tableDefInstanceSuffix.trim() : ""), tableDefPropertiesNameStyle))
.append(" = new ").append(tableDefClassName).append("(\"").append(schema).append("\", \"").append(tableName).append("\");\n");
}

View File

@ -34,50 +34,59 @@ public enum ConfigurationKey {
*/
GEN_PATH("processor.genPath", ""),
/**
* 自定义 Tables 生成的包名
*/
TABLES_PACKAGE("processor.tablesPackage", null),
/**
* 自定义 Mapper 的父类
*/
BASE_MAPPER_CLASS("processor.baseMapperClass", "com.mybatisflex.core.BaseMapper"),
/**
* 开启 Mapper 自动生成
*/
MAPPERS_GENERATE_ENABLE("processor.mappersGenerateEnable", "false"),
/**
* 自定义 Mapper 生成的包名
*/
MAPPERS_PACKAGE("processor.mappersPackage", null),
/**
* 是否所有的类都生成在 Tables 类里
*/
ALL_IN_TABLES("processor.allInTables", "false"),
ALL_IN_TABLES_ENABLE("processor.allInTables.enable", "false"),
/**
* Tables 类名
*/
TABLES_CLASS_NAME("processor.tablesClassName", "Tables"),
ALL_IN_TABLES_CLASS_NAME("processor.allInTables.className", "Tables"),
/**
* 生成辅助类的字段风格
* 自定义 Tables 生成的包名
*/
TABLE_NAME_STYLE("processor.tablesNameStyle", "upperCase"),
ALL_IN_TABLES_PACKAGE("processor.allInTables.package", null),
/**
* 开启 Mapper 自动生成
*/
MAPPER_GENERATE_ENABLE("processor.mapper.generateEnable", "false"),
/**
* 自定义 Mapper 的父类
*/
MAPPER_BASE_CLASS("processor.mapper.baseClass", "com.mybatisflex.core.BaseMapper"),
/**
* 自定义 Mapper 生成的包名
*/
MAPPER_PACKAGE("processor.mapper.package", null),
/**
* 生成的 Class 的后缀
*/
TABLE_DEF_CLASS_SUFFIX("processor.tableDef.classSuffix", "TableDef"),
/**
* 生成的表对应的变量后缀
*/
TABLES_DEF_SUFFIX("processor.tablesDefSuffix", ""),
TABLE_DEF_INSTANCE_SUFFIX("processor.tableDef.instanceSuffix", ""),
/**
* 生成辅助类的字段风格
*/
TABLE_DEF_PROPERTIES_NAME_STYLE("processor.tableDef.propertiesNameStyle", "upperCase"),
/**
* 过滤 Entity 后缀
*/
IGNORE_SUFFIXES("processor.entity.ignoreSuffixes", "");
TABLE_DEF_IGNORE_ENTITY_SUFFIXES("processor.tableDef.ignoreEntitySuffixes", "");
private final String configKey;
private final String defaultValue;

View File

@ -75,12 +75,12 @@ public class StrUtil {
return str;
}
public static String buildFieldName(String name, String style) {
if ("upperCase".equalsIgnoreCase(style)) {
public static String buildFieldName(String name, String tableDefPropertiesNameStyle) {
if ("upperCase".equalsIgnoreCase(tableDefPropertiesNameStyle)) {
return camelToUnderline(name).toUpperCase();
} else if ("lowerCase".equalsIgnoreCase(style)) {
} else if ("lowerCase".equalsIgnoreCase(tableDefPropertiesNameStyle)) {
return camelToUnderline(name).toLowerCase();
} else if ("upperCamelCase".equalsIgnoreCase(style)) {
} else if ("upperCamelCase".equalsIgnoreCase(tableDefPropertiesNameStyle)) {
return firstCharToUpperCase(name);
} else {
//lowerCamelCase

View File

@ -1,5 +1,5 @@
processor.mappersGenerateEnable=true
processor.entity.ignoreSuffixes=Entity
#processor.allInTables=true
processor.baseMapperClass=com.mybatisflex.test.mapper.MyBaseMapper
processor.mapper.generateEnable=true
processor.tableDef.ignoreEntitySuffixes=Entity
#processor.allInTables.enable=true
processor.mapper.baseClass=com.mybatisflex.test.mapper.MyBaseMapper

View File

@ -1,2 +1,2 @@
processor.mappersGenerateEnable=true
processor.mapper.generateEnable=true

View File

@ -1,2 +1,2 @@
processor.mappersGenerateEnable = false
processor.allInTables = true
processor.mapper.generateEnable = false
processor.allInTables.enable = true