# 扩展

# 自定义模板

生成器提供了一个示例项目,包含了自定义模板,你可以运行示例项目了解如何扩展:

示例 描述
code-generator-samples (opens new window) 1. 生成器扩展示例
2. 含自定义模板 MybatisPlus/Swagger/Lombok 等样式的代码生成

# 示例表 sample_order 建表 SQL

CREATE TABLE `sample_order` (
  `id` int(32) NOT NULL DEFAULT '0' COMMENT 'id',
  `order_no` varchar(32) NOT NULL DEFAULT '' COMMENT '订单号',
  `user_id` varchar(32) DEFAULT NULL COMMENT '用户ID',
  `gmt_create` timestamp NULL DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单表';

# 打印生成对象信息

可将生成器中的对象信息打印出来,可根据输出信息制作自定义模板

public class SimpleDemo {
   public static void main(String[] args) {
        // 打印生成对象信息  可根据日志编写模板 模板使用 freemarker 编写, 使用 freemarker 语法 取值、循环、判断即可
        LogUtils.setLogService(object -> {
            try {
                System.out.println("生成元信息:\n" + new ObjectMapper().writeValueAsString(object));
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        });
        Generator generator = new GeneratorBuilder().build("config.properties");
        generator.generate();
    }
}

# 部分对象信息示例

{
	"classCommentInfo": {
		"sinceVersion": "1.0",
		"version": "1.0",
		"author": "TODO",
		"createTime": "2020-07-12 20:24:58",
		"tableComment": "TODO"
	},
	"javaClassDefinition": {
		"MODEL": {
			"fullPackage": "com.github.generator.template.model",
			"className": "SampleOrder"
		},
		"MAPPER": {
			"fullPackage": "com.github.generator.template.mapper",
			"className": "SampleOrderMapper"
		}
	},
	"tableInfo": {
		"tableSchema": "github_demo",
		"tableName": "sample_order",
		"tableComment": "订单表",
		"tableNameCamelCase": "SampleOrder",
		"importPackages": [
			"java.time.LocalDateTime"
		],
		"columnLists": [
			{
				"columnName": "id",
				"dataType": "int",
				"columnComment": "id",
				"primaryKey": true,
				"javaColumnName": "id",
				"javaDataType": "Integer",
				"javaDataTypeFullPath": null
			},
			{
				"columnName": "order_no",
				"dataType": "varchar",
				"columnComment": "订单号",
				"primaryKey": true,
				"javaColumnName": "orderNo",
				"javaDataType": "String",
				"javaDataTypeFullPath": null
			}
		]
	}
}

# 自定义 Freemarker 模板

以自定义的 Lombok Model 简单示例,简单的取值语法即可自定义模板,如需复杂语法参考 Freemarker 官网 (opens new window)code-generator-samples (opens new window) 示例中的扩展模板

package ${javaClassDefinition.MODEL.fullPackage};

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

/**
 * table	: ${tableInfo.tableName} <br/>
 * description : ${tableInfo.tableComment} <br/>
 */
@Data
public class ${javaClassDefinition.MODEL.className} implements Serializable {
    private static final long serialVersionUID=1L;

<#list tableInfo.columnLists as colm>
	<#if colm??>
	private ${colm.javaDataType} ${colm.javaColumnName};
	</#if>
</#list>
}

完整示例参考 code-generator-samples (opens new window)

# 替换生成器默认模板

以 Mysql 为例,自定义 ORM 模板:

public class MybatisPlusGenerator {
    public static void main(String[] args) {
        String outputPath = "/src/main/java/";
        /** 库名  */
        String database = "你的数据库名";
      	/** 数据库链接 */
        String databaseUrl = "localhost:3306";
        /** 数据库用户名  */
        String dbUserName = "你的数据库用户名";
        /** 数据库密码  */
        String dbPassword = "你的数据库密码";
        /** 要生成的表名 多个可用英文逗号隔开 */
        String tableName = "sample_order";
        /** 生成类所在的基础包路径 */
        String basePackage = "com.github.generator.mybatis.plus";
        /** 生成的代码注释 作者 [非必须]*/
        String author = "author";
        Generator generator = new GeneratorBuilder()
                .properties("db.url=jdbc:mysql://"+databaseUrl+"/"+database+"?useUnicode=true&characterEncoding=utf-8" +
                                "&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false" +
                                "&serverTimezone=Asia/Shanghai",
                        "db.table-schema="+database)
                .properties("generate.table-names=" + tableName)
                .properties("db.username=" + dbUserName)
                .properties("db.password=" + dbPassword)
                .properties("generate.java.comment.author=" + author)
          			 // 替换系统默认模板
                .replaceDefaultTemplate(ModuleTypeEnums.MODEL,"/template/LombokModel.ftl")
                .replaceDefaultTemplate(ModuleTypeEnums.XML,"/template/mysql_xml.ftl")
                .build("config.properties");
        generator.generate();
    }
}

完整示例参考 code-generator-samples (opens new window)

# 新增自定义模板

public class MybatisPlusGenerator {

    public static void main(String[] args) {
        String outputPath = "/src/main/java/";
        /** 库名  */
        String database = "你的数据库名";
      	/** 数据库链接 */
        String databaseUrl = "localhost:3306";
        /** 数据库用户名  */
        String dbUserName = "你的数据库用户名";
        /** 数据库密码  */
        String dbPassword = "你的数据库密码";
        /** 要生成的表名 多个可用英文逗号隔开 */
        String tableName = "sample_order";
        /** 生成类所在的基础包路径 */
        String basePackage = "com.github.generator.mybatis.plus";
        /** 生成的代码注释 作者 [非必须]*/
        String author = "author";
        Generator generator = new GeneratorBuilder()
                .properties("db.url=jdbc:mysql://"+databaseUrl+"/"+database+"?useUnicode=true&characterEncoding=utf-8" +
                                "&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false" +
                                "&serverTimezone=Asia/Shanghai",
                        "db.table-schema="+database)
                .properties("generate.table-names=" + tableName)
                .properties("db.username=" + dbUserName)
                .properties("db.password=" + dbPassword)
                .properties("generate.java.comment.author=" + author)
                .addJavaTemplate(new JavaModuleInfo("vo",
                        "/template/LombokSwaggerVO.ftl",
                        basePackage + ".vo",
                        outputPath,
                        "{0}VO"))
                .build("config.properties");
        generator.generate();
    }
}

完整示例参考 code-generator-samples (opens new window)

# 新增或修改数据库类型和 Java 类型映射

如果默认映射不满足我们的需求,可以通过修改数据库类型映射来扩展

例如数据库类型为 NUMBER,生成器默认映射为 Integer,如果想映射为 String ,设置如下:

new GeneratorBuilder()
  .fieldType2JavaType("NUMBER", String.class)
  .build("config.properties");

如果出现类似如下提示

该版本暂未内置数据库[bit]类型和 Java 类型的映射关系!

也可以通过此方法自定义所需的映射关系,例如将 bit 类型映射为实体对象中的 String 类型:

new GeneratorBuilder()
  .fieldType2JavaType("bit", String.class)
  .build("config.properties");

# 新增或修改数据库类型和 Mybatis JdbcType 映射

Mybatis XML JdbcType 示例:

	<insert id="insert" parameterType="online.zhuo.Demo">
        INSERT INTO demo (
            <trim suffixOverrides=",">
                <if test="id != null">id,</if> 
                <if test="name != null">name,</if>
            </trim>
        ) VALUES (
            <trim suffixOverrides=",">
                <if test="id != null">#{id,jdbcType=INTEGER},</if>
                <if test="name != null">#{name,jdbcType=VARCHAR},</if>
            </trim>
        )
	</insert>

如果默认映射不满足我们的需求,可以通过修改数据库类型映射来扩展

例如数据库类型为 INT,生成器默认映射为 JdbcType.INTEGER,如果想映射为 JdbcType.NUMERIC ,设置如下:

new GeneratorBuilder()
  .fieldType2JdbcType("INT", JdbcType.NUMERIC)
  .build("config.properties");

如果出现类似如下提示

该版本暂未内置数据库[bit]类型和 Mybatis XML 中 JdbcType 的映射关系!

也可以通过此方法自定义所需的映射关系 例如将 bit 类型映射为 Mybatis XML 中的 JdbcType.NUMERIC 类型:

new GeneratorBuilder()
  .fieldType2JdbcType("bit", JdbcType.NUMERIC)
  .build("config.properties");

# 自定义模块名

public class CodeGeneratorCustomizeSample {
    public static void main(String[] args) {
      	// 以 sample_order 表为例,默认生成的 Mapper 为 SampleOrderMapper
        // 此处更改生成名字为 OrderDao
        Generator generator = new GeneratorBuilder()
                // 自定义模块生成文件名称  传入 ModuleEnums 即模块类型
                // 自定义模块名称优先级高于 配置文件中配置的模块名称格式化
                .addModuleNameFormat(ModuleEnums.MAPPER, name ->
                        getRealName(name))
                .build("config.properties");
        generator.generate();
    }
    private static String getRealName(String name) {
      	// 该方法为下划线转驼峰
        return GeneratorStringUtils.changeTableName2CamelFirstUpper(name, "_")
                .replaceAll("Sample", "") + "Dao";
    }
}

完整示例参考 code-generator-samples (opens new window)

# 自定义方法名

public class CodeGeneratorCustomizeSample {
    public static void main(String[] args) {
        Generator generator = new GeneratorBuilder()
                // 自定义方法名格式化 传入 MethodEnums.ALL_METHOD ,则适用所有方法名格式
                .addMethodNameFormat(MethodEnums.ALL_METHOD, name -> {
                    return getRealName(name);
                })
                // 如果单独指定了某方法名格式化,则该方法名以单独指定的格式化方式处理
                .addMethodNameFormat(MethodEnums.COUNT_BY_WHERE, name -> "countByWhere")
                .build("config.properties");
        generator.generate();
    }
    private static String getRealName(String name) {
        // 该方法为下划线转驼峰
        return GeneratorStringUtils.changeTableName2CamelFirstUpper(name, "_")
                .replaceAll("Sample", "");
    }
}

完整示例参考 code-generator-samples (opens new window)

# 配置文件使用自定义属性

如果有公共的属性,可以设置自定义属性,用 #{属性名} 获取自定义属性,避免修改的时候多处修改

例如自定义公共包名 basePackage

############ 自定义属性 start ###########
# 支持自定义属性  并使用 #{属性名} 获取
basePackage=com.github.zhuyizhuo.management
############ 自定义属性 end ###########

# MAPPER 包名 如下配置 MAPPER 所在包路径为 com.github.zhuyizhuo.management.mapper
generate.java.module.mapper.package=#{basePackage}.mapper
# 实体类包名 如下配置 实体类所在包路径为 com.github.zhuyizhuo.management.model
generate.java.module.model.package=#{basePackage}.model

# 配置文件使用系统变量 环境变量

可以通过 #{变量名} 获取系统变量,环境变量,例如

# 生成文件输出公共路径,缺省配置为系统变量 user.dir 路径下
generate.base.out-put-path=#{user.dir}