代码生成器 | MyBatis-Plus
第一步引入依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.7</version>
</dependency>
第二步快速生成:
public class CodeGenerator {
public static void main(String[] args) {
FastAutoGenerator.create("url", "username", "password")
.globalConfig(builder -> {
builder.author("baomidou") // 设置作者
.enableSwagger() // 开启 swagger 模式
.outputDir("D://"); // 指定输出目录
})
.dataSourceConfig(builder ->
builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
int typeCode = metaInfo.getJdbcType().TYPE_CODE;
if (typeCode == Types.SMALLINT) {
// 自定义类型转换
return DbColumnType.INTEGER;
}
return typeRegistry.getColumnType(metaInfo);
})
)
.packageConfig(builder ->
builder.parent("com.baomidou.mybatisplus.samples.generator") // 设置父包名
.moduleName("system") // 设置父包模块名
.pathInfo(Collections.singletonMap(OutputFile.xml, "D://")) // 设置mapperXml生成路径
)
.strategyConfig(builder ->
builder.addInclude("t_simple") // 设置需要生成的表名
.addTablePrefix("t_", "c_") // 设置过滤表前缀
)
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
}
运行发现报错:
Exception in thread "main" java.lang.NoClassDefFoundError: freemarker/template/Configuration
Caused by: java.lang.ClassNotFoundException: freemarker.template.Configuration
14:11:59.712 [main] DEBUG com.baomidou.mybatisplus.generator.AutoGenerator - ==========================准备生成文件...==========================
Exception in thread "main" java.lang.NoClassDefFoundError: freemarker/template/Configuration
at com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine.init(FreemarkerTemplateEngine.java:41)
at com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine.init(FreemarkerTemplateEngine.java:36)
at com.baomidou.mybatisplus.generator.AutoGenerator.execute(AutoGenerator.java:179)
at com.baomidou.mybatisplus.generator.FastAutoGenerator.execute(FastAutoGenerator.java:213)
at com.lzh.usercenterbackend.CodeGenerator.main(CodeGenerator.java:43)
Caused by: java.lang.ClassNotFoundException: freemarker.template.Configuration
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 5 more
原因在报错中已经说明了找不到freemarker.template.Configuration类,可以看到代码中.templateEngine(new FreemarkerTemplateEngine()) // 使用 Freemarker 模板引擎,需要用到freemarker模板引擎,而mybatis-plus-generator并没有这个依赖包,所以报错!!!
原因找到了那我们只需要引入这个依赖即可:
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
跳过踩坑过程,快速使用
以下配置请看:代码生成器配置 | MyBatis-Plus
这里需要说明的是,如果你想覆盖已生成的文件,老的版本可以在globalConfig全局配置中.fileOverride(true)链式的声明,但是最新的版本中已经标注过时了,已经无效。
现在最新的用法就是在StrategyConfig策略配置中配置该选项,不过官网给的enableFileOverride选项并没有找到,网络上查阅资料也都是这个选项,后来摸索才发现是这个选项fileOverride
public class CodeGenerator {
public static void main(String[] args) {
// 使用 FastAutoGenerator 快速配置代码生成器
FastAutoGenerator.create("jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai", "root", "123456")
.globalConfig(builder -> {
builder.disableOpenDir() // 不允许自动打开输出目录
.author("xxx") // 设置作者
.outputDir(System.getProperty("user.dir") + "/src/main/java"); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("xxx") // 设置父包名
.controller("controller") // 设置 Controller 包名
.entity("entity") // 设置实体类包名
.mapper("dao") // 设置 Mapper 接口包名
.service("service") // 设置 Service 接口包名
.serviceImpl("service.impl") // 设置 Service 实现类包名
.xml("mapper") // 设置 Mapper XML 文件包名
.pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "/src/main/resources/mapper")); // 设置 Mapper XML 文件的输出路径
})
.strategyConfig(builder -> {
builder.addInclude("xxx") // 设置需要生成的表名
.controllerBuilder().enableRestStyle()
.entityBuilder().fileOverride().enableLombok().enableTableFieldAnnotation().logicDeleteColumnName("isDelete").addTableFills(new Property("createTime", FieldFill.INSERT)).addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE))
.mapperBuilder().fileOverride().formatMapperFileName("%sDao").formatXmlFileName("%sMapper")
.serviceBuilder().fileOverride().formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImp");
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用 Freemarker 模板引擎
.execute(); // 执行生成
}
}