10分钟上手!Nebula Framework代码生成器:从0到1构建DDD架构应用

10分钟上手!Nebula Framework代码生成器:从0到1构建DDD架构应用

【免费下载链接】nebula-framework 基于Springboot3.0的一套后台管理开发平台,里面有自行开发的一套代码生成插件和基于DDD模式开发的一套代码架构。项目本身是单体架构,适合中小型企业、私活、毕业设计等,也适合用来学习DDD的模式开发 【免费下载链接】nebula-framework 项目地址: https://gitcode.com/NeegixOpensourceGroup/nebula-framework

你还在手动编写DTO、Entity、Repository重复代码?还在为DDD(领域驱动设计)分层架构的模板代码而头疼?Nebula Framework的代码生成器让这一切成为过去!本文将带你深入了解这款专为Spring Boot 3.0打造的代码生成神器,通过5个实战步骤,让你彻底告别90%的重复性编码工作,专注于业务逻辑实现。

读完本文你将获得:

  • 掌握Nebula代码生成器的核心工作原理
  • 学会通过数据库表结构自动生成完整DDD架构代码
  • 了解多数据库适配的实现方案
  • 能够自定义模板生成符合企业规范的代码
  • 获得一份可直接复用的代码生成配置指南

一、代码生成器核心架构解析

Nebula Framework代码生成器采用元数据驱动+模板引擎的设计模式,通过三层架构实现从数据库表结构到业务代码的全自动化转换。其核心模块包括元数据提取层、数据转换层和代码生成层,各层之间通过接口解耦,确保了系统的扩展性和灵活性。

1.1 架构流程图

mermaid

1.2 核心组件说明

组件类名职责关键方法
ColumnMetadata存储数据库列元数据getColumnName(), isPrimaryKey()
DatabaseQueryStrategy数据库查询策略接口buildQuery()
MySQLQueryStrategyMySQL元数据查询实现buildQuery()
MySqlDbTypeMapperMySQL类型映射getJavaClass()
NebulaModelTemplateFileDDD模板处理器getDataModel()

二、元数据提取:从数据库到对象的映射

代码生成的第一步是从数据库中提取表结构信息。Nebula通过DatabaseQueryStrategy接口实现了多数据库适配,目前已支持MySQL、Oracle和SQL Server三种主流数据库。

2.1 MySQL元数据查询实现

MySQLQueryStrategy类通过查询INFORMATION_SCHEMA系统表,获取包括列名、数据类型、是否可为空、主键信息、默认值和注释在内的完整表结构信息。其核心SQL语句如下:

public String buildQuery(String tableName, String schemaOrOwner) {
    String whereSchemaOrOwner = schemaOrOwner==null||schemaOrOwner.isEmpty()?"": "AND c.TABLE_SCHEMA='"+schemaOrOwner+"'";
    
    return """
        SELECT
            c.COLUMN_NAME,
            c.DATA_TYPE,
            c.IS_NULLABLE,
            c.COLUMN_DEFAULT,
            c.COLUMN_COMMENT AS DESCRIPTION,
            CASE 
                WHEN k.COLUMN_NAME IS NOT NULL  THEN TRUE 
                ELSE FALSE 
            END AS IS_PRIMARY_KEY,
            t.TABLE_COMMENT AS TABLE_DESCRIPTION
        FROM
            INFORMATION_SCHEMA.COLUMNS c
        LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE k ON 
            c.TABLE_SCHEMA = k.TABLE_SCHEMA
            AND c.TABLE_NAME = k.TABLE_NAME
            AND c.COLUMN_NAME = k.COLUMN_NAME
            AND k.CONSTRAINT_NAME = 'PRIMARY'
        LEFT JOIN INFORMATION_SCHEMA.TABLES t ON
            c.TABLE_SCHEMA = t.TABLE_SCHEMA
            AND c.TABLE_NAME = t.TABLE_NAME
        WHERE
            c.TABLE_NAME = '%s'
            %s
        ORDER BY
            c.ORDINAL_POSITION
        """.formatted(tableName, whereSchemaOrOwner);
}

这段SQL通过LEFT JOIN关联了COLUMNS、KEY_COLUMN_USAGE和TABLES三个系统表,一次性获取了列信息、主键信息和表注释,为后续代码生成提供了完整的元数据支持。

2.2 元数据封装实体

ColumnMetadata类作为元数据的载体,封装了所有必要的表结构信息:

public class ColumnMetadata {
    private final String columnName;
    private final String dataType;
    private final String isNullable;
    private final boolean isPrimaryKey;
    private final String defaultValue;
    private final String description;
    private final String tableDescription;
    
    // 构造函数和getter方法省略
}

特别值得注意的是isPrimaryKey字段和description字段,前者用于标识主键列以生成对应的实体ID,后者则将数据库注释转换为JavaDoc,提高代码的可维护性。

三、数据类型映射:跨数据库的类型转换

不同数据库的数据类型存在差异,Nebula通过DbTypeMapper接口实现了数据库类型到Java类型的统一映射。以MySQL为例,MySqlDbTypeMapper类定义了完整的类型转换规则:

3.1 核心类型映射实现

public Class<?> getJavaClass(String dbType) {
    return switch (dbType.toUpperCase()) {
        case "VARCHAR", "CHAR", "TEXT" -> String.class;
        case "INT", "INTEGER" -> Integer.class;
        case "BIGINT" -> Long.class;
        case "FLOAT" -> Float.class;
        case "DOUBLE" -> Double.class;
        case "BOOLEAN","TINYINT" -> Boolean.class;
        case "DATE","TIMESTAMP","DATETIME" -> Instant.class;
        default -> Object.class;
    };
}

3.2 类型映射对照表

数据库类型Java类型备注
VARCHARString对应所有字符串类型
INTInteger32位整数
BIGINTLong64位整数
TINYINT(1)BooleanMySQL特有布尔类型映射
DATETIMEInstantJava 8时间API
FLOATFloat单精度浮点数
DOUBLEDouble双精度浮点数

这种映射规则确保了生成的实体类能够正确映射数据库字段,同时采用Java标准类型增强了代码的可移植性。对于Instant类型的使用,体现了框架对Java 8+新特性的支持,符合现代Java开发规范。

四、DDD代码生成实战:5步构建完整业务模块

下面通过一个用户管理模块的实战案例,演示如何使用Nebula代码生成器从数据库表结构生成完整的DDD架构代码。我们将以sys_user表为例,生成包括实体类、仓储接口、应用服务在内的全套代码。

4.1 准备工作:数据库表设计

首先创建用户表结构:

CREATE TABLE `sys_user` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `password` varchar(100) NOT NULL COMMENT '密码(加密存储)',
  `nickname` varchar(50) DEFAULT NULL COMMENT '昵称',
  `email` varchar(100) DEFAULT NULL COMMENT '邮箱',
  `phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(0-禁用,1-正常)',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统用户表';

4.2 配置生成参数

application.properties中配置代码生成参数:

# 代码生成配置
nebula.generator.output-dir=src/main/java
nebula.generator.template-dir=templates/nebula
nebula.generator.db-type=mysql
nebula.generator.schema-name=neegix
nebula.generator.table-names=sys_user
nebula.generator.base-package=com.neegix.system.user

4.3 执行生成命令

通过Maven插件执行代码生成:

mvn com.neegix:nebula-framework-generator:generate

4.4 生成代码结构

生成的代码将遵循标准DDD架构,包含应用层、领域层和基础设施层:

com.neegix.system.user/
├── application/
│   ├── assembler/
│   │   └── UserAssembler.java      # DTO转换器
│   ├── service/
│   │   ├── UserService.java        # 应用服务接口
│   │   └── impl/
│   │       └── UserServiceImpl.java # 应用服务实现
├── domain/
│   ├── entity/
│   │   └── User.java               # 实体类
│   └── repository/
│       └── UserRepository.java     # 仓储接口
├── infrastructure/
│   └── repository/
│       └── impl/
│           └── UserRepositoryImpl.java # 仓储实现
└── interfaces/
    ├── controller/
    │   └── UserController.java     # 控制器
    ├── dto/
    │   ├── UserDTO.java            # 数据传输对象
    │   └── UserQueryDTO.java       # 查询DTO
    └── vo/
        └── UserVO.java             # 视图对象

4.5 核心生成代码解析

4.5.1 领域实体类

生成的User实体类自动包含了属性定义、构造函数和领域行为方法:

package com.neegix.system.user.domain.entity;

import com.neegix.base.BaseEntity;
import java.time.Instant;
import lombok.Getter;
import lombok.Setter;

/**
 * 系统用户表
 * 
 * @author Nebula Generator
 */
@Getter
@Setter
public class User extends BaseEntity {
    /**
     * 用户ID
     */
    private Long id;
    
    /**
     * 用户名
     */
    private String username;
    
    /**
     * 密码(加密存储)
     */
    private String password;
    
    /**
     * 昵称
     */
    private String nickname;
    
    /**
     * 邮箱
     */
    private String email;
    
    /**
     * 手机号
     */
    private String phone;
    
    /**
     * 状态(0-禁用,1-正常)
     */
    private Boolean status;
    
    /**
     * 创建时间
     */
    private Instant createTime;
    
    /**
     * 更新时间
     */
    private Instant updateTime;
    
    // 领域行为方法
    public void changePassword(String newPassword) {
        // 密码加密逻辑
        this.password = encryptPassword(newPassword);
        this.updateTime = Instant.now();
    }
    
    public void disable() {
        this.status = false;
        this.updateTime = Instant.now();
    }
    
    // 其他方法省略
}
4.5.2 仓储接口

生成的仓储接口遵循领域驱动设计规范,仅定义必要的持久化操作:

package com.neegix.system.user.domain.repository;

import com.neegix.domain.repository.IAggregateRepository;
import com.neegix.system.user.domain.entity.User;
import java.util.Optional;

/**
 * User仓储接口
 * 
 * @author Nebula Generator
 */
public interface UserRepository extends IAggregateRepository<User, Long> {
    /**
     * 根据用户名查询用户
     * 
     * @param username 用户名
     * @return 用户实体
     */
    Optional<User> findByUsername(String username);
    
    /**
     * 检查用户名是否存在
     * 
     * @param username 用户名
     * @return 是否存在
     */
    boolean existsByUsername(String username);
}

五、高级特性:自定义模板与扩展点

Nebula代码生成器不仅提供了默认的代码生成能力,还通过模板自定义和策略扩展,支持企业级定制需求。下面介绍两种常用的扩展方式。

5.1 自定义模板实现

Nebula采用FreeMarker模板引擎,允许开发者通过自定义模板文件改变生成代码的格式和内容。例如,创建一个自定义的实体类模板:

  1. src/main/resources/templates/nebula目录下创建entity.ftl文件
  2. 编写模板内容:
package ${basePackage}.domain.entity;

import com.neegix.base.BaseEntity;
<#list imports as import>
import ${import};
</#list>

/**
 * ${tableDescription}
 * 
 * @author ${author}
 * @since ${date}
 */
@Getter
@Setter
public class ${className} extends BaseEntity {
<#list columns as column>
    /**
     * ${column.description}
     */
    private ${column.javaType} ${column.fieldName};
</#list>

    // 自定义业务方法
    public void validate() {
        // 数据验证逻辑
    }
}
  1. 配置使用自定义模板:
nebula.generator.template.entity=entity.ftl

5.2 扩展数据库支持

要添加对PostgreSQL的支持,只需实现DatabaseQueryStrategyDbTypeMapper接口:

public class PostgreSQLQueryStrategy implements DatabaseQueryStrategy {
    @Override
    public String buildQuery(String tableName, String schemaOrOwner) {
        // PostgreSQL特有的元数据查询SQL
        return "SELECT ... FROM information_schema.columns WHERE table_name = ?";
    }
}

public class PostgreSqlDbTypeMapper implements DbTypeMapper {
    @Override
    public Class<?> getJavaClass(String dbType) {
        // PostgreSQL类型映射逻辑
        return switch (dbType.toUpperCase()) {
            case "VARCHAR", "TEXT" -> String.class;
            case "INT4" -> Integer.class;
            case "INT8" -> Long.class;
            // 其他类型映射
            default -> Object.class;
        };
    }
}

六、性能优化与最佳实践

6.1 代码生成性能优化

  • 增量生成:通过比较表结构哈希值,只重新生成变更的文件
  • 并行生成:多线程同时处理多个表的代码生成
  • 模板缓存:缓存解析后的模板,避免重复解析开销

6.2 最佳实践指南

  1. 数据库设计规范

    • 统一使用id作为主键名
    • 通过注释清晰描述字段含义
    • 使用标准数据类型
  2. 代码生成配置

    # 推荐配置
    nebula.generator.incremental=true
    nebula.generator.overwrite=false
    nebula.generator.ignore-columns=create_time,update_time
    
  3. 团队协作建议

    • 将模板文件纳入版本控制
    • 建立团队共享的代码生成配置
    • 定期更新代码生成器版本

七、总结与展望

Nebula Framework代码生成器通过元数据驱动和模板引擎的结合,实现了从数据库表结构到DDD架构代码的全自动化转换。其核心优势在于:

  1. 高度自动化:一键生成完整业务模块代码,减少90%重复工作
  2. 架构规范性:严格遵循DDD架构规范,确保代码质量
  3. 灵活扩展性:通过策略模式支持多数据库和自定义模板
  4. 技术先进性:采用Java 8+特性和Spring Boot 3.0

未来,Nebula代码生成器将在以下方向持续优化:

  • 增加可视化配置界面
  • 支持微服务架构代码生成
  • 集成AI代码优化建议
  • 提供更多架构风格支持(如Clean Architecture)

通过本文的介绍,相信你已经掌握了Nebula代码生成器的使用方法和扩展技巧。立即访问项目仓库,开始你的高效开发之旅吧!

# 项目地址
git clone https://gitcode.com/NeegixOpensourceGroup/nebula-framework.git

附录:常见问题解决

Q1: 生成的代码出现编译错误怎么办?

A1: 检查数据库连接配置和表结构是否正确,确认使用的JDK版本是否为17+。

Q2: 如何添加自定义字段到生成的代码中?

A2: 通过自定义模板或实现DataModelEnhancer接口扩展数据模型。

Q3: 支持哪些数据库类型?

A3: 目前支持MySQL、Oracle和SQL Server,可通过实现DatabaseQueryStrategy扩展其他数据库。

Q4: 生成的代码如何适配现有项目规范?

A4: 通过自定义模板和配置参数调整代码格式,或使用CodeFormatter接口实现代码格式化。

【免费下载链接】nebula-framework 基于Springboot3.0的一套后台管理开发平台,里面有自行开发的一套代码生成插件和基于DDD模式开发的一套代码架构。项目本身是单体架构,适合中小型企业、私活、毕业设计等,也适合用来学习DDD的模式开发 【免费下载链接】nebula-framework 项目地址: https://gitcode.com/NeegixOpensourceGroup/nebula-framework

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

抵扣说明:

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

余额充值