# 扩展
# 自定义模板
生成器提供了一个示例项目,包含了自定义模板,你可以运行示例项目了解如何扩展:
示例 | 描述 |
---|---|
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}