【MyBatis-Plus】代码生成器使用介绍和自定义设置

环境介绍

开发依赖版本
Spring Boot3.0.6
Mybatis-Plus3.5.3.1
JDK20

主要的pom依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

不生成Controller类

没有找到对应的开关配置,经过查看源码发现PathInfoHandler这个类

    private void putPathInfo(String template, OutputFile outputFile, String module) {
        if (StringUtils.isNotBlank(template)) {
            putPathInfo(outputFile, module);
        }
    }

    /**
     * 设置默认输出路径
     *
     * @param globalConfig   全局配置
     * @param templateConfig 模板配置
     */
    private void setDefaultPathInfo(GlobalConfig globalConfig, TemplateConfig templateConfig) {
        putPathInfo(templateConfig.getEntity(globalConfig.isKotlin()), OutputFile.entity, ConstVal.ENTITY);
        putPathInfo(templateConfig.getMapper(), OutputFile.mapper, ConstVal.MAPPER);
        putPathInfo(templateConfig.getXml(), OutputFile.xml, ConstVal.XML);
        putPathInfo(templateConfig.getService(), OutputFile.service, ConstVal.SERVICE);
        putPathInfo(templateConfig.getServiceImpl(), OutputFile.serviceImpl, ConstVal.SERVICE_IMPL);
        putPathInfo(templateConfig.getController(), OutputFile.controller, ConstVal.CONTROLLER);
        putPathInfo(OutputFile.parent, ConstVal.PARENT);
    }

可以看出,只要把TemplateConfig这个类的controller设置为空,就不会生成Controller类了,于是解决方案如下

FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(dbUrl, dbUser, dbPassword);
fastAutoGenerator.templateConfig((scanner, builder) -> builder
    // 设置空,则不会生成Controller类
    .controller(""));

生成的Service接口不继承任何接口

  • 由于代码生成器用到了模板引擎,本文示例使用的是freemarker模板引擎,因此,复制mybatis-plus-generator-3.5.3.1.jar/templates/service.java.ftl这个文件到src/main/resources/templates/service.java.ftl,然后修改后的内容如下
package ${package.Service};

/**
 * <p>
 * ${table.comment!} 服务类
 * </p>
 *
 * @author ${author}
 * @since ${date}
 */
<#if kotlin>
interface ${table.serviceName}
<#else>
public interface ${table.serviceName} {

}
</#if>
  • 在代码生成器中指定service模板文件
FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(dbUrl, dbUser, dbPassword);
fastAutoGenerator.templateConfig((scanner, builder) -> builder
  // 设置空,则不会生成Controller类
  .controller("")
  .service("templates/service.java")
);

去掉表名前缀

FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(dbUrl, dbUser, dbPassword);
fastAutoGenerator.strategyConfig((scanner, builder) -> builder
      // 根据指定的表名范围生成对应的类
      .addInclude(tables)
      // 去掉表中的前缀
      .addTablePrefix(tablePrefix)
);

主键类型设置为自动增长

FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(dbUrl, dbUser, dbPassword);
fastAutoGenerator.strategyConfig((scanner, builder) -> builder
    .entityBuilder()
    // 开启覆盖已生成的文件
    .enableFileOverride()
    // 主键类型设置为自动增长
    .idType(IdType.AUTO)
);

实体类不实现Serializable接口

FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(dbUrl, dbUser, dbPassword);
fastAutoGenerator.strategyConfig((scanner, builder) -> builder
    .entityBuilder()
    // 禁用生成 serialVersionUID
    .disableSerialVersionUID()
);

指定时间类型

FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(dbUrl, dbUser, dbPassword);
fastAutoGenerator.strategyConfig((scanner, builder) -> builder
    .enableTableFieldAnnotation()
    // 会在实体类的该字段上追加注解[@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)]
    .addTableFills(new Column("updated_time", FieldFill.INSERT_UPDATE),
      new Column("update_time", FieldFill.INSERT_UPDATE))
);

完整代码参考

package com.wen3.demo.mybatisplus;

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.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * @author tangheng
 */
public class MybatisPlusGenerator {

    public static void main(String[] args) {
        String dbUrl = "jdbc:h2:tcp://localhost/D:/ProgramFiles/h2database/data/test;MODE=MYSQL;";
        String dbUser = "";
        String dbPassword = "";
        String author = "tangheng";
        String parentPackageName = "com.wen3.demo.mybatisplus";
        List<String> tables = Arrays.asList("USER", "XXL_JOB_GROUP");
        List<String> tablePrefix = Arrays.asList("SYS_", "XXL_");

        String PROJECT_ROOT_PATH = "G:\\projects-blog\\wen3-framework-demo\\wen3-framework-orm-demo\\wen3-framework-mybatis-plus-demo";
        String BASE_PATH = PROJECT_ROOT_PATH + "/src/main/java/com/wen3/demo/mybatisplus";
        // 六个文件的路径
        String entityPath = BASE_PATH + "/po";
        String mapperPath = BASE_PATH + "/dao";
        String mapperXmlPath = PROJECT_ROOT_PATH + "/src/main/resources/mapper";
        String servicePath = BASE_PATH + "/service";
        String serviceImplPath = BASE_PATH + "/service/impl";
        String controllerPath = BASE_PATH + "/controller";

        FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(dbUrl, dbUser, dbPassword);
        fastAutoGenerator.globalConfig(builder -> builder
                        // 作者名称
                        .author(author)
                        // 禁止打开输出目录
                        .disableOpenDir()
                        // 指定输出目录
                        // .outputDir(packagePath)
                        // 开启swagger2。注释掉则默认关闭。
//                        .enableSwagger()
                        // 时间策略
                        .dateType(DateType.TIME_PACK)
                        // 时间格式
                        .commentDate("yyyy-MM-dd")
                )
                .templateConfig((scanner, builder) -> builder
                        // 设置空,则不会生成Controller类
                        .controller("")
                        .service("templates/service.java")
                )
                .packageConfig((scanner, builder) -> builder
                        // 阶段1:各个文件的包名设置,用来拼接每个java文件的第一句:package com.XXX.XXX.XXX.xxx;
                        // 父包名配置
                        .parent(parentPackageName)
                        .entity("po")
                        .mapper("dao")
                        .service("service")
                        .serviceImpl("service.impl")
//                        .other("other")
                        // 阶段2:所有文件的生成路径配置
                        .pathInfo(
                                new HashMap<OutputFile, String>() {{
                                    // 实体类的保存路径
                                    put(OutputFile.entity, entityPath);
                                    // mapper接口的保存路径
                                    put(OutputFile.mapper, mapperPath);
                                    // mapper.xml文件的保存路径
                                    put(OutputFile.xml, mapperXmlPath);
                                    // service层接口的保存路径
                                    put(OutputFile.service, servicePath);
                                    // service层接口实现类的保存路径
                                    put(OutputFile.serviceImpl, serviceImplPath);
                                    // 控制类的保存路径
                                    put(OutputFile.controller, controllerPath);
                                }}
                        )
                )
                .strategyConfig((scanner, builder) -> builder
                        // 根据指定的表名范围生成对应的类
                        .addInclude(tables)
                        // 去掉表中的前缀
                        .addTablePrefix(tablePrefix)

                        // 阶段1:Entity实体类策略配置
                        .entityBuilder()
                        // 开启覆盖已生成的文件
                        .enableFileOverride()
                        // 主键类型设置为自动增长
                        .idType(IdType.AUTO)

                        // 设置父类。会在生成的实体类名后:extends BaseEntity
                        // .superClass(BaseEntity.class)
                        // 禁用生成 serialVersionUID。(不推荐禁用)
                         .disableSerialVersionUID()
                        // 开启生成字段常量。
                        // 会在实体类末尾生成一系列 [public static final String NICKNAME = "nickname";] 的语句。(一般在写wapper时,会用到)
                        // .enableColumnConstant()
                        // 开启链式模型。
                        // 会在实体类前添加 [@Accessors(chain = true)] 注解。用法如 [User user=new User().setAge(31).setName("snzl");](这是Lombok的注解,需要添加Lombok依赖)
                        .enableChainModel()
                        // 开启 lombok 模型。
                        // 会在实体类前添加 [@Getter] 和 [@Setter] 注解。(这是Lombok的注解,需要添加Lombok依赖)
                        .enableLombok()
                        // 开启 Boolean 类型字段移除 is 前缀。
                        // .enableRemoveIsPrefix()
                        // 开启生成实体时生成字段注解。
                        // 会在实体类的属性前,添加[@TableField("nickname")]
                        .enableTableFieldAnnotation()
                        // 逻辑删除字段名(数据库)。
//                        .logicDeleteColumnName("is_delete")
                        // 逻辑删除属性名(实体)。
                        // 会在实体类的该字段属性前加注解[@TableLogic]
//                        .logicDeletePropertyName("isDelete")
                        // 数据库表映射到实体的命名策略(默认下划线转驼峰)。一般不用设置
                        // .naming(NamingStrategy.underline_to_camel)
                        // 数据库表字段映射到实体的命名策略(默认为 null,未指定按照 naming 执行)。一般不用设置
                        // .columnNaming(NamingStrategy.underline_to_camel)
                        // 添加父类公共字段。
                        // 这些字段不会出现在新增的实体类中。
//                        .addSuperEntityColumns("id", "delete_time")
                        // 添加忽略字段。
                        // 这些字段不会出现在新增的实体类中。
                        // .addIgnoreColumns("password")
                        // 添加表字段填充
                        // 会在实体类的该字段上追加注解[@TableField(value = "create_time", fill = FieldFill.INSERT)]
                        .addTableFills(new Column("created_time", FieldFill.INSERT))
                        // 会在实体类的该字段上追加注解[@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)]
                        .addTableFills(new Column("updated_time", FieldFill.INSERT_UPDATE))
                        // 全局主键类型。如果MySQL主键设置为自增,则不需要设置此项。
                        // .idType(IdType.AUTO)
                        // 格式化文件名称。
                        // 如果不设置,如表[sys_user]的实体类名是[SysUser]。设置成下面这样,将是[SysUserEntity]
                        .formatFileName("%sPo")

                        // 阶段2:Mapper策略配置
                        .mapperBuilder()
                        // 开启覆盖已生成的文件
                        .enableFileOverride()
                        // 设置父类
                        // 会在mapper接口方法集成[extends BaseMapper<XXXEntity>]
                        .superClass(BaseMapper.class)
                        // 开启 @Mapper 注解。
                        // 会在mapper接口上添加注解[@Mapper]
//                        .enableMapperAnnotation()
                        // 启用 BaseResultMap 生成。
                        // 会在mapper.xml文件生成[通用查询映射结果]配置。
                        .enableBaseResultMap()
                        // 启用 BaseColumnList。
                        // 会在mapper.xml文件生成[通用查询结果列 ]配置
                        .enableBaseColumnList()
                        // 设置缓存实现类
                        // .cache(MyMapperCache.class)
                        // 格式化 mapper 文件名称。
                        // 如果不设置,如表[sys_user],默认的文件名是[SysUserMapper]。写成下面这种形式后,将变成[SysUserDao]。
                        // .formatMapperFileName("%sDao")
                        // 格式化 xml 实现类文件名称。
                        // 如果不设置,如表[sys_user],默认的文件名是[SysUserMapper.xml],写成下面这种形式后,将变成[SysUserXml.xml]。
                        // .formatXmlFileName("%sXml")

                        // 阶段3:Service策略配置
                         .serviceBuilder()
                        .enableFileOverride()
                        // 设置 service 接口父类
                         .superServiceClass(IService.class)
                        // 设置 service 实现类父类
                         .superServiceImplClass(ServiceImpl.class)
                        // 格式化 service 接口文件名称
                        // 如果不设置,如表[sys_user],默认的是[ISysUserService]。写成下面这种形式后,将变成[SysUserService]。
                         .formatServiceFileName("%sService")
                        // 格式化 service 实现类文件名称
                        // 如果不设置,如表[sys_user],默认的是[SysUserServiceImpl]。
                         .formatServiceImplFileName("%sServiceImpl")

                        // 阶段4:Controller策略配置
//                        .controllerBuilder()
                        // 设置父类。
                        // 会集成此父类。
                        // .superClass(BaseController.class)
                        // 开启生成 @RestController 控制器
                        // 会在控制类中加[@RestController]注解。
//                        .enableRestStyle()
                        // 开启驼峰转连字符
//                        .enableHyphenStyle()

                        // 最后:构建
                        .build()
                )

                //模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
                //.templateEngine(new BeetlTemplateEngine())
                .templateEngine(new FreemarkerTemplateEngine())

                // 执行
                .execute();
    }
}

运行代码生成器

Connected to the target VM, address: '127.0.0.1:54596', transport: 'socket'
23:04:26.865 [main] DEBUG com.baomidou.mybatisplus.generator.AutoGenerator -- ==========================准备生成文件...==========================
23:04:27.703 [main] DEBUG com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine -- 模板:/templates/entity.java.ftl;  文件:G:\xxx\po\UserPo.java
23:04:27.712 [main] DEBUG com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine -- 模板:/templates/mapper.java.ftl;  文件:G:\xxx\dao\UserMapper.java
23:04:27.722 [main] DEBUG com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine -- 模板:/templates/mapper.xml.ftl;  文件:G:\projects-blog\wen3-framework-demo\wen3-framework-orm-demo\wen3-framework-mybatis-plus-demo\src\main\resources\mapper\UserMapper.xml
23:04:27.760 [main] DEBUG com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine -- 模板:templates/service.java.ftl;  文件:G:\xxx\service\UserService.java
23:04:27.769 [main] DEBUG com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine -- 模板:/templates/serviceImpl.java.ftl;  文件:G:\xxx\service\impl\UserServiceImpl.java
23:04:27.770 [main] DEBUG com.baomidou.mybatisplus.generator.AutoGenerator -- ==========================文件生成完成!!!==========================
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太空眼睛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值