SpringBoot项目中,根据数据中的表结构生成后端代码

需求来源/背景:

每次都根据表去新建表的各个类,存在重复的工作,所以使用代码生成生成相关基础类。

具体实现如下:

  • 添加相关依赖
XML 复制代码
        <!-- 1-mybatis plus generator -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.1</version>
            <scope>test</scope>
        </dependency>
        <!-- 2-模板引擎 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>
        <!--3-freemarker模板-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
        </dependency>

        <!-- 添加 mybatis-plus 的依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        
        <!-- 4-测试模块 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>3.1.0</version>
        </dependency>
  • 添加对应的数据库依赖
XML 复制代码
        <!-- 1 Postgresql包 -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!-- 2-sqlite相关包-->
        <!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.45.1.0</version>
        </dependency>

        <!-- 2-sqlite 方言-->
        <dependency>
            <groupId>com.zsoltfabok</groupId>
            <artifactId>sqlite-dialect</artifactId>
            <version>1.0</version>
        </dependency>

            <!-- Oracle驱动 -->
            <dependency>
                <groupId>com.oracle.database.jdbc</groupId>
                <artifactId>ojdbc8</artifactId>
                <version>12.2.0.1</version>
            </dependency>

        <!-- DMDB 相关包-->
        <!-- https://mvnrepository.com/artifact/com.dameng/DmJdbcDriver18 -->
        <dependency>
            <groupId>com.dameng</groupId>
            <artifactId>DmJdbcDriver18</artifactId>
            <version>8.1.2.192</version>
        </dependency>

        <!-- mysql包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
            <scope>runtime</scope>
        </dependency>
  • 添加代码生成测试类
java 复制代码
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
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 org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

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

@SpringBootTest
public class GenCodeApplicationTests {

    /**
     * 数据库连接字符
     */
    private static final String URL = "jdbc:postgresql://localhost:5432/postgres";

	/**
     * 生成代码的包名
     */
    private static final String PARENT_PACKAGE_NAME = "com.app.business";
    /**
     * 数据库用户名
     */
    private static final String USERNAME = "postgres";
    /**
     * 数据库密码
     */
    private static final String PASSWORD = "postgres";
    /**
     * 项目根路径
     */
    private static final String PROJECT_ROOT_PATH = System.getProperty("user.dir");

    public static void main(String[] args) throws ClassNotFoundException {

		// 也可以使用绝对地址 D:\\soft\\code\\demo\\src\\main\\java\\com\\ruoyi\\system\\domain
        // 项目根路径
        String entityPath = PROJECT_ROOT_PATH + "/com/app/business/domain";
        // mapper路径
        String mapperPath = PROJECT_ROOT_PATH + "/com/app/business/mapper";
        // mapper xml路径
        String mapperXmlPath = PROJECT_ROOT_PATH + "/src/main/resources/mapper";
        // service路径
        String servicePath = PROJECT_ROOT_PATH + "/com/app/business/service";
        // service实现路径
        String serviceImplPath = PROJECT_ROOT_PATH + "/com/app/business/service/impl";
        // controller路径
        String controllerPath = PROJECT_ROOT_PATH + "/com/app/business/controller";

        FastAutoGenerator.create(URL, USERNAME, PASSWORD)
                // 1. 全局配置
                .globalConfig(builder -> builder
                        .author("author")
                        // 开启覆盖已生成的文件。注释掉则关闭覆盖。请谨慎开启此选项!
                        // .fileOverride()
                        .disableOpenDir()
                        // 开启swagger2。注释掉则默认关闭。
                        .enableSwagger()
                        .dateType(DateType.TIME_PACK)
                        // 注释时间策略。
                        .commentDate("yyyy-MM-dd")
                )
                .packageConfig((scanner, builder) -> builder
                        .parent(PARENT_PACKAGE_NAME)
                        .entity("domain")
                        .mapper("mapper")
                        .service("service")
                        .serviceImpl("service.impl")
                        .controller("controller")
                        .other("other")
                        .pathInfo(
                                new HashMap<OutputFile, String>() {{
                                    put(OutputFile.entity, entityPath);
                                    put(OutputFile.mapper, mapperPath);
                                    put(OutputFile.mapperXml, mapperXmlPath);
                                    put(OutputFile.service, servicePath);
                                    put(OutputFile.serviceImpl, serviceImplPath);
                                    put(OutputFile.controller, controllerPath);
                                }}
                        )
                )
                //todo 加入表名,多个在字符串中用,隔开
                .strategyConfig((scanner, builder) -> builder.addInclude(getTables("table_name"))
                        .entityBuilder()
                        .enableLombok()
                        .enableTableFieldAnnotation()
                        // 逻辑删除字段名(数据库)。
                        .logicDeleteColumnName("is_delete")
                        // 逻辑删除属性名(实体)。
                        .logicDeletePropertyName("isDelete")
                        .addTableFills(new Column("create_time", FieldFill.INSERT))
                        .addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE))
                        .idType(IdType.ASSIGN_ID)
                        .mapperBuilder()
                        .enableMapperAnnotation()
                        .enableBaseResultMap()
                        .enableBaseColumnList()
                        .controllerBuilder()
                        .enableRestStyle()
                        .enableHyphenStyle()
                        .build()
                )
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }

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

    @Test
    void contextLoads() {
    }
}

最后运行这个测试类即可生成对应的代码类了!

相关推荐
极光代码工作室1 小时前
基于SpringBoot的课程预约系统
java·springboot·web开发·后端开发
Leighteen1 小时前
`try-finally` 里的 `return`:为什么 `finally` 会悄悄改掉返回值、吞掉异常
java·开发语言
名字还没想好☜2 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
圆山猫2 小时前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v
caishenzhibiao3 小时前
期货先行者主图 同花顺期货通指标
java·c语言·c#
史呆芬3 小时前
分布式事务实战:微服务跨服务数据一致性解决方案
java·后端·spring cloud
IT界的老黄牛3 小时前
限流命中后该怎么办:直接丢、阻塞等待、延迟重投三种姿势的取舍
java·rocketmq·redisson·令牌桶·削峰·分布式限流
daad7774 小时前
记录matlab状态机demo
java·网络·matlab
牡丹雅忻14 小时前
AES 加密模式演进:从 ECB、CBC 到 GCM 的 C# 深度实践
java·开发语言·c#
paopaokaka_luck4 小时前
基于springboot3+vue3的智能文库平台(AI智能搜索、AI智能汇总、实时在线状态展示、多格式文档预览与富文本编辑、Echarts图形化分析)
前端·网络·spring boot·网络协议·echarts