Abner的博客

JAVA代码生成

· 325 words · 2 minutes to read
Categories: 代码

依赖包版本 🔗

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.3.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.32</version> <!-- or latest version -->
</dependency>

Java代码生成 🔗

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.config.builder.CustomFile;
import java.sql.Types;
import java.util.*;

public class CodeGeneratorTest {
    public static void main(String[] args) {
        // 数据库配置
        String url = "jdbc:mysql://127.0.01:3306/test?useUnicode=true&characterEncoding=UTF8&useSSL=false&serverTimezone=Asia/Shanghai";
        String username = "root";
        String password = "123456";

        // 表名配置
        String[] tableName = {"sys_subject"};
        String[] tablePreFix = {"sys_", "tpl_"};

        // 项目配置
        String projectName = "com-server-demo-provider";
        String basePkg = "com.server.demo.provider";
        String moduleName = "subject";
        String author = "abner";

        String rootPath = System.getProperty("user.dir");
        String mainPath = rootPath + "/" + projectName + "/src/main";

         FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> {
                    builder.author(author)
                            .fileOverride()
                            .outputDir(mainPath + "/java");
                })
                .dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                    int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                    if (typeCode == Types.SMALLINT || typeCode == Types.TINYINT) {  // 添加 TINYINT 类型处理
                        return DbColumnType.INTEGER;
                    }
                    return typeRegistry.getColumnType(metaInfo);
                }))
                .packageConfig(builder -> {
                    builder.parent(basePkg)
                            .moduleName(moduleName)
                            .entity("model.entity")  // 实体类放在model包下
                            .pathInfo(Collections.singletonMap(OutputFile.xml, mainPath + "/mapper/" + moduleName));
                })
                .strategyConfig(builder -> {
                    builder.addInclude(tableName)
                            .addTablePrefix(tablePreFix);

                    // 实体类配置
                    builder.entityBuilder()
                            //.superClass(BaseEntity.class)
                            .enableChainModel()
                            .enableLombok()
                            .disableSerialVersionUID()
                            .enableTableFieldAnnotation()
                            // 字段过滤配置(排除BaseEntity.class父类中已经继承的字段,防止重复生成覆盖)
                            //.addSuperEntityColumns("id", "create_by", "create_name",
                                    "create_time", "modify_by", "modify_name",
                                    "modify_time");

                    // 新增Controller配置
                    builder.controllerBuilder()
                            .enableRestStyle()  // 使用@RestController注解
                            .enableHyphenStyle() // 启用驼峰转连字符
                            .formatFileName("%sController");

                    // Mapper配置
                    builder.mapperBuilder()
                            .superClass(BaseMapperX.class)
                            .enableBaseColumnList()
                            .enableMapperAnnotation();

                    // Service配置
                    builder.serviceBuilder()
                            .formatServiceFileName("%sService");
                })
                .injectionConfig(builder -> {
                    Map<String, Object> customMap = new HashMap<>();
                    // 添加父包路径变量
                    customMap.put("packageName", basePkg + "." + moduleName);
                    customMap.put("dtoPackage", "model.dto");
                    customMap.put("voPackage", "model.vo");
                    customMap.put("convertPackage", "model.convert");

                    builder.customMap(customMap)
                            // DTO模板
                            .customFile(new CustomFile.Builder()
                                    .fileName("Dto.java")
                                    .templatePath("/templates/dto.java.ftl")
                                    .packageName("model.dto")
                                    .build())
                            // VO模板
                            .customFile(new CustomFile.Builder()
                                    .fileName("Vo.java")
                                    .templatePath("/templates/vo.java.ftl")
                                    .packageName("model.vo")
                                    .build())
                            // Convert模板
                            .customFile(new CustomFile.Builder()
                                    .fileName("Convert.java")
                                    .templatePath("/templates/convert.java.ftl")
                                    .packageName("model.convert")
                                    .build());
                })
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }
}

Freemarker模板 🔗

convert.java.ftl

package ${packageName}.${convertPackage};

import ${package.Entity}.${entity};
import ${package.Entity?replace("entity","dto")}.${entity}Dto;
import ${package.Entity?replace("entity","vo")}.${entity}Vo;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;

@Mapper(componentModel = "spring")
public interface ${entity}Convert {

${entity}Convert INSTANCE = Mappers.getMapper(${entity}Convert.class);

${entity}Dto entityToDto(${entity} entity);

${entity} dtoToEntity(${entity}Dto dto);

${entity} voToEntity(${entity}Vo vo);

List<${entity}Dto> entityListToDto(List<${entity}> entities);
}

dto.java.ftl

package ${packageName}.${dtoPackage};

    import lombok.Data;
    import lombok.experimental.Accessors;

    @Data
    @Accessors(chain = true)
    public class ${table.entityName}Dto {

    }

vo.java.ftl

package ${packageName}.${voPackage};

    import lombok.Data;
    import lombok.experimental.Accessors;

    @Data
    @Accessors(chain = true)
    public class ${table.entityName}Vo {

    }

Tags