前言
这篇文章将记录我学习了解Mybatis-Plus代码生成器相关知识。其中用到了spring-boot框架、mysql数据库、mybatis-plus、lombok插件、API文档框架Swagger。
Mybatis-Plus代码生成器简述
在后端项目中经常需要创建Entity、Mapper、Service、Controller 、Mapper.xml文件,存在两个主要缺点:
- 这个过程中手动创建有时会容易出错,比如Entity类名写错或是类里面的某个对应数据库表字段的变量名字写错。
- 这个过程经常反复操作、比较繁琐、而且根本就是机械式操作。
为了节省开发时间,baomidou团队给mybatis-plus添加了代码生成器类AutoGenerator,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
实现步骤
下面我引入在项目中用到的代码生成器
一. 添加相关依赖
在pom.xml导入代码生成器依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>latest-version</version>
</dependency>
项目中用到了freemarker模板引擎,导入依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
其实MyBatis-Plus 支持 Velocity(默认)、Freemarker、Beetl,用户可以选择自己熟悉的模板引擎。
二. 创建mybatis-plus代码生成器执行类
创建目录,这个类命名为CodeGenerator
项目结构.PNG
三. 在GodeGenerator中编写相关配置代码
package com.wzubi.maxmoney.utils;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.Collections;
import java.util.Scanner;
/**
* @author jq
* @since 2019-12-24
*/
public class CodeGenerator {
/**
* <p>
* 读取控制台内容
* </p>
*/
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotEmpty(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
// 代码生成器
AutoGenerator autoGenerator = new AutoGenerator();
// 数据源配置
autoGenerator.setDataSource(new DataSourceConfig()
.setDriverName("com.mysql.cj.jdbc.Driver")
// 设置数据库类型
.setDbType(DbType.MYSQL)
// 数据库连接账户和密码
.setUsername("root")
.setPassword("root")
// 数据库连接的url
.setUrl("jdbc:mysql://localhost:3306/max-money?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&useAffectedRows=true&serverTimezone=CTT")
// 类型转换,默认由 dbType 类型决定选择对应数据库内置实现,实现 ITypeConvert 接口自定义数据库 字段类型 转换为自己需要的 java 类型
.setTypeConvert(new MySqlTypeConvert() {
@Override
public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
System.out.println("转换类型:" + fieldType);
String t = fieldType.toLowerCase();
if (t.contains("tinyint(1)")) {
return DbColumnType.INTEGER;
}
return super.processTypeConvert(globalConfig, fieldType);
}
})
);
String projectPath = System.getProperty("user.dir");
// 全局配置
autoGenerator.setGlobalConfig(new GlobalConfig()
// 输出目录
.setOutputDir(projectPath+ "/src/main/java")
// 是否覆盖
.setFileOverride(true)
//swagger注解
.setSwagger2(true)
// 时间格式
.setDateType(DateType.ONLY_DATE)
// 开启AR模式
.setActiveRecord(false)
// XML二级缓存
.setEnableCache(false)
// 生成ResultMap
.setBaseResultMap(true)
// 生成 sql片段
.setBaseColumnList(true)
// 自动打开生成后的文件夹
.setOpen(false)
// 所有文件的生成者
.setAuthor("jq")
);
// 包配置
PackageConfig packageConfig = new PackageConfig()
// 基本包路径
.setParent("com.wzubi.maxmoney")
.setModuleName(scanner("模块名"))
// 设置Mapper包名
.setMapper("dao");
autoGenerator.setPackageInfo(packageConfig);
// 策略配置
autoGenerator.setStrategy(new StrategyConfig()
// 需要生成的表
.setInclude(scanner("表名"))
// 实体类使用Lombok
.setEntityLombokModel(true)
// 表名生成策略,下划线转驼峰
.setNaming(NamingStrategy.underline_to_camel)
// 字段名生成策略,下划线转驼峰
.setColumnNaming(NamingStrategy.underline_to_camel)
// 可以继承父实体类,没有可以不用配置
.setSuperEntityClass("com.wzubi.maxmoney.parent.entity.BaseEntity")
// 自定义基础的Entity类的公共字段
.setSuperEntityColumns("id","deleted","create_time","update_time")
// 生成 @RestController 控制器
.setRestControllerStyle(true)
// 驼峰转连字符
.setControllerMappingHyphenStyle(true)
// 逻辑删除属性名称
.setLogicDeleteFieldName("deleted")
);
// 注入自定义配置
autoGenerator.setCfg(new InjectionConfig() {
@Override
public void initMap() {
// Map<String, Object> map = new HashMap<>(1);
// map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
// this.setMap(map);
}
}.setFileOutConfigList(Collections.singletonList(
new FileOutConfig("/templates/mapper.xml.ftl") {
// 自定义Mapper.xml输出路径
@Override
public String outputFile(TableInfo tableInfo) {
return projectPath + "/src/main/resources/mapper/" + packageConfig.getModuleName()
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
})));
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
// 不生成xml文件
templateConfig.setXml(null);
autoGenerator.setTemplate(templateConfig);
// 选择了非默认引擎,需要在 AutoGenerator 中 设置模板引擎
autoGenerator.setTemplateEngine(new FreemarkerTemplateEngine());
autoGenerator.execute();
}
}
总结:在个类中主要配置:
- 数据库源配置DataSourceConfig
- 数据库表配置StrategyConfig
- 包名配置PackageConfig
- 模板配置TemplateConfig
- 全局配置GlobalConfig
- 自定义注入配置InjectionConfig
4. 执行结果
启动CodeGenerator,输入以下你想要的模块名,和数据库表名
代码演示1.PNG
然后回车,生成代码完成,如图:
代码演示2.PNG
代码演示3.PNG
借用官方的动图演示:
动图演示