(九)代码生成器
基础项目地址:
https://gitee.com/springzb/admin-boot
一、引入maven依赖
xml
<!--代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<!--模板生成器 velocity-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
二、编写代码生成器
java
package cn.mesmile.admin.modules.generator;
import cn.mesmile.admin.common.constant.BaseEntity;
import cn.mesmile.admin.common.constant.IBaseService;
import cn.mesmile.admin.common.constant.BaseServiceImpl;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.function.Consumer;
/**
* @author zb
* @Description 在开发过程中使用,其余时候不会用
* 相关配置 https://baomidou.com/pages/981406/
*/
public class GeneratorCode {
/** 数据库配置 */
private final static String JDBC_URL = "jdbc:mysql://81.69.43.78:3306/admin-boot?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8";
private final static String USERNAME = "root";
private final static String PASSWORD = "task,.123";
/** 项目所在目录 */
private static String projectPath = System.getProperty("user.dir");
/** Java文件输出目录 */
private static String outputDir = projectPath + "/src/main/java";
/** xml输出目录 */
private static String mapperOutputDir = projectPath +"/src/main/resources/mapper";
/** 表前缀 */
private static String[] tablePreFix = new String[]{};
/**
* 数据源配置
*/
private static final DataSourceConfig.Builder DATA_SOURCE_CONFIG = new DataSourceConfig.Builder(JDBC_URL, USERNAME, PASSWORD);
public static void main(String[] args) {
System.out.println("公共字段有 create_by create_time update_by update_time deleted status");
System.out.println("请输入需要父类,即检查表中是否有所有的公共字段? y / n");
Scanner scannerResult = new Scanner(System.in);
String next = scannerResult.next();
if ("Y".equalsIgnoreCase(next)){
// 存在父类,父类中字段为;父类字段 "create_by", "create_time", "update_by", "update_time","deleted","status"
hasSuperClass();
}else {
// 不存在父类
notHasSuperClass();
}
}
private static void hasSuperClass() {
FastAutoGenerator.create(DATA_SOURCE_CONFIG)
// 全局配置
.globalConfig((scanner, builder) ->
builder.author(scanner.apply("请输入作者名称?"))
.outputDir(outputDir)
// 禁止打开输出目录
.disableOpenDir()
// 开启swagger
.enableSwagger()
// 指定日期类型
.dateType(DateType.TIME_PACK)
// 覆盖已生成的文件
.fileOverride())
// 包配置
.packageConfig((scanner, builder) ->
builder.parent(scanner.apply("请输入父级包名?"))
.pathInfo(Collections.singletonMap(OutputFile.xml, mapperOutputDir))
)
// 策略配置
.strategyConfig((scanner, builder) ->
builder
.addTablePrefix(tablePreFix)
.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all")))
// controller配置
.controllerBuilder().enableRestStyle().enableHyphenStyle().build()
// 实体配置
.entityBuilder().enableLombok().addTableFills(
new Column("create_time", FieldFill.INSERT),
new Column("create_by", FieldFill.INSERT),
new Column("update_time", FieldFill.INSERT_UPDATE),
new Column("update_by", FieldFill.INSERT_UPDATE)
)
.addSuperEntityColumns("create_by", "create_time", "update_by", "update_time","deleted","status")
.superClass(BaseEntity.class)
.logicDeleteColumnName("deleted")
.logicDeletePropertyName("deleted")
.idType(IdType.ASSIGN_ID).build()
// service配置
.serviceBuilder()
.superServiceClass(IBaseService.class)
.superServiceImplClass(BaseServiceImpl.class)
// .formatServiceFileName("I%sService").formatServiceImplFileName("I%sServiceImpl")
.build()
// mapper配置
.mapperBuilder().superClass(BaseMapper.class)
.enableBaseResultMap()
.enableBaseColumnList()
.build()
)
// 模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
.templateEngine(new VelocityTemplateEngine())
.templateConfig(
new Consumer<TemplateConfig.Builder>() {
@Override
public void accept(TemplateConfig.Builder builder) {
// 指定模板路径
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();
}
}
)
/*
模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
.templateEngine(new BeetlTemplateEngine())
.templateEngine(new FreemarkerTemplateEngine())
*/
.execute();
}
private static void notHasSuperClass() {
FastAutoGenerator.create(DATA_SOURCE_CONFIG)
// 全局配置
.globalConfig((scanner, builder) ->
builder.author(scanner.apply("请输入作者名称?"))
.outputDir(outputDir)
// 禁止打开输出目录
.disableOpenDir()
// 开启swagger
.enableSwagger()
// 指定日期类型
.dateType(DateType.TIME_PACK)
// 覆盖已生成的文件
.fileOverride())
// 包配置
.packageConfig((scanner, builder) ->
builder.parent(scanner.apply("请输入包名?"))
.pathInfo(Collections.singletonMap(OutputFile.xml, mapperOutputDir))
)
// 策略配置
.strategyConfig((scanner, builder) ->
builder
.addTablePrefix(tablePreFix)
.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all")))
// controller配置
.controllerBuilder().enableRestStyle().enableHyphenStyle().build()
// 实体配置
.entityBuilder().enableLombok().addTableFills(
new Column("create_time", FieldFill.INSERT),
new Column("create_by", FieldFill.INSERT),
new Column("update_time", FieldFill.INSERT_UPDATE),
new Column("update_by", FieldFill.INSERT_UPDATE)
)
.logicDeleteColumnName("deleted")
.logicDeletePropertyName("deleted")
.idType(IdType.ASSIGN_ID).build()
// service配置
.serviceBuilder()
.superServiceClass(IService.class)
.superServiceImplClass(ServiceImpl.class)
// .formatServiceFileName("I%sService").formatServiceImplFileName("%sServiceImpl")
.build()
// mapper配置
.mapperBuilder().superClass(BaseMapper.class)
.enableBaseResultMap()
.enableBaseColumnList()
.build()
)
// 模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
.templateEngine(new VelocityTemplateEngine())
.templateConfig(
new Consumer<TemplateConfig.Builder>() {
@Override
public void accept(TemplateConfig.Builder builder) {
// 指定模板路径
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();
}
}
)
/*
模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
.templateEngine(new BeetlTemplateEngine())
.templateEngine(new FreemarkerTemplateEngine())
*/
.execute();
}
/**
* 处理 all 情况
*
* @param tables
* @return
*/
protected static List<String> getTables(String tables) {
return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
}
}
BaseEntity基础类
java
package cn.mesmile.admin.common.constant;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* @author zb
* @Description 父类
*/
@Data
public class BaseEntity implements Serializable {
@JsonSerialize(using = ToStringSerializer.class)
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty("创建人")
private Long createBy;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT)
@ApiModelProperty("创建时间")
private LocalDateTime createTime;
@JsonSerialize(using = ToStringSerializer.class)
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty("更新人")
private Long updateBy;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty("更新时间")
private LocalDateTime updateTime;
@ApiModelProperty("删除标志(0代表存在 1代表删除)")
@TableLogic
private String deleted;
@ApiModelProperty("业务状态(0正常 1停用)")
private String status;
}
代码模板详见项目:\admin-boot\src\main\resources\templates 目录
三、在数据库中新建表测试
在对应的数据库,新建表测试:
启动 cn.mesmile.admin.modules.generator.GeneratorCode 代码生成类