Mybatis-plus 代码自动生成器

代码自动生成器


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值