注意:本教程使用的数据库脚本、数据模型和环境信息请参考 “MyBatis Plus环境准备” 章节,点击下载示例源码。
上一章节介绍了自定义代码生成器模板,本章节将介绍怎样自定义属性,且将该属性注入到模板中,在模板中可以使用 ${} 方法进行使用。注入自定义属性简单简略代码如下:
(1)继承 InjectionConfig 抽象类,重写 initMap 方法,创建一个 Map<String,Object> 对象作为参数调用 setMap 方法。代码如下:
// 配置自定义属性注入
InjectionConfig injectionConfig = new InjectionConfig() {
// 自定义属性注入,向自定义的模板中注入 my_field 属性
// 通过 ${cfg.my_field} 获取属性之
@Override
public void initMap() {
Map<String, Object> map = new HashMap<>();
map.put("my_field", "你好!这是我自己注入的属性哦");
this.setMap(map);
}
};
mpg.setCfg(injectionConfig);(2)在自定义的模板中使用 ${cfg.my_field} 方式进行引用。代码如下:
package ${package.Entity};
/**
* 自定义模板 - ${cfg.my_field}
* @author ${author}
* @since ${date}
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class ${entity} implements Serializable {
private static final long serialVersionUID = 1L;
<#-- ---------- BEGIN 字段循环遍历 ---------->
<#list table.fields as field>
private ${field.propertyType} ${field.propertyName};
</#list>
<#------------ END 字段循环遍历 ---------->
}(1)自定义模板 entity3.java.ftl 内容如下:
package ${package.Entity};
/**
* 自定义模板 - ${cfg.my_field}
* @author ${author}
* @since ${date}
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class ${entity} implements Serializable {
private static final long serialVersionUID = 1L;
<#-- ---------- BEGIN 字段循环遍历 ---------->
<#list table.fields as field>
private ${field.propertyType} ${field.propertyName};
</#list>
<#------------ END 字段循环遍历 ---------->
}该模板位于 templates/entity3.java.ftl 处。
(2)客户端代码如下:
package com.hxstrive.mybatis_plus.generator.demo3;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.HashMap;
import java.util.Map;
/**
* 自定义模板可以参考 MyBatis Plus 内置模板,位置:
* mybatis-plus-generator-3.4.0.jar 文件的 templates 目录下面
*/
public class MysqlGenerator {
public static void main(String[] args) {
String userDir = System.getProperty("user.dir");
System.out.println("userDir=" + userDir);
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/mybatis-plus-learn/src/main/java");
gc.setAuthor("hxstrive"); // 作者名称
gc.setBaseResultMap(true); // mapper.xml 生成 ResultMap
gc.setBaseColumnList(true); // mapper.xml 生成 ColumnList
gc.setOpen(false);
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_test?useSSL=false");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("aaaaaa");
mpg.setDataSource(dsc);
// 配置自定义属性注入
InjectionConfig injectionConfig = new InjectionConfig() {
// 自定义属性注入,向自定义的模板中注入 my_field 属性
// 通过 ${cfg.my_field} 获取属性之
@Override
public void initMap() {
Map<String, Object> map = new HashMap<>();
map.put("my_field", "你好!这是我自己注入的属性哦");
this.setMap(map);
}
};
mpg.setCfg(injectionConfig);
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.hxstrive.mybatis_plus.auto");
mpg.setPackageInfo(pc);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
templateConfig.setEntity("templates/entity3.java");
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
strategy.setInclude("user");
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}上面代码中,我们将自定义的 “my_field=你好!这是我自己注入的属性哦” 键值对注入到自定义模板,在模板中可以通过 ${cfg.my_field} 方式引用自定义的属性。成功运行客户端代码后,User.java 效果代码如下:
package com.hxstrive.mybatis_plus.auto.entity;
/**
* 自定义模板 - 你好!这是我自己注入的属性哦
* @author hxstrive
* @since 2020-09-27
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Integer userId;
private String name;
private String sex;
private Integer age;
private Blob face;
private Double salary;
private LocalDate borthday;
}