Mybatis plus 自动生成代码与自定义模板

Generate 基础使用


MyBatis-Plus-Generate

部分笔记,参考官网资料

笔记只讲解基础的使用,更详细的推荐大家阅读官网

一. 自动生成代码落地与展示


⭐️源码https://gitee.com/zhp1221/java/tree/master/lab_02_mybatis_plus/generate


⭐️相关概念说明:

  1. 全局配置:配置数据库相关信息及个人信息

  2. 包配置:配置controller,entity,mapper,mapper.xml,service,serviceImpl,Other生成的包路径

    Other:自定义模板,详细可看自定义模板讲解,在第二节里

  3. 策略配置:表相关信息配置信息

    ps: 配置字段,文件名称等等

    策略配置细分为:

    1. Entity 策略配置
    2. Controller 策略配置
    3. Service 策略配置
    4. Mapper 策略配置

ps:配置完这些就可轻松使用代码生成了


代码目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VBlfsF6P-1659089700947)(Generate 使用.assets/image-20220729174151509.png)]

代码生成总代码

/**
* 代码生成
*/
public static void generate() {

    FastAutoGenerator.create("jdbc:mysql://localhost:3306/community_db?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC",
                             "root",
                             "root")

        // 全局配置
        .globalConfig(builder -> {
            builder
                .enableSwagger() // 是否启用swagger注解
                .author("zhanghp") // 作者名称
                .dateType(DateType.ONLY_DATE) // 时间策略
                .commentDate("yyyy-MM-dd") // 注释日期
                .outputDir("C:\\Dpan\\workspace\\study\\Ibatis_generate\\src\\main\\java") // 输出目录
                .fileOverride() // 覆盖已生成文件
                .disableOpenDir(); // 生成后禁止打开所生成的系统目录
        })

        // 包配置
        .packageConfig(builder -> {
            builder
                .parent("com.zhanghp") // 父包名
                .moduleName("test") // 模块包名
                .entity("dao.entity") // 实体类包名
                .service("service") // service包名
                .serviceImpl("service.impl") // serviceImpl包名
                .mapper("dao.mapper") // mapper包名
                .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "C:\\Dpan\\workspace\\study\\Ibatis_generate\\src\\main\\resources\\mappers")) // xml位置(还可自定义配置entity,service等位置)
                .controller("controller") // controller包名
                .other("model"); // 自定义包名
        })

        // 策略配置
        .strategyConfig(builder -> {
            builder
                .addTablePrefix("t_") // 增加过滤表前缀
                .addTableSuffix("_db") // 增加过滤表后缀
                .addFieldPrefix("t_") // 增加过滤字段前缀
                .addFieldSuffix("_field") // 增加过滤字段后缀
                .addInclude("test") // 表匹配

                // Entity 策略配置
                .entityBuilder()
                .enableLombok() // 开启lombok
                .enableChainModel() // 链式
                .enableRemoveIsPrefix() // 开启boolean类型字段移除is前缀
                .enableTableFieldAnnotation() //开启生成实体时生成的字段注解
                .versionColumnName("version") // 乐观锁数据库字段
                .versionPropertyName("version") // 乐观锁实体类名称
                .logicDeleteColumnName("is_deleted") // 逻辑删除数据库中字段名
                .logicDeletePropertyName("deleted") // 逻辑删除实体类中的字段名
                .naming(NamingStrategy.underline_to_camel) // 表名 下划线 -》 驼峰命名
                .columnNaming(NamingStrategy.underline_to_camel) // 字段名 下划线 -》 驼峰命名
                .idType(IdType.ASSIGN_ID) // 主键生成策略 雪花算法生成id
                .formatFileName("%s") // Entity 文件名称
                .addTableFills(new Column("create_time", FieldFill.INSERT)) // 表字段填充
                .addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE)) // 表字段填充
                .enableColumnConstant()
                .enableActiveRecord()

                // Controller 策略配置
                .controllerBuilder()
                .enableRestStyle() // 开启@RestController
                .formatFileName("%sController") // Controller 文件名称

                // Service 策略配置
                .serviceBuilder()
                .formatServiceFileName("%sService") // Service 文件名称
                .formatServiceImplFileName("%sServiceImpl") // ServiceImpl 文件名称

                // Mapper 策略配置
                .mapperBuilder()
                .enableMapperAnnotation() // 开启@Mapper
                .enableBaseColumnList() // 启用 columnList (通用查询结果列)
                .enableBaseResultMap() // 启动resultMap
                .formatMapperFileName("%sMapper") // Mapper 文件名称
                .formatXmlFileName("%sMapper"); // Xml 文件名称
        })
        .execute(); // 执行
}

生成结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eh25lajZ-1659089700948)(Generate 使用.assets/image-20220729174905244.png)]


二. 分析生成代码

2.1 数据库相关配置

属性说明示例
urljdbc 路径jdbc:mysql://localhost:3306/community_db
username数据库账号root
password数据库密码root
FastAutoGenerator.create("jdbc:mysql://localhost:3306/community_db?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC",
                        "root",
                        "root")

2.2 全局配置(GlobalConfig)

方法说明示例
enableSwagger开启 swagger注解默认值:false
author作者baomidou 默认值:作者
dateType(DateType)时间策略DateType.ONLY_DATE 默认值: DateType.TIME_PACK
commentDate(String)注释日期默认值: yyyy-MM-dd
outputDir(String)指定输出目录/opt/baomidou/ 默认值: windows:D:// linux or mac : /tmp
fileOverride覆盖已生成文件默认值:false
disableOpenDir代码生成后,是否打开输出盘符文件夹默认值:true

代码

// 全局配置
.globalConfig(builder -> {
    builder
        .enableSwagger() // 是否启用swagger注解
        .author("zhanghp") // 作者名称
        .dateType(DateType.ONLY_DATE) // 时间策略
        .commentDate("yyyy-MM-dd") // 注释日期
        .outputDir("C:\\Dpan\\workspace\\study\\Ibatis_generate\\src\\main\\java") // 输出目录
        .fileOverride() // 覆盖已生成文件
        .disableOpenDir(); // 生成后禁止打开所生成的系统目录
})

2.3 包配置(PackageConfig)

方法说明示例
parent(String)父包名默认值:com.baomidou
moduleName(String)父包模块名默认值:无
entity(String)Entity 包名默认值:entity
service(String)Service 包名默认值:service
serviceImpl(String)Service Impl 包名默认值:service.impl
mapper(String)Mapper 包名默认值:mapper
controller(String)Controller 包名默认值:controller
other(String)自定义文件包名输出自定义文件时所用到的包名
pathInfo(Map<OutputFile, String>)路径输出指定文件夹配置信息Collections.singletonMap(OutputFile.mapperXml, “D://”)

代码演示

// 包配置
.packageConfig(builder -> {
    builder
        .parent("com.zhanghp") // 父包名
        .moduleName("test") // 模块包名
        .entity("dao.entity") // 实体类包名
        .service("service") // service包名
        .serviceImpl("service.impl") // serviceImpl包名
        .mapper("dao.mapper") // mapper包名
        .controller("controller") // controller包名
        .other("model") // 自定义包名
        .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "C:\\Dpan\\workspace\\study\\Ibatis_generate\\src\\main\\resources\\mappers")); // xml位置
})

2.4 策略配置(StrategyConfig)

方法说明
addTablePrefix(String…)增加过滤表前缀
addTableSuffix(String…)增加过滤表后缀
addFieldPrefix(String…)增加过滤字段前缀
addFieldSuffix(String…)增加过滤字段后缀
addInclude(String…)增加表匹配(内存过滤)

代码演示

.strategyConfig(builder -> {
    builder
        .addTablePrefix("t_") // 增加过滤表前缀
        .addTableSuffix("_db") // 增加过滤表后缀
        .addFieldPrefix("t_") // 增加过滤字段前缀
        .addFieldSuffix("_field") // 增加过滤字段后缀
        .addInclude("test") // 表匹配

2.4.5 Entity 策略配置
方法说明示例
enableLombok开启 lombok 模型默认值:false
enableChainModel开启链式模型默认值:false
enableRemoveIsPrefix开启 Boolean 类型字段移除 is 前缀默认值:false
enableTableFieldAnnotation开启生成实体时生成字段注解默认值:false
versionColumnName(String)乐观锁字段名(数据库)
versionPropertyName(String)乐观锁属性名(实体)
logicDeleteColumnName(String)逻辑删除字段名(数据库)
logicDeletePropertyName(String)逻辑删除属性名(实体)
naming数据库表映射到实体的命名策略默认下划线转驼峰命名:NamingStrategy.underline_to_camel
columnNaming数据库表字段映射到实体的命名策略默认为 null,未指定按照 naming 执行
convertFileName(ConverterFileName)转换文件名称
idType(IdType)全局主键类型
formatFileName(String)格式化文件名称
addTableFills(IFill…)添加表字段填充
addTableFills(List)添加表字段填充
enableColumnConstant开启生成字段常量默认值:false
enableActiveRecord开启 ActiveRecord 模型默认值:false

代码演示

// Entity 策略配置
.entityBuilder()
    .enableLombok() // 开启lombok
    .enableChainModel() // 链式
    .enableRemoveIsPrefix() // 开启boolean类型字段移除is前缀
    .enableTableFieldAnnotation() //开启生成实体时生成的字段注解
    .versionColumnName("version") // 乐观锁数据库字段
    .versionPropertyName("version") // 乐观锁实体类名称
    .logicDeleteColumnName("is_deleted") // 逻辑删除数据库中字段名
    .logicDeletePropertyName("deleted") // 逻辑删除实体类中的字段名
    .naming(NamingStrategy.underline_to_camel) // 表名 下划线 -》 驼峰命名
    .columnNaming(NamingStrategy.underline_to_camel) // 字段名 下划线 -》 驼峰命名
    .idType(IdType.ASSIGN_ID) // 主键生成策略 雪花算法生成id
    .formatFileName("%s") // Entity 文件名称
    .addTableFills(new Column("create_time", FieldFill.INSERT)) // 表字段填充
    .addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE)) // 表字段填充
    .enableColumnConstant()
    .enableActiveRecord()

2.4.6 Controller 策略配置
方法说明示例
enableRestStyle开启生成@RestController 控制器默认值:false
formatFileName(String)格式化文件名称

代码演示

// Controller 策略配置
.controllerBuilder()
    .enableRestStyle() // 开启@RestController
    .formatFileName("%sController") // Controller 文件名称

2.4.7 Service 策略配置
方法说明
formatServiceFileName(String)格式化 service 接口文件名称
formatServiceImplFileName(String)格式化 service 实现类文件名称

代码演示

// Service 策略配置
.serviceBuilder()
    .formatServiceFileName("%sService") // Service 文件名称
    .formatServiceImplFileName("%sServiceImpl") // ServiceImpl 文件名称

2.4.8 Mapper 策略配置
方法说明示例
enableMapperAnnotation开启 @Mapper 注解默认值:false
enableBaseResultMap启用 BaseResultMap 生成默认值:false
enableBaseColumnList启用 BaseColumnList默认值:false
formatMapperFileName(String)格式化 mapper 文件名称
formatXmlFileName(String)格式化 xml 实现类文件名称

代码演示

// Mapper 策略配置
.mapperBuilder()
    .enableMapperAnnotation() // 开启@Mapper
    .enableBaseColumnList() // 启用 columnList (通用查询结果列)
    .enableBaseResultMap() // 启动resultMap
    .formatMapperFileName("%sMapper") // Mapper 文件名称
    .formatXmlFileName("%sMapper"); // Xml 文件名称

三. 额外扩展

3.1 自定义模板

3.1.1 流程
Velocity 语法学习
注入配置-自定义模板配置
源码增强自定义配置
velocity 部分展示
3.1.2 前置知识

Velocity语法教学

http://www.51gjie.com/javaweb/896.html

# 自定义模板使用的是Velocity模板引擎(也可使用Freemarker)
- 需提前学习Velocity相关语法(语法很简单)
- ps:velocity的注释在一行中一定要顶头(否则生成的java,会在格式中多空格)

3.1.3 注入配置(InjectionConfig)
方法说明示例
customMap(Map<String, Object>)自定义配置 Map 对象Collections.singletonMap(“test”, “baomidou”)
customFile(Map<String, String>)自定义配置模板文件Collections.singletonMap(“test.txt”, “/templates/test.vm”)

代码演示

customMap我是基于源码增强的,所以没有在InjecttionConfig中配置

ps:自定义模板和map,是根据本人在公司项目中的使用所需进行的封装

// 注入配置
.injectionConfig(builder -> {

    // tag::custom file
    // 自定义vo,ro,qo等数据模型
    Map<String, String> customFile = new HashMap<>();
    customFile.put(CustomEnum.VO.getModelSuffix(), CustomEnum.VO.getPath());
    customFile.put(CustomEnum.RO.getModelSuffix(), CustomEnum.RO.getPath());
    customFile.put(CustomEnum.QO.getModelSuffix(), CustomEnum.QO.getPath());
    // 自定义MapStruct
    customFile.put(CustomEnum.CONVERTER.getModelSuffix(), CustomEnum.CONVERTER.getPath());
    // end::custom file

    builder
        .customFile(customFile); // 自定义模板
})
.templateEngine(new EnhanceVelocityTemplaEngine())

CustomEnum

注入配置中所引用的类

封装模块后缀,模板路径的枚举类

public enum CustomEnum {
    VO("VO", "templates/model/vo.java.vm"),
    RO("RO", "templates/model/ro.java.vm"),
    QO("QO", "templates/model/qo.java.vm"),
    CONVERTER("Converter", "templates/converter/converter.java.vm");

    CustomEnum(String modelSuffix, String path) {
        this.modelSuffix = modelSuffix;
        this.path = path;
    }

    @Getter
    private String modelSuffix;

    @Getter
    private String path;

    public static List<String> getModel(){
        List<String> result = new ArrayList<>();
        CustomEnum[] values = CustomEnum.values();
        for (CustomEnum it : values) {
            result.add(it.getModelSuffix());
        }
        return result;
    }
}

3.1.4 源码增强map和输出路径

内部类 - EnhanceVelocityTemplateEngine

getObjectMap:自定义包路径,返回结果,工具类等

outputCustomFile:输出路径封装

/**
* 代码生成器支持自定义[DTO\VO等]模版
 */
public final static class EnhanceVelocityTemplateEngine extends VelocityTemplateEngine {
        @Override
        public Map<String, Object> getObjectMap(@NotNull ConfigBuilder config, @NotNull TableInfo tableInfo) {
            // 获取实体类名字
            String entityName = tableInfo.getEntityName();
            // 获取object map
            Map<String, Object> objectMap = super.getObjectMap(config, tableInfo);
            // 获取Other的盘符路径
            String otherPath = (String)((Map<String, Object>) objectMap.get("package")).get("Other");
            // 自定义枚举
            List<String> modelList = CustomEnum.getModel();
            // 循环
            modelList.forEach(it -> {
                // 转小写
                String var = it.toLowerCase();
                // 存入object map
                objectMap.put(var, otherPath + "." + var + "." + entityName + it);
            });
            // 自定义converter
            objectMap.put("commonConverter", "com.zhanghp.common.converter.CommonConverter");
            // converter utils
            objectMap.put("converterUtil", "com.zhanghp.common.converter.utils.ConverterUtil");
            // 分页
            objectMap.put("pageParent", "com.zhanghp.common.model.PageParent");
            // utils
            objectMap.put("objectUtils", "com.zhanghp.common.utils.ObjectUtils");
            // 返回结果封装
            objectMap.put("r", "com.zhanghp.common.response.R");
            return objectMap;
        }

        @Override
        protected void outputCustomFile(@NotNull Map<String, String> customFile, @NotNull TableInfo tableInfo, @NotNull Map<String, Object> objectMap) {
            // 获取实体类名字
            String entityName = tableInfo.getEntityName();
            // 获取other包盘符路径
            String otherPath = this.getPathInfo(OutputFile.other);
            // 输出自定义java模板
            customFile.forEach((key, value) -> {
                // 输出路径
                String fileName = otherPath + File.separator + key.toLowerCase() + File.separator + entityName + key +".java";
                // 输出velocity的java模板
                this.outputFile(new File(fileName), objectMap, value);
            });
        }
    }

3.1.5 Velocity 部分展示

controller层引擎模板

更多的代码,可clone我的代码,详细看别的velocity模板用法

package ${package.Controller};


#if(${swagger})
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiOperation;
#end
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import ${package.Service}.${table.serviceName};
import ${ro};
import ${qo};
import ${r};

## 判断是否包含父类
#if(${superControllerClassPackage})
import ${superControllerClassPackage};
#end

/**
 * <p>
 * $!{table.comment} controller
 * </p>
 *
 * @author ${author}
 * @since ${date}
 */
@RequiredArgsConstructor(onConstructor_ = @Autowired)
## swagger相关
#if(${swagger})
@Api(tags = "REST - $!{table.comment}")
#end
## controller注解
#if(${restControllerStyle})
@RestController
#else
@Controller
#end
## 请求地址
@RequestMapping("#if(${package.ModuleName})/${package.ModuleName}#end/#if(${controllerMappingHyphenStyle})${controllerMappingHyphen}#else${table.entityPath}#end")
## 类名及继承判断
#if(${superControllerClass})
public class ${table.controllerName} extends ${superControllerClass} {
#else
public class ${table.controllerName} {
#end
## 注入服务类
    private final ${table.serviceName} service;

## 主键类型判断
#foreach($field in ${table.fields})
    #if(${field.keyFlag})
## 主键类型
        #set($idType=${field.propertyType})
## 主键名称
        #set($idName=${field.propertyName})
## 跳出
        #break
    #end
#end
    @PostMapping("/create")
#if(${swagger})
    @ApiOperation(value = "新增")
#end
    public R createOne(@RequestBody ${entity}RO ro){
        boolean flag = service.create(ro);
        return R.judgeR(flag, flag ? "创建成功" : "创建失败");
    }

    @DeleteMapping("/delete/{${idName}}")
#if(${swagger})
    @ApiOperation(value = "删除")
#end
    public R delete(@PathVariable("${idName}")${idType} ${idName}){
        boolean flag = service.delete(${idName});
        return R.judgeR(flag, flag ? "删除成功" : "删除失败");
    }

    @PutMapping("/update")
#if(${swagger})
    @ApiOperation(value = "修改")
#end
    public R update(@RequestBody ${entity}RO ro){
        boolean flag = service.update(ro);
        return R.judgeR(flag, flag ? "修改成功" : "修改失败");
    }

    @GetMapping("/{${idName}}")
#if(${swagger})
    @ApiOperation(value = "单条查询")
#end
    public R getOne(@PathVariable("${idName}")${idType} ${idName}){

        return R.success(service.getById(${idName}));
    }

    @PostMapping("/findList")
#if(${swagger})
    @ApiOperation(value = "列表查询")
#end
    public R findList(@RequestBody ${entity}QO qo){

        return R.success(service.findList(qo));
    }

    @PostMapping("/findPage")
#if(${swagger})
    @ApiOperation(value = "分页查询")
#end
    public R findPage(@RequestBody ${entity}QO qo){

        return R.success(service.findPage(qo));
    }

}

3.2 交互式生成代码

/**
 * <p>
 *     代码生成:输入生成
 * </p>
 * <p>
 * <a href = "https://baomidou.com/pages/981406/#%E6%95%B0%E6%8D%AE%E5%BA%93%E9%85%8D%E7%BD%AE-datasourceconfig">
 * mybatis-plus generator
 * </a>
 * </p>
 *
 * @author zhanghp
 * @date 2022-07-16 14:53
 */
public class IbatisScannerGenerate {

    public static void main(String[] args) {
        generate();
    }
    /**
     * 代码生成
     */
    private static void generate() {

        FastAutoGenerator.create("jdbc:mysql://localhost:3306/community_db?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC",
                        "root",
                        "root")

                // 全局配置
                .globalConfig((scanner, builder) -> {
                    builder
                            .enableSwagger() // 是否启用swagger注解
                            .author(scanner.apply("请输入作者名称")) // 作者名称
                            .dateType(DateType.ONLY_DATE) // 时间策略
                            .commentDate("yyyy-MM-dd") // 注释日期
                            .outputDir(scanner.apply("请输入-》指定输出目录")) // 输出目录
                            .fileOverride() // 覆盖已生成文件
                            .disableOpenDir(); // 生成后禁止打开所生成的系统目录
                })

                // 包配置
                .packageConfig((scanner, builder) -> {
                    builder
                            .parent(scanner.apply("清楚如父包路径,如com.***.***")) // 父包名
                            .moduleName(scanner.apply("请输入模块名称")) // 模块包名
                            .entity(scanner.apply("请输入实体类包名")) // 实体类包名
                            .service(scanner.apply("请输入Service层包名")) // service包名
                            .serviceImpl(scanner.apply("请输入ServiceImpl包名")) // serviceImpl包名
                            .mapper(scanner.apply("请输入Mapper层包名")) // mapper包名
                            .controller(scanner.apply("请输入controller层包名")) // controller包名
                            .other(scanner.apply("请输入自定义包名")); // 自定义包名
                })

                // 策略配置
                .strategyConfig((scanner, builder) -> {
                    builder
                            .addTablePrefix(scanner.apply("请输入所要过滤的表前缀")) // 增加过滤表前缀
                            .addTableSuffix(scanner.apply("请输入所要过滤的表后缀")) // 增加过滤表后缀
                            .addFieldPrefix(scanner.apply("请输入所要过滤字段前缀")) // 增加过滤字段前缀
                            .addFieldSuffix(scanner.apply("请输入所要过滤字段后缀")) // 增加过滤字段后缀
                            .addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all"))) // 表匹配

                            // Entity 策略配置
                            .entityBuilder()
                            .enableLombok() // 开启lombok
                            .enableChainModel() // 链式
                            .enableRemoveIsPrefix() // 开启boolean类型字段移除is前缀
                            .enableTableFieldAnnotation() //开启生成实体时生成的字段注解
                            .versionColumnName(scanner.apply("请输入数据库中的乐观锁字段")) // 乐观锁数据库字段
                            .versionPropertyName(scanner.apply("请输入字段中的乐观锁名称")) // 乐观锁实体类名称
                            .logicDeleteColumnName(scanner.apply("请输入数据库中的逻辑删除字段")) // 逻辑删除数据库中字段名
                            .logicDeletePropertyName(scanner.apply("请输入数据库中的实体名称")) // 逻辑删除实体类中的字段名
                            .naming(NamingStrategy.underline_to_camel) // 表名 下划线 -》 驼峰命名
                            .columnNaming(NamingStrategy.underline_to_camel) // 字段名 下划线 -》 驼峰命名
                            .idType(IdType.ASSIGN_ID) // 主键生成策略 雪花算法生成id
                            .formatFileName("%s") // Entity 文件名称
                            .addTableFills(new Column("create_time", FieldFill.INSERT)) // 表字段填充
                            .addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE)) // 表字段填充

                            // Controller 策略配置
                            .controllerBuilder()
                            .enableRestStyle() // 开启@RestController
                            .formatFileName("%sController") // Controller 文件名称

                            // Service 策略配置
                            .serviceBuilder()
                            .formatServiceFileName("%sService") // Service 文件名称
                            .formatServiceImplFileName("%sServiceImpl") // ServiceImpl 文件名称

                            // Mapper 策略配置
                            .mapperBuilder()
                            .enableMapperAnnotation() // 开启@Mapper
                            .enableBaseColumnList() // 启用 columnList (通用查询结果列)
                            .enableBaseResultMap() // 启动resultMap
                            .formatMapperFileName("%sMapper") // Mapper 文件名称
                            .formatXmlFileName("%sMapper"); // Xml 文件名称
                })

                // 注入配置
                .injectionConfig((scanner, builder) -> {
                    // 自定义vo,ro,qo等数据模型
                    Map<String, String> customFile = new HashMap<>();
                    customFile.put("VO.java", "templates/model/vo.java.vm");
                    customFile.put("RO.java", "templates/model/ro.java.vm");
                    customFile.put("QO.java", "templates/model/qo.java.vm");
                    customFile.put("URO.java", "templates/model/uro.java.vm");
                    // 自定义MapStruct
                    customFile.put("Converter.java", "templates/converter/converter.java.vm");

                    // 自定义配置对象
                    Map<String, Object> customMap = new HashMap<>();
                    customMap.put("vo", "VO");
                    customMap.put("ro", "RO");
                    customMap.put("qo", "QO");
                    customMap.put("uro", "URO");
                    builder
                            .customFile(customFile) // 自定义模板
                            .customMap(customMap); // 自定义map
                });


    }

    // 处理 all 情况
    protected static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }
}

⭐️源码https://gitee.com/zhp1221/java/tree/master/lab_02_mybatis_plus/generate


  • 26
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
MyBatis-Plus代码生成器提供了自定义模板的功能,可以根据自己的需求生成对应的代码。下面是自定义模板的处理步骤: 1. 在代码生成器的配置文件中,设置自定义模板的路径。例如: ``` <property name="templatePath" value="/templates/mybatis-plus"/> ``` 2. 在自定义模板路径下创建对应的模板文件。例如,创建一个模板文件 `Entity.java.vm`,用于生成实体类的代码。 3. 在模板文件中使用 Velocity 模板语言,编写生成代码的逻辑。例如: ``` package ${package_name}.${module_name}.entity; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; /** * <p> * ${table_comment} * </p> */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("${table_name}") public class ${entity_name} { private static final long serialVersionUID = 1L; #foreach($field in $fields) /** * ${field.comment} */ private ${field.javaType} ${field.name}; #end } ``` 4. 在代码生成器中配置要使用的自定义模板。例如: ``` <property name="templateConfig"> <bean class="com.baomidou.mybatisplus.generator.config.TemplateConfig"> <property name="entity" value="/templates/mybatis-plus/Entity.java.vm"/> <property name="mapper" value="/templates/mybatis-plus/Mapper.java.vm"/> <property name="xml" value="/templates/mybatis-plus/Mapper.xml.vm"/> <property name="service" value="/templates/mybatis-plus/Service.java.vm"/> <property name="serviceImpl" value="/templates/mybatis-plus/ServiceImpl.java.vm"/> <property name="controller" value="/templates/mybatis-plus/Controller.java.vm"/> </bean> </property> ``` 在这个例子中,我们配置了生成实体类、Mapper接口、Mapper XML文件、Service接口、Service实现类和Controller类的模板路径。 5. 运行代码生成器,即可根据自定义模板生成对应的代码。 注意:自定义模板的命名必须与 MyBatis-Plus 内置模板的命名一致,才能正确覆盖内置模板。例如,要自定义生成实体类的模板,必须将模板文件命名为 `Entity.java.vm`。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值