代码自动生成器
pom引入:
<!-- mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.0</version>
</dependency>
<!-- 模板依赖-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<scope>test</scope>
<version>2.3.31</version>
</dependency>
自动生成代码程序CodeGenerator
package com.zifeng.lifeboke;
import com.baomidou.mybatisplus.generator.SimpleAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.AbstractTemplateEngine;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.io.File;
import java.util.ResourceBundle;
/**
* @ProjectName: lifeboke
* @Package: com.zifeng.lifeboke
* @ClassName: CodeGenerator
* @Author: zifeng
* @Description: mybatis-plus 代码生成器
* @Date: 2021/11/11 16:08
* @Version: 1.0
*/
public class CodeGenerator {
public static void main(String[] args) {
new SimpleAutoGenerator() {
final ResourceBundle rb = ResourceBundle.getBundle("mybatis-plus");
/**
* 配置数据源
*/
@Override
public IConfigBuilder<DataSourceConfig> dataSourceConfigBuilder() {
return new DataSourceConfig.Builder(rb.getString("url"),//url
rb.getString("userName"),//username
rb.getString("password")).schema("public");//password
}
/**
* 全局配置
*/
@Override
public IConfigBuilder<GlobalConfig> globalConfigBuilder() {
String outputDir = new File(System.getProperty("user.dir")) + rb.getString("OutputDir");
System.out.println("\n输出文件目录:" + outputDir);
return new GlobalConfig.Builder().fileOverride()//是否覆盖已有文件
.openDir(false)//是否打开输出目录
.enableSwagger()//开启 swagger2 模式
.outputDir(outputDir)//生成文件的输出目录
.author(rb.getString("author"))//开发人员
.dateType(DateType.TIME_PACK);//时间类型对应策略
}
/**
* 配置包名和路径
*/
@Override
public PackageConfig.Builder packageConfigBuilder() {
return new PackageConfig.Builder().
parent(rb.getString("parent"));
}
/**
* 配置模板类 fl,vm
*/
@Override
public IConfigBuilder<TemplateConfig> templateConfigBuilder() {
return new TemplateConfig.Builder().entity(rb.getString("entity"));
}
/**
* 配置模板引擎
*/
@Override
public AbstractTemplateEngine templateEngine() {
return new FreemarkerTemplateEngine();
}
/**
* 自定义表策略
*/
@Override
public IConfigBuilder<StrategyConfig> strategyConfigBuilder() {
return new StrategyConfig.Builder()
.addInclude(rb.getString("tableName").split(","))//增加表匹配(内存过滤)
.addTablePrefix("t_") //过虑表前缀
.entityBuilder()// 实体配置构建者
.enableLombok()// 开启lombok模型
// .versionColumnName("version") //乐观锁数据库表字段
.naming(NamingStrategy.underline_to_camel)// 数据库表映射到实体的命名策略
.columnNaming(NamingStrategy.underline_to_camel)//数据库表字段映射到实体的命名策略
.enableColumnConstant()//开启生成字段常量
.serviceBuilder()//service 策略配置
.mapperBuilder()
.entityBuilder()
.controllerBuilder()
.enableRestStyle(); //控制器属性配置构建
}
}.execute();
}
}
由于entity自动生成的时候会少引入一个包,找了很久没找到原因,每次手动很麻烦所以在这里设置了
new TemplateConfig.Builder().entity(rb.getString("entity"))
使用了本地模板,不需要可以去掉. .entity(rb.getString("entity"))
/**
* 配置模板类 fl,vm
*/
@Override
public IConfigBuilder<TemplateConfig> templateConfigBuilder() {
return new TemplateConfig.Builder().entity(rb.getString("entity"));
}
mybatis-plus.properties 类
#此处为本项目src所在路径(代码生成器输出路径)
OutputDir=/src/main/java
#mapper.xml的生成位置
#OutputDirXml=/defense-service/src/main/resources
#数据库表名(此处切不可为空,如果为空,则默认读取数据库的所有表名) 如果有多张表可以用逗号分割
tableName=user
#存放所生成代码文件的上一级包名
#className=自填
#entity 模板地址
entity=/templates/entity2.java
#设置作者
author=gxg
#正常情况下,下面的代码无需修改
#自定义包路径
parent=com.zifeng.lifeboke
#数据库地址
url=jdbc:mysql://127.0.0.1:3366/lifeboke
#mysql:username & password
userName=root
password=123
entity2.java.ftl 模板文件
package ${package.Entity};
<#list table.importPackages as pkg>
import ${pkg};
</#list>
<#if swagger>
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.TableName;
</#if>
<#if entityLombokModel>
import lombok.Data;
import lombok.EqualsAndHashCode;
<#if chainModel>
import lombok.experimental.Accessors;
</#if>
</#if>
/**
* <p>
* ${table.comment!}
* </p>
*
* @author ${author}
* @since ${date}
*/
<#if entityLombokModel>
@Data
<#if superEntityClass??>
@EqualsAndHashCode(callSuper = true)
<#else>
@EqualsAndHashCode(callSuper = false)
</#if>
<#if chainModel>
@Accessors(chain = true)
</#if>
</#if>
<#if table.convert>
@TableName("${schemaName}${table.name}")
</#if>
<#if swagger>
@ApiModel(value = "${entity}对象", description = "${table.comment!}")
</#if>
<#if superEntityClass??>
public class ${entity} extends ${superEntityClass}<#if activeRecord><${entity}></#if> {
<#elseif activeRecord>
public class ${entity} extends Model<${entity}> {
<#else>
public class ${entity} implements Serializable {
</#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(value = "${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
protected 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>
}
结构目录
在mybatis-plus.properties文件修改好配置文件,执行CodeGenerator就会生成代码啦
扩展:
时区查看
show variables like '%time_zone%';
时区修改设置为 东八区
set global time_zone = '+8:00';
参考链接:
https://www.bookstack.cn/read/mybatis-plus-3.x/spilt.3.4267953fc3057caf.md
https://mp.baomidou.com/guide/generator-new.html#%E8%AF%B4%E6%98%8E