MybatisPlus代码生成器的flt模板文件改造计划

MybatisPlus提供了一系列强大的拓展功能,在代码生成这块,更是可以利用freemarket制作出各种不同的模板,由于之前的模板是用的类似MP原始提供模板,仍然有很多地方不尽如,在配置某些自己工具类以及基础模块的时候,显得尤为僵硬和死板,因此开始了对其进行改造。

我们知道freemarket可以通过#{xxx},${xxxx}渲染对象变量的值. 正如下图所示,我们知道前面通常是项目的名字以及一些公司前缀,这些通常在一个很大项目中都是固定的,每次需要添加新的需求的时候,都可以利用代码生成器根据模板快速生成对应的基础服务.
MybatisPlus代码生成器的flt模板文件改造计划_第1张图片

既然有如此多的重复值,我们应该利用一些变量值.通过查阅官方生成器配置,可以看到com.baomidou.mybatisplus.generator.config.PackageConfig
MybatisPlus代码生成器的flt模板文件改造计划_第2张图片
我们有一些基础的变量信息是可以在这里配置的,对应的flt模板文件中是这样渲染的
MybatisPlus代码生成器的flt模板文件改造计划_第3张图片
**${package.Entity}**就是上面的Entity包名:“entity”.可是很明显,PackageConfig里面的字段太少太少,并不能满足我们的需求,因此,我们需要利用java的继承,对其进行拓展,那应该如何下手呢. 首先我们需要找到该模板引擎所渲染的字段最后到底是出自哪里的.

我们可以看到官方提供的代码生成器中,最后会通过 com.baomidou.mybatisplus.generator.AutoGenerator 中的execute方法,把我们设置的 pcakageConfig , GlobalConfig , DataSourceConfig , TemplateConfig等等我们配置好的模板信息一起set入通过execute()方法把参数带过去进行渲染.点开execute()方法可以看到我们之前 重点关注的 PackageConfig就在这里进行了传入 .
MybatisPlus代码生成器的flt模板文件改造计划_第4张图片
跟着走进去后,可以看到ConfigBuilder的构造函数,在红框圈住的这里把我们传入的包配置,调用了一个handlePackage的函数
MybatisPlus代码生成器的flt模板文件改造计划_第5张图片
接着跟入handlePackage( )函数中,可以看到这个packageInfo里mp的默认实现只是把红框中固定的几个参数传入,是写死的,并没有给我扩展字段的机会
在这里插入图片描述
MybatisPlus代码生成器的flt模板文件改造计划_第6张图片
而且仔细看,该方法和变量都是private的,符合“编译期可知,运行期不可变”这个要求的方法我们都是无法进行修改的。而且你通过继承ConfigBuilder会发现很多变量你不得不改写很多方法,改动很大,这个方案放弃了。

另一个方案,再次查看execute( )方法,发现config的信息注入模板是在templateEngin调用init方法的时候进行的,那我们是不是只要在init方法执行前把ConfigBuilder 中的 packageInfo(上文说的那个HashMap,与图中的packageInfo不是同一个对象!!)里面添加新的kv键值对就好了呢!

而且由于java是引用传递,利用这个特点,我们可以在execute先获取packageInfo的map,通过put操作,设置新的字段值,就可以达到修改了其他引用了该map的变量的内。
MybatisPlus代码生成器的flt模板文件改造计划_第7张图片
说干就干,首先通过继承AutoGenerator,选择重写public的execute方法,
具体操作如下:

  1. 先继承PackageConfig,给原来的包增加一些Custom字段
@Data
public class MyBatisPlusGeneratorPackageConfig extends PackageConfig {

    /**自定义字段设置项目名称*/
    private String customPackage;

}
  1. 接着继承AutoGenerator,重写他的public execute( )方法
public class MybatisPlusAutoGeneratorExecuteEx extends AutoGenerator {
	@Override
    public void execute() {
            logger.debug("==========================准备生成文件...==========================");
            // 初始化配置
            if (null == config) {
            //这一块传入进去的是PackageConfig的子类,所以需要强制转换
                MyBatisPlusGeneratorPackageConfig info = (MyBatisPlusGeneratorPackageConfig)super.getPackageInfo();
                config = new ConfigBuilder(info,super.getDataSource(), super.getStrategy(),super.getTemplate(), super.getGlobalConfig());
                Map<String, String> packageInfo = config.getPackageInfo();
                packageInfo.put("CustomPackage",info.getCustomPackage());
                if (null != injectionConfig) {
                    injectionConfig.setConfig(config);
                }
            }
            AbstractTemplateEngine templateEngine = super.getTemplateEngine();
            if (null == templateEngine) {
                // 为了兼容之前逻辑,采用 Velocity 引擎 【 默认 】
                templateEngine = new VelocityTemplateEngine();
            }
            // 模板引擎初始化执行文件输出
            templateEngine.init(this.pretreatmentConfigBuilder(config)).mkdirs().batchOutput().open();
            logger.debug("==========================文件生成完成!!!==========================");
    }
}
  1. 修改Generator文件,把我们自己拓展的包代替原先的PackageConfig
            MyBatisPlusGeneratorPackageConfig pc = new MyBatisPlusGeneratorPackageConfig();
            pc.setCustomPackage("com.example.pro");
  1. 最后模板引擎添加渲染自己的自定义字段
import ${package.CustomPackage}.constants.Constants;
import ${package.CustomPackage}.enums.StatusEnum;

断点可以看到实际的效果以及set进去了
MybatisPlus代码生成器的flt模板文件改造计划_第8张图片
模板中的包名也如期的出现了
在这里插入图片描述

你可能感兴趣的:(java,java,mybatis,数据库)