效果:根据数据库表生成controller、entity、mapper、service等文件。
操作步骤:
(1)确保idea连接上数据库
(2)在pom.yml中添加依赖
<!-- 模板引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--mybatis-plus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<!--阿里巴巴连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
(3)新建codeGenerator包,在包下建codeGenerator、FastAutoGeneratorTest、H2CodeGeneratorTest三个类
下面为三个类中的代码(来源于官网)
codeGenerator.java
package com.lmc.example;//需修改
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
public class CodeGenerator {
public static void main(String[] args) {
FastAutoGenerator.create(new DataSourceConfig.Builder("jdbc:mysql://192.168.xx.xx:3306/xxx?characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=GMT%2B8",
"root", "123"))//需修改为自己数据库的信息(ip、数据名、账号、密码等)
.globalConfig(builder -> {
builder.author("xxxx") // 设置作者(修改)
.enableSwagger() // 开启 swagger 模式
.outputDir("D:/springboot1/src/main/java/com/example"); // 指定输出目录(修改)
})
.packageConfig(builder -> builder.parent("/test"))//生成代码的上级目录(修改)
.execute();
}
}
FastAutoGeneratorTest.java
package com.lmc.example;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import org.apache.ibatis.jdbc.ScriptRunner;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.SQLException;
/**
* <p>
* 快速生成
* </p>
*
* @author lanjerry
* @since 2021-09-16
*/
public class FastAutoGeneratorTest {
/**
* 执行初始化数据库脚本
*/
public static void before() throws SQLException {
Connection conn = DATA_SOURCE_CONFIG.build().getConn();
InputStream inputStream = H2CodeGeneratorTest.class.getResourceAsStream("/sql/init.sql");
ScriptRunner scriptRunner = new ScriptRunner(conn);
scriptRunner.setAutoCommit(true);
scriptRunner.runScript(new InputStreamReader(inputStream));
conn.close();
}
/**
* 数据源配置
*/
private static final DataSourceConfig.Builder DATA_SOURCE_CONFIG = new DataSourceConfig
.Builder("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;CASE_INSENSITIVE_IDENTIFIERS=TRUE;MODE=MYSQL", "sa", "");
/**
* 执行 run
*/
public static void main(String[] args) throws SQLException {
before();
FastAutoGenerator.create(DATA_SOURCE_CONFIG)
// 全局配置
.globalConfig((scanner, builder) -> builder.author(scanner.apply("请输入作者名称")))
// 包配置
.packageConfig((scanner, builder) -> builder.parent(scanner.apply("请输入包名")))
// 策略配置
.strategyConfig((scanner, builder) -> builder.addInclude(scanner.apply("请输入表名,多个表名用,隔开")))
/*
模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
.templateEngine(new BeetlTemplateEngine())
.templateEngine(new FreemarkerTemplateEngine())
*/
.execute();
}
}
H2CodeGeneratorTest.java
package com.lmc.example;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.fill.Property;
import org.apache.ibatis.jdbc.ScriptRunner;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
* H2 代码生成
*
* @author hubin,lanjerry
* @since 1.0
*/
public class H2CodeGeneratorTest {
/**
* 执行初始化数据库脚本
*/
@BeforeAll
public static void before() throws SQLException {
Connection conn = DATA_SOURCE_CONFIG.getConn();
InputStream inputStream = H2CodeGeneratorTest.class.getResourceAsStream("/sql/init.sql");
ScriptRunner scriptRunner = new ScriptRunner(conn);
scriptRunner.setAutoCommit(true);
scriptRunner.runScript(new InputStreamReader(inputStream));
conn.close();
}
/**
* 数据源配置
*/
private static final DataSourceConfig DATA_SOURCE_CONFIG = new DataSourceConfig
.Builder("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;CASE_INSENSITIVE_IDENTIFIERS=TRUE;MODE=MYSQL", "sa", "")
.build();
/**
* 策略配置
*/
private StrategyConfig.Builder strategyConfig() {
return new StrategyConfig.Builder().addInclude("t_simple"); // 设置需要生成的表名
}
/**
* 全局配置
*/
private GlobalConfig.Builder globalConfig() {
return new GlobalConfig.Builder().fileOverride();
}
/**
* 包配置
*/
private PackageConfig.Builder packageConfig() {
return new PackageConfig.Builder();
}
/**
* 模板配置
*/
private TemplateConfig.Builder templateConfig() {
return new TemplateConfig.Builder();
}
/**
* 注入配置
*/
private InjectionConfig.Builder injectionConfig() {
// 测试自定义输出文件之前注入操作,该操作再执行生成代码前 debug 查看
return new InjectionConfig.Builder().beforeOutputFile((tableInfo, objectMap) -> {
System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
});
}
/**
* 简单生成
*/
@Test
public void testSimple() {
AutoGenerator generator = new AutoGenerator(DATA_SOURCE_CONFIG);
generator.strategy(strategyConfig().build());
generator.global(globalConfig().build());
generator.execute();
}
/**
* 过滤表前缀(后缀同理,支持多个)
* result: t_simple -> simple
*/
@Test
public void testTablePrefix() {
AutoGenerator generator = new AutoGenerator(DATA_SOURCE_CONFIG);
generator.strategy(strategyConfig().addTablePrefix("t_", "c_").build());
generator.global(globalConfig().build());
generator.execute();
}
/**
* 过滤字段后缀(前缀同理,支持多个)
* result: deleted_flag -> deleted
*/
@Test
public void testFieldSuffix() {
AutoGenerator generator = new AutoGenerator(DATA_SOURCE_CONFIG);
generator.strategy(strategyConfig().addFieldSuffix("_flag").build());
generator.global(globalConfig().build());
generator.execute();
}
/**
* 乐观锁字段设置
* result: 新增@Version注解
* 填充字段设置
* result: 新增@TableField(value = "xxx", fill = FieldFill.xxx)注解
*/
@Test
public void testVersionAndFill() {
AutoGenerator generator = new AutoGenerator(DATA_SOURCE_CONFIG);
generator.strategy(strategyConfig().entityBuilder()
.versionColumnName("version") // 基于数据库字段
.versionPropertyName("version")// 基于模型属性
.addTableFills(new Column("create_time", FieldFill.INSERT)) //基于数据库字段填充
.addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE)) //基于模型属性填充
.build());
generator.global(globalConfig().build());
generator.execute();
}
/**
* 逻辑删除字段设置
* result: 新增@TableLogic注解
* 忽略字段设置
* result: 不生成
*/
@Test
public void testLogicDeleteAndIgnoreColumn() {
AutoGenerator generator = new AutoGenerator(DATA_SOURCE_CONFIG);
generator.strategy(strategyConfig().entityBuilder()
.logicDeleteColumnName("deleted") // 基于数据库字段
.logicDeletePropertyName("deleteFlag")// 基于模型属性
.addIgnoreColumns("age") // 基于数据库字段
.build());
generator.global(globalConfig().build());
generator.execute();
}
/**
* 自定义模板生成的文件名称
* result: TSimple -> TSimpleEntity
*/
@Test
public void testCustomTemplateName() {
AutoGenerator generator = new AutoGenerator(DATA_SOURCE_CONFIG);
generator.strategy(strategyConfig()
.entityBuilder().formatFileName("%sEntity")
.mapperBuilder().formatMapperFileName("%sDao").formatXmlFileName("%sXml")
.controllerBuilder().formatFileName("%sAction")
.serviceBuilder().formatServiceFileName("%sService").formatServiceImplFileName("%sServiceImp")
.build());
generator.global(globalConfig().build());
generator.execute();
}
/**
* 自定义模板生成的文件路径
*
* @see OutputFile
*/
@Test
public void testCustomTemplatePath() {
// 设置自定义路径
Map<OutputFile, String> pathInfo = new HashMap<>();
pathInfo.put(OutputFile.xml, "D://");
pathInfo.put(OutputFile.entity, "D://entity//");
AutoGenerator generator = new AutoGenerator(DATA_SOURCE_CONFIG);
generator.strategy(strategyConfig().build());
generator.packageInfo(packageConfig().pathInfo(pathInfo).build());
generator.global(globalConfig().build());
generator.execute();
}
/**
* 自定义模板
*/
@Test
public void testCustomTemplate() {
AutoGenerator generator = new AutoGenerator(DATA_SOURCE_CONFIG);
generator.strategy(strategyConfig().build());
generator.template(templateConfig()
.entity("/templates/entity1.java")
.build());
generator.global(globalConfig().build());
generator.execute();
}
/**
* 自定义注入属性
*/
@Test
public void testCustomMap() {
// 设置自定义属性
Map<String, Object> map = new HashMap<>();
map.put("abc", 123);
AutoGenerator generator = new AutoGenerator(DATA_SOURCE_CONFIG);
generator.strategy(strategyConfig().build());
generator.template(templateConfig()
.entity("/templates/entity1.java")
.build());
generator.injection(injectionConfig().customMap(map).build());
generator.global(globalConfig().build());
generator.execute();
}
/**
* 自定义文件
* key为文件名称,value为文件路径
* 输出目录为 other
*/
@Test
public void testCustomFile() {
// 设置自定义输出文件
Map<String, String> customFile = new HashMap<>();
customFile.put("test.txt", "/templates/test.vm");
AutoGenerator generator = new AutoGenerator(DATA_SOURCE_CONFIG);
generator.strategy(strategyConfig().build());
generator.injection(injectionConfig().customFile(customFile).build());
generator.global(globalConfig().build());
generator.execute();
}
}
(4)执行CodeGenerator中的这个函数生成
注:代码来自官网