前言
Mybatis也有对应的反向工程mybatis-generator来生成相关的Mapper接口和xml配置。Mybatis-plus的代码生成更为简单。
导入pom依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
加入freemarker的配置,我们的示例使用freemarker模板
SpringBoot配置文件中配置freemarker模板
spring.freemarker.suffix=.ftl
spring.freemarker.template-loader-path=classpath*:templates/*.ftl
注:在我们依赖的mybatis-plus-generator包中就存在对应的模板文件,一般情况下我们无需从jar包中拷贝出来,除非你想自定义。
mybatis-plus-generator包中默认的模板文件如下:
编写测试代码
package com.yyoo.boot.mp;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Collections;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MPApplication.class,webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class Test2 {
@Value("${my.hikari.jdbc-url}")
private String url;
@Value("${my.hikari.username}")
private String username;
@Value("${my.hikari.password}")
private String password;
@Test
public void t1(){
FastAutoGenerator.create(url, username, password)
.globalConfig(builder -> {
builder.author("auto") // 设置作者
.enableSwagger() // 开启 swagger 模式
.disableOpenDir() // 禁用执行完成后打开文件夹
.fileOverride() // 覆盖已生成文件
.outputDir("C://work//tmp"); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com.yyoo.boot") // 设置父包名
.moduleName("mp") // 设置父包模块名
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, "C://work//tmp//mapper")); // 设置mapperXml生成路径
})
.strategyConfig(builder -> {
builder.addInclude("t_my_emp")
.build()
.entityBuilder()
.enableLombok() // 使用lombok
.idType(IdType.ASSIGN_ID)
.convertFileName((String entityName) -> {
if(entityName.startsWith("T")) {
return entityName.substring(1);
}else {
return entityName;
}
})
.build()
.mapperBuilder()
.enableBaseResultMap() // 在mapper.xml文件中生成ResultMap
.convertMapperFileName(entityName -> {
String fileName;
if(entityName.startsWith("T")) {
fileName = entityName.substring(1);
}else {
fileName = entityName;
}
return fileName+"Mapper";
})
.convertXmlFileName(entityName -> {
String fileName;
if(entityName.startsWith("T")) {
fileName = entityName.substring(1);
}else {
fileName = entityName;
}
return fileName+"Mapper";
})
.serviceBuilder()
// 不能和formatFileName一起使用
.convertServiceFileName(entityName -> {
String fileName;
if(entityName.startsWith("T")) {
fileName = entityName.substring(1);
}else {
fileName = entityName;
}
return fileName+"Service";
})
.convertServiceImplFileName(entityName -> {
String fileName;
if(entityName.startsWith("T")) {
fileName = entityName.substring(1);
}else {
fileName = entityName;
}
return fileName+"ServiceImpl";
})
.controllerBuilder()
.enableHyphenStyle()
.enableRestStyle()
// 不能和formatFileName一起使用
.convertFileName(entityName -> {
String fileName;
if(entityName.startsWith("T")) {
fileName = entityName.substring(1);
}else {
fileName = entityName;
}
return fileName+"Controller";
});
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
}
代码比较长,但都非常简单。只是有些地方需要注意
- idType需要根据你的需要来设置
- convertFileName方法和formatFileName不要一起使用,如果一起使用,那么convertFileName方法将不会执行。只有formatFileName方法会生效。
- convertFileName方法接收一个ConverterFileName对象,示例中我们有很多类似的重复代码,大家可以将他们独立出来定义,减少代码量。(ConverterFileName是一个函数式接口)
- 示例中的各个方法配置的详细说明,请查看官网链接代码生成器的配置
- 注:本文示例只支持3.5.1+版本,旧版本的代码情参考官网。
上一篇:Mybatis-plus进阶之分布式id生成
下一篇:待续