逆向工程
1.针对 mybatis-plus 的逆向工程
本文章使用的是3.5.0及以上的构造方法,依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<!-- 代码自动生成器依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3.1</version>
</dependency>
<!-- 生成模板-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
- 3.5.0之前还能够使用
AutoGenerator mpg = new AutoGenerator();
- 3.5.0之后官方推荐使用的是
FastAutoGenerator
来看一下新版本的官网案例
FastAutoGenerator.create(url, username, password)
.globalConfig(builder -> {
builder.author("abc") // 设置作者
.enableSwagger() // 开启 swagger 模式
.fileOverride() // 覆盖已生成文件
.disableOpenDir() //禁止打开输出目录
.outputDir(finalProjectPath + "/src/main/java"); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com.baomidou.mybatisplus.samples") // 设置父包名
.moduleName("test") // 设置父包模块名
.entity("model.entity") //设置entity包名
.other("model.dto") // 设置dto包名
.pathInfo(Collections.singletonMap(OutputFile.xml, finalProjectPath + "/src/main/resources/mapper")); // 设置mapperXml生成路径
})
.injectionConfig(consumer -> {
Map<String, String> customFile = new HashMap<>();
// DTO
customFile.put("DTO.java", "/templates/entityDTO.java.ftl");
consumer.customFile(customFile);
});
这里直接允许就可以构造出来了
2.一些常用配置(第三的时候介绍如何使用
数据库配置
属性 | 说明 |
---|---|
url | jdbc 路径 |
username | 数据库账号 |
password | 数据库密码 |
全局配置
方法 | 说明 |
---|---|
disableOpenDir | 禁止打开输出目录 |
outputDir(String) | 指定输出目录 |
author(String) | 作者名 |
enableKotlin | 开启 kotlin 模式 |
enableSwagger | 开启 swagger 模式 |
dateType(DateType) | 时间策略 |
commentDate(String) | 注释日期 |
包配置
方法 | 说明 |
---|---|
parent(String) | 父包名 |
moduleName(String) | 父包模块名 |
entity(String) | Entity 包名 |
service(String) | Service 包名 |
serviceImpl(String) | Service Impl 包名 |
mapper(String) | Mapper 包名 |
xml(String) | Mapper XML 包名 |
controller(String) | Controller 包名 |
other(String) | 自定义文件包名 |
pathInfo(Map<OutputFile, String>) | 路径配置信息 |
模板配置(自定义自己的模板
方法 | 说明 |
---|---|
disable | 禁用所有模板 |
disable(TemplateType…) | 禁用模板 |
entity(String) | 设置实体模板路径(JAVA) |
entityKt(String) | 设置实体模板路径(kotlin) |
service(String) | 设置 service 模板路径 |
serviceImpl(String) | 设置 serviceImpl 模板路径 |
mapper(String) | 设置 mapper 模板路径 |
mapperXml(String) | 设置 mapperXml 模板路径 |
controller(String) | 设置 controller 模板路径 |
3.配置模板生成器(以本项目为例
目录结构
总体目录就是这样
根据官网给出的构造方法可以得到
构造函数
这里就不多废话直接上代码然后带着看
public class CodeGenerator {
public final String finalProjectPath ="F:/学习的项目/testNixiang";
public static void main(String[] args) {
//代码生成器
//模板引擎不用改但是记得引入库
String templatePath = "/templates/mapper.xml.ftl";
//配置数据源
DataSourceConfig sourceConfig = new DataSourceConfig
.Builder("jdbc:mysql://127.0.0.1:3306/hj_admin", "root", "123456")
.build();
//全局配置
GlobalConfig globalConfig = new GlobalConfig
.Builder()
.outputDir("F:/学习的项目/testNixiang/src/main/java")
.author("hj")
.fileOverride()
.build();
//包配置 用于创建包
PackageConfig packageConfig = new PackageConfig.Builder()
//父包名
.parent("com.example.testnixiang")
//实体类名称
.entity("pojo")
//服务层名称
.service("service")
//服务实现名称
.serviceImpl("service.impl")
//mapper名称
.mapper("mapper")
//mapper.xml名称
.xml("mapper.xml")
//controller名称
.controller("controller")
.build();
//模板配置
TemplateConfig templateConfig = new TemplateConfig.Builder()
.entity("/templates/entity.java")
.service("/templates/service.java")
.serviceImpl("/templates/serviceImpl.java")
.mapper("/templates/mapper.java")
.xml("/templates/mapper.xml")
.controller("/templates/controller.java")
.build();
//代码注入
InjectionConfig injectionConfig = new InjectionConfig.Builder()
.beforeOutputFile((tableInfo, objectMap) -> {
System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
})
.customMap(Collections.singletonMap("test", "baomidou"))
.customFile(Collections.singletonMap("test.txt", "/templates/test.vm"))
.build();
StrategyConfig strategyConfig = new StrategyConfig.Builder()
.enableCapitalMode()
.enableSkipView()
.disableSqlFilter()
.likeTable(new LikeTable("classtable, imgtable"))
.addInclude("classtable,imgtable")
.build();
//模板配置载入
FastAutoGenerator.create(sourceConfig.getUrl(), sourceConfig.getUsername(), sourceConfig.getPassword())
.globalConfig(builder -> builder // globalConfig builder function
.outputDir(globalConfig.getOutputDir()) // 设置输出目录
.author(globalConfig.getAuthor()) // 设置作者
.fileOverride() // 开启覆盖已有文件,但是个方法已经弃用
.build())
.packageConfig(builder -> builder // packageConfig builder function
.parent(packageConfig.getParent()) // 设置父包名
.entity(packageConfig.getEntity()) // 设置entity包名
.service(packageConfig.getService()) // 设置service包名
.serviceImpl(packageConfig.getServiceImpl()) // 设置serviceImpl包名
.mapper(packageConfig.getMapper()) // 设置mapper包名
.xml(packageConfig.getXml()) // 设置xml包名
.controller(packageConfig.getController()) // 设置controller包名
.build())
.strategyConfig(builder -> builder // strategyConfig builder function
.enableCapitalMode() // 允许大写命名
.enableSkipView() // 允许跳过视图
.disableSqlFilter() // 关闭sql过滤,这个地方可以设置自己的过滤规则
.likeTable(new LikeTable("imgtable")) //设置模糊匹配表名
.addInclude("imgtable") //设置要生成的表名
.entityBuilder().enableLombok()//开启lombok支持
.build())
.templateEngine(new FreemarkerTemplateEngine()) // Set template engine
.templateConfig(builder -> builder
.serviceImpl("/templates/wait/serviceImpl.java" )
.entity("/templates/entity.java" )
.build())
.execute();
}
}
可以参照官网看,我这边通过
FastAutoGenerator.create(sourceConfig.getUrl(), sourceConfig.getUsername(), sourceConfig.getPassword())
设置了连接上数据库globalConfig
配置全局变量- outputDir(globalConfig.getOutputDir()) // 设置输出目录
- author(globalConfig.getAuthor()) // 设置作者
- fileOverride() // 开启覆盖已有文件,但是个方法已经弃用
packageConfig
配置路径这些方面- .parent(packageConfig.getParent()) // 设置父包名
- .entity(packageConfig.getEntity()) // 设置entity包名
- .service(packageConfig.getService()) // 设置service包名
- .serviceImpl(packageConfig.getServiceImpl()) // 设置serviceImpl包名
- .mapper(packageConfig.getMapper()) // 设置mapper包名
- .xml(packageConfig.getXml()) // 设置xml包名
- .controller(packageConfig.getController()) // 设置controller包名
- 以上配置具体参考第2中的目录图
strategyConfig
策略配置- .enableCapitalMode() // 允许大写命名
- .enableSkipView() // 允许跳过视图
- .disableSqlFilter() // 关闭sql过滤,这个地方可以设置自己的过滤规则
- .likeTable(new LikeTable(“imgtable”)) //设置模糊匹配表名
- .addInclude(“imgtable”) //设置要生成的表名
- .entityBuilder().enableLombok()//开启lombok支持
templateEngine
选择生成模板的模板引擎(这里使用的是freemaker)templateConfig
自定义模板配置- .serviceImpl(“/templates/wait/serviceImpl.java” ) //服务实现层的模板
- .entity(“/templates/entity.java” ) //实体类实现的模板
- 这里需要注意,因为freemaker的后缀是.ftl你会疑惑为什么会直到
.java
因为他生成的时候会自动加上.ftl
后缀所以不要担心
- 这里需要注意,因为freemaker的后缀是.ftl你会疑惑为什么会直到
这里可能会疑惑自定义模板怎么配置,这里我需要提前说一下,自定义模板路径扫的是resources包里面的,所以需要注意本项目的目录安排
至于模板从哪里来直接开包找到依赖也就是外部库
可以看到官方的模板
本项目修改了一下entity.java.ftl
主要是看他的原本的lombok用的不是@Data注解有点不舒服,我们也可以通过模板的字段查看到有哪些属性,后面讲
<#if entityLombokModel>
import lombok.Getter;
import lombok.Setter;
<#if chainModel>
import lombok.experimental.Accessors;
</#if>
</#if>
<#if entityLombokModel>
@Getter
@Setter
<#if chainModel>
@Accessors(chain = true)
</#if>
</#if>
我们可以看到这里的模板是是否启用entityLombokModel
启用的话就导入lombok的库并且生成注解getter
和setter
,然后修改一下放到resources/templates/
下
<#--增加导入的类-->
<#if entityLombokModel>
import lombok.Getter;
import lombok.Setter;
import lombok.Data;
<#if chainModel>
import lombok.experimental.Accessors;
</#if>
</#if>
<#if entityLombokModel>
@Getter
@Setter
@Data
<#if chainModel>
@Accessors(chain = true)
</#if>
</#if>
现在问题又来了如何知道他有哪些属性?这个就得去看这个依赖有哪些东西
我们可以对着globalConfig
按住ctrl + 鼠标左键
进入
然后同样的方法点击GlobaConfig
进入查看这个类的属性
并且我们可以发现全局配置中的是否覆盖文件这里已经弃用了,所以要找到这个实在策略模式里面,自己找了
lambl表达式
我们在点进去的第一次可以看到
这里诞生了消费者的builder,我们需要直接构造出一个类所以是build.
点什么什么的,然后生成实例付给自身,然后执行FastAutoGenerator
的.execute()
方法从而开始生成
最后运行这个类
看目录
记得把这个修改为自己的项目