最近在处理业务的时候,有太多的表需要生成entity,controller等业务与处理模块了,之前一直使用idea连接数据库,再安装插件,即可生成相应的模块,今天换一种方式来实现。话不多说直接上代码
一、添加依赖
全新的代码生成器添加于 3.5.1 版本,且对历史版本不兼容!如果使用的是 3.5.1 以下的版本,请参考 代码生成器 进行配置与使用。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
二、配置设置
这里实体类因需要添加注解,所以编写了自定义的模版myentity.java.ftl
@Slf4j
public class MyBatisPlusGenerator {
public static void main(String[] args) {
List<String> tables = new ArrayList<>();
tables.add("org_info");
FastAutoGenerator.create(
"数据库连接路径",
"用户",
"密码"
)
.globalConfig(builder -> {
builder.author("QT") // 设置作者名称
.outputDir(System.getProperty("user.dir") + "\\SayAo\\src\\main\\java") // 设置生成文件的输出路径
.enableSwagger() // 启用 Swagger 注解
.commentDate("yyyy-MM-dd") // 设置注释日期格式
.fileOverride(); // 启用文件覆盖
})
.packageConfig(builder -> {
builder.parent("com.ali") // 设置父包名
.moduleName("sayao") // 设置模块名
.entity("model") // 设置实体类包名
.service("service") // 设置 Service 包名
.serviceImpl("service.impl") // 设置 Service 实现类包名
.controller("controller") // 设置 Controller 包名
.mapper("mapper") // 设置 Mapper 接口包名
.xml("mapper") // 设置 Mapper XML 文件包名
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir") + "\\SayAo\\src\\main\\resources\\mapper")); // 设置 Mapper XML 文件的输出路径
})
.strategyConfig(builder -> {
builder.addInclude(tables) // 指定需要生成代码的表
.serviceBuilder()
.formatServiceFileName("%sService") // 设置 Service 接口文件名格式
.formatServiceImplFileName("%sServiceImpl") // 设置 Service 实现类文件名格式
.entityBuilder()
.enableLombok() // 启用 Lombok 注解
.enableTableFieldAnnotation() // 启用实体类字段注解
.controllerBuilder()
.enableHyphenStyle() // 启用连字符格式的映射路径
.formatFileName("%sController") // 设置 Controller 文件名格式
.enableRestStyle() // 启用 Rest 风格
.mapperBuilder()
.enableBaseResultMap() // 启用通用的 resultMap
.superClass(BaseMapper.class) // 设置 Mapper 的父类
.formatMapperFileName("%sMapper") // 设置 Mapper 文件名格式
.enableMapperAnnotation() // 启用 Mapper 注解
.formatXmlFileName("%sMapper"); // 设置 Mapper XML 文件名格式
})
.templateConfig(builder -> builder.entity("templates/myentity.java")) // 使用自定义的实体类模板
.templateEngine(new FreemarkerTemplateEngine()) // 使用 Freemarker 引擎模板
.execute();
}
}
三、ftl模版
这段代码是一个用于生成 Java 实体类的 FreeMarker 模板,它根据指定的配置和数据库表结构动态生成实体类的代码。(按自己需求进行修改,这里主要是需要添加swagger与mybatisplus提供的注解)
package ${package.Entity};
<#list table.importPackages as pkg>
import ${pkg};
</#list>
<#if entityLombokModel>
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
<#if chainModel>
import lombok.experimental.Accessors;
</#if>
</#if>
/**
* @author ${author}
* @since ${date}
*/
<#if entityLombokModel>
@Data
<#if chainModel>
@Accessors(chain = true)
</#if>
</#if>
<#if table.convert>
@TableName("${schemaName}${table.name}")
</#if>
<#if superEntityClass??>
public class ${entity} extends ${superEntityClass}<#if activeRecord><${entity}></#if> {
<#elseif activeRecord>
public class ${entity} extends Model<${entity}> {
<#elseif entitySerialVersionUID>
public class ${entity} implements Serializable {
<#else>
public class ${entity} {
</#if>
<#if entitySerialVersionUID>
private static final long serialVersionUID = 1L;
</#if>
<#-- ---------- BEGIN 字段循环遍历 ---------->
<#list table.fields as field>
<#if field.keyFlag>
<#assign keyPropertyName="${field.propertyName}"/>
</#if>
<#if field.comment!?length gt 0>
<#if swagger>
@ApiModelProperty("${field.comment}")
<#else>
/**
* ${field.comment}
*/
</#if>
</#if>
<#if field.keyFlag>
<#-- 主键 -->
<#if field.keyIdentityFlag>
@TableId(value = "${field.annotationColumnName}", type = IdType.AUTO)
<#elseif idType??>
@TableId(value = "${field.annotationColumnName}", type = IdType.${idType})
<#elseif field.convert>
@TableId("${field.annotationColumnName}")
</#if>
<#-- 普通字段 -->
<#elseif field.fill??>
<#-- ----- 存在字段填充设置 ----->
<#if field.convert>
@TableField(value = "${field.annotationColumnName}", fill = FieldFill.${field.fill})
<#else>
@TableField(fill = FieldFill.${field.fill})
</#if>
<#elseif field.convert>
@TableField("${field.annotationColumnName}")
</#if>
<#-- 乐观锁注解 -->
<#if field.versionField>
@Version
</#if>
<#-- 逻辑删除注解 -->
<#if field.logicDeleteField>
@TableLogic
</#if>
private ${field.propertyType} ${field.propertyName};
</#list>
<#------------ END 字段循环遍历 ---------->
<#if !entityLombokModel>
<#list table.fields as field>
<#if field.propertyType == "boolean">
<#assign getprefix="is"/>
<#else>
<#assign getprefix="get"/>
</#if>
public ${field.propertyType} ${getprefix}${field.capitalName}() {
return ${field.propertyName};
}
<#if chainModel>
public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
<#else>
public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) {
</#if>
this.${field.propertyName} = ${field.propertyName};
<#if chainModel>
return this;
</#if>
}
</#list>
</#if>
<#if entityColumnConstant>
<#list table.fields as field>
public static final String ${field.name?upper_case} = "${field.name}";
</#list>
</#if>
<#if activeRecord>
@Override
public Serializable pkVal() {
<#if keyPropertyName??>
return this.${keyPropertyName};
<#else>
return null;
</#if>
}
</#if>
<#if !entityLombokModel>
@Override
public String toString() {
return "${entity}{" +
<#list table.fields as field>
<#if field_index==0>
"${field.propertyName}=" + ${field.propertyName} +
<#else>
", ${field.propertyName}=" + ${field.propertyName} +
</#if>
</#list>
"}";
}
</#if>
}
主打一个爱分享,结束~~~~~~