From 34a82dda4cb55aa1a7b6e8ce9d5b94e27f29fe94 Mon Sep 17 00:00:00 2001 From: Michael Yang Date: Tue, 30 Jan 2024 16:31:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=99=A8=E6=B7=BB=E5=8A=A0=E7=94=9F=E6=88=90=20BaseEntity=20?= =?UTF-8?q?=E7=9A=84=E6=94=AF=E6=8C=81=20close=20#I7JH7K?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../codegen/config/EntityConfig.java | 44 +++++++++ .../generator/impl/EntityGenerator.java | 93 ++++++++++++++++++- .../main/resources/templates/enjoy/entity.tpl | 3 +- .../templates/enjoy/entityWithBase.tpl | 6 ++ .../mybatisflex/codegen/test/BaseEntity.java | 18 ++-- .../codegen/test/WithBaseGeneratorTest.java | 92 ++++++++++++++++++ 6 files changed, 240 insertions(+), 16 deletions(-) create mode 100644 mybatis-flex-codegen/src/main/resources/templates/enjoy/entityWithBase.tpl create mode 100644 mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/WithBaseGeneratorTest.java diff --git a/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/config/EntityConfig.java b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/config/EntityConfig.java index 3da5760e..076c7fea 100644 --- a/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/config/EntityConfig.java +++ b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/config/EntityConfig.java @@ -87,6 +87,25 @@ public class EntityConfig implements Serializable { */ private int jdkVersion; + + /** + * 当开启这个配置后,Entity 会生成两个类,比如 Account 表会生成 Account.java 以及 AccountBase.java + * 这样的好处是,自动生成的 getter setter 字段等都在 Base 类里,而开发者可以在 Account.java 中添加自己的业务代码 + * 此时,再次生成代码时,不会覆盖掉 Account.java 中的业务代码 + */ + private boolean withBaseClassEnable = false; + + /** + * Base 类的后缀 + */ + private String withBaseClassSuffix = "Base"; + + /** + * Base 类所在的包,默认情况下是在 entity 包下,添加一个 base 文件夹。 + */ + private String withBasePackage; + + public String getSourceDir() { return sourceDir; } @@ -262,6 +281,31 @@ public class EntityConfig implements Serializable { return this; } + public boolean isWithBaseClassEnable() { + return withBaseClassEnable; + } + + public void setWithBaseClassEnable(boolean withBaseClassEnable) { + this.withBaseClassEnable = withBaseClassEnable; + } + + public String getWithBaseClassSuffix() { + return withBaseClassSuffix; + } + + public void setWithBaseClassSuffix(String withBaseClassSuffix) { + this.withBaseClassSuffix = withBaseClassSuffix; + } + + + public String getWithBasePackage() { + return withBasePackage; + } + + public void setWithBasePackage(String withBasePackage) { + this.withBasePackage = withBasePackage; + } + public enum SwaggerVersion { FOX("FOX"), diff --git a/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/generator/impl/EntityGenerator.java b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/generator/impl/EntityGenerator.java index 9a165c91..27cc8adf 100644 --- a/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/generator/impl/EntityGenerator.java +++ b/mybatis-flex-codegen/src/main/java/com/mybatisflex/codegen/generator/impl/EntityGenerator.java @@ -37,6 +37,9 @@ public class EntityGenerator implements IGenerator { private String templatePath; + private String entityWithBaseTemplatePath = "/templates/enjoy/entityWithBase.tpl"; + + public EntityGenerator() { this(TemplateConst.ENTITY); } @@ -52,15 +55,26 @@ public class EntityGenerator implements IGenerator { return; } + //生成 entity 类 + genEntityClass(table, globalConfig); + + //生成 base 类 + genBaseClass(table, globalConfig); + + } + + + private void genEntityClass(Table table, GlobalConfig globalConfig) { PackageConfig packageConfig = globalConfig.getPackageConfig(); EntityConfig entityConfig = globalConfig.getEntityConfig(); + String sourceDir = StringUtil.isNotBlank(entityConfig.getSourceDir()) ? entityConfig.getSourceDir() : packageConfig.getSourceDir(); String entityPackagePath = packageConfig.getEntityPackage().replace(".", "/"); - File entityJavaFile = new File(sourceDir, entityPackagePath + "/" + - table.buildEntityClassName() + ".java"); + String entityClassName = table.buildEntityClassName(); + File entityJavaFile = new File(sourceDir, entityPackagePath + "/" + entityClassName + ".java"); if (entityJavaFile.exists() && !entityConfig.isOverwriteEnable()) { return; @@ -70,15 +84,84 @@ public class EntityGenerator implements IGenerator { table.getColumns().removeIf(column -> globalConfig.getStrategyConfig().getIgnoreColumns().contains(column.getName().toLowerCase())); } - Map params = new HashMap<>(4); + Map params = new HashMap<>(6); params.put("table", table); + params.put("entityPackageName", packageConfig.getEntityPackage()); + params.put("entityConfig", entityConfig); + params.put("entityClassName", table.buildEntityClassName()); + params.put("packageConfig", packageConfig); + params.put("javadocConfig", globalConfig.getJavadocConfig()); + + params.putAll(globalConfig.getCustomConfig()); + + String templatePath = this.templatePath; + + //开启生成 baseClass + if (entityConfig.isWithBaseClassEnable()) { + templatePath = this.entityWithBaseTemplatePath; + + String baseClassName = table.buildEntityClassName() + entityConfig.getWithBaseClassSuffix(); + params.put("baseClassName", baseClassName); + + String baseClassPackage = StringUtil.isNotBlank(entityConfig.getWithBasePackage()) + ? entityConfig.getWithBasePackage() : packageConfig.getEntityPackage() + ".base"; + params.put("baseClassPackage", baseClassPackage); + + params.put("entityClassName", table.buildEntityClassName()); + } + + + globalConfig.getTemplateConfig().getTemplate().generate(params, templatePath, entityJavaFile); + + System.out.println("Entity ---> " + entityJavaFile); + } + + private void genBaseClass(Table table, GlobalConfig globalConfig) { + PackageConfig packageConfig = globalConfig.getPackageConfig(); + EntityConfig entityConfig = globalConfig.getEntityConfig(); + + //不需要生成 baseClass + if (!entityConfig.isWithBaseClassEnable()) { + return; + } + + String sourceDir = StringUtil.isNotBlank(entityConfig.getSourceDir()) ? entityConfig.getSourceDir() : packageConfig.getSourceDir(); + + String baseEntityPackagePath = packageConfig.getEntityPackage().replace(".", "/"); + baseEntityPackagePath = StringUtil.isNotBlank(entityConfig.getWithBasePackage()) ? entityConfig.getWithBasePackage().replace(".", "") + : baseEntityPackagePath + "/base"; + + String baseEntityClassName = table.buildEntityClassName() + entityConfig.getWithBaseClassSuffix(); + + File baseEntityJavaFile = new File(sourceDir, baseEntityPackagePath + "/" + baseEntityClassName + ".java"); + + + //排除忽略列 + if (globalConfig.getStrategyConfig().getIgnoreColumns() != null) { + table.getColumns().removeIf(column -> globalConfig.getStrategyConfig().getIgnoreColumns().contains(column.getName().toLowerCase())); + } + + Map params = new HashMap<>(6); + params.put("table", table); + params.put("entityPackageName", baseEntityPackagePath.replace("/", ".")); + params.put("entityClassName", baseEntityClassName); params.put("entityConfig", entityConfig); params.put("packageConfig", packageConfig); params.put("javadocConfig", globalConfig.getJavadocConfig()); params.putAll(globalConfig.getCustomConfig()); - globalConfig.getTemplateConfig().getTemplate().generate(params, templatePath, entityJavaFile); - System.out.println("Entity ---> " + entityJavaFile); + globalConfig.getTemplateConfig().getTemplate().generate(params, templatePath, baseEntityJavaFile); + + System.out.println("Entity ---> " + baseEntityJavaFile); + } + + + public String getEntityWithBaseTemplatePath() { + return entityWithBaseTemplatePath; + } + + public void setEntityWithBaseTemplatePath(String entityWithBaseTemplatePath) { + this.entityWithBaseTemplatePath = entityWithBaseTemplatePath; } @Override diff --git a/mybatis-flex-codegen/src/main/resources/templates/enjoy/entity.tpl b/mybatis-flex-codegen/src/main/resources/templates/enjoy/entity.tpl index 7689bbe9..95190ee8 100644 --- a/mybatis-flex-codegen/src/main/resources/templates/enjoy/entity.tpl +++ b/mybatis-flex-codegen/src/main/resources/templates/enjoy/entity.tpl @@ -3,8 +3,7 @@ #set(swaggerVersion = entityConfig.getSwaggerVersion()) #set(withActiveRecord = entityConfig.isWithActiveRecord()) #set(jdkVersion = entityConfig.getJdkVersion()) -#set(entityClassName = table.buildEntityClassName()) -package #(packageConfig.entityPackage); +package #(entityPackageName); #for(importClass : table.buildImports()) import #(importClass); diff --git a/mybatis-flex-codegen/src/main/resources/templates/enjoy/entityWithBase.tpl b/mybatis-flex-codegen/src/main/resources/templates/enjoy/entityWithBase.tpl new file mode 100644 index 00000000..2abe318d --- /dev/null +++ b/mybatis-flex-codegen/src/main/resources/templates/enjoy/entityWithBase.tpl @@ -0,0 +1,6 @@ +package #(entityPackageName); + +import #(baseClassPackage).#(baseClassName); + +public class #(entityClassName) extends #(baseClassName) { +} diff --git a/mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/BaseEntity.java b/mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/BaseEntity.java index 1863ec20..92423984 100644 --- a/mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/BaseEntity.java +++ b/mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/BaseEntity.java @@ -20,14 +20,14 @@ import java.util.Date; public class BaseEntity { - private Date createTime; - - public Date getCreateTime() { - return createTime; - } - - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } +// private Date createTime; +// +// public Date getCreateTime() { +// return createTime; +// } +// +// public void setCreateTime(Date createTime) { +// this.createTime = createTime; +// } } diff --git a/mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/WithBaseGeneratorTest.java b/mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/WithBaseGeneratorTest.java new file mode 100644 index 00000000..c4bccf7a --- /dev/null +++ b/mybatis-flex-codegen/src/test/java/com/mybatisflex/codegen/test/WithBaseGeneratorTest.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.mybatisflex.codegen.test; + +import com.mybatisflex.codegen.Generator; +import com.mybatisflex.codegen.config.ColumnConfig; +import com.mybatisflex.codegen.config.GlobalConfig; +import com.mybatisflex.codegen.config.TableConfig; +import com.mybatisflex.codegen.config.TableDefConfig; +import com.mybatisflex.codegen.constant.TemplateConst; +import com.zaxxer.hikari.HikariDataSource; +import org.junit.Test; + +import java.util.function.UnaryOperator; + +public class WithBaseGeneratorTest { + + + @Test + public void testCodeGen1() { + //配置数据源 + HikariDataSource dataSource = new HikariDataSource(); + dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/flex_test?characterEncoding=utf-8"); + dataSource.setUsername("root"); + dataSource.setPassword("123456"); + + GlobalConfig globalConfig = new GlobalConfig(); + + //用户信息表,用于存放用户信息。 -> 用户信息 + UnaryOperator tableFormat = (e) -> e.split(",")[0].replace("表", ""); + + //设置注解生成配置 + globalConfig.setAuthor("Michael Yang"); + globalConfig.setTableCommentFormat(tableFormat); + + //设置生成文件目录和根包 + globalConfig.setSourceDir(System.getProperty("user.dir") + "/src/test/java"); + globalConfig.setMapperXmlPath(System.getProperty("user.dir") + "/src/test/java/resources/mapper"); + globalConfig.setBasePackage("com.test"); + + //设置表前缀和只生成哪些表 + globalConfig.setTablePrefix("sys_", "tb_"); +// globalConfig.setGenerateTable("sys_user","tb_account"); +// globalConfig.setGenerateTable("tb_account"); + + //设置模板路径 +// globalConfig.setEntityTemplatePath("D:\\Documents\\配置文件\\entity.tpl"); + + //配置生成 entity + globalConfig.setEntityGenerateEnable(true); +// globalConfig.getEntityConfig().setWithBaseClassEnable(true); +// globalConfig.setEntityWithLombok(true); + globalConfig.setEntitySuperClass(BaseEntity.class); + + //配置生成 mapper + globalConfig.setMapperGenerateEnable(true); + //配置生成 service + globalConfig.setServiceGenerateEnable(true); + //配置生成 serviceImpl + globalConfig.setServiceImplGenerateEnable(true); + //配置生成 controller + globalConfig.setControllerGenerateEnable(true); + //配置生成 tableDef +// globalConfig.setTableDefGenerateEnable(true); +// //配置生成 mapperXml +// globalConfig.setMapperXmlGenerateEnable(true); +// //配置生成 package-info.java +// globalConfig.setPackageInfoGenerateEnable(true); + + //通过 datasource 和 globalConfig 创建代码生成器 + Generator generator = new Generator(dataSource, globalConfig); + + //开始生成代码 + generator.generate(); + } + + +}