10分钟上手!Nebula Framework代码生成器:从0到1构建DDD架构应用
你还在手动编写DTO、Entity、Repository重复代码?还在为DDD(领域驱动设计)分层架构的模板代码而头疼?Nebula Framework的代码生成器让这一切成为过去!本文将带你深入了解这款专为Spring Boot 3.0打造的代码生成神器,通过5个实战步骤,让你彻底告别90%的重复性编码工作,专注于业务逻辑实现。
读完本文你将获得:
- 掌握Nebula代码生成器的核心工作原理
- 学会通过数据库表结构自动生成完整DDD架构代码
- 了解多数据库适配的实现方案
- 能够自定义模板生成符合企业规范的代码
- 获得一份可直接复用的代码生成配置指南
一、代码生成器核心架构解析
Nebula Framework代码生成器采用元数据驱动+模板引擎的设计模式,通过三层架构实现从数据库表结构到业务代码的全自动化转换。其核心模块包括元数据提取层、数据转换层和代码生成层,各层之间通过接口解耦,确保了系统的扩展性和灵活性。
1.1 架构流程图
1.2 核心组件说明
| 组件类名 | 职责 | 关键方法 |
|---|---|---|
| ColumnMetadata | 存储数据库列元数据 | getColumnName(), isPrimaryKey() |
| DatabaseQueryStrategy | 数据库查询策略接口 | buildQuery() |
| MySQLQueryStrategy | MySQL元数据查询实现 | buildQuery() |
| MySqlDbTypeMapper | MySQL类型映射 | getJavaClass() |
| NebulaModelTemplateFile | DDD模板处理器 | 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类型 | 备注 |
|---|---|---|
| VARCHAR | String | 对应所有字符串类型 |
| INT | Integer | 32位整数 |
| BIGINT | Long | 64位整数 |
| TINYINT(1) | Boolean | MySQL特有布尔类型映射 |
| DATETIME | Instant | Java 8时间API |
| FLOAT | Float | 单精度浮点数 |
| DOUBLE | Double | 双精度浮点数 |
这种映射规则确保了生成的实体类能够正确映射数据库字段,同时采用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模板引擎,允许开发者通过自定义模板文件改变生成代码的格式和内容。例如,创建一个自定义的实体类模板:
- 在
src/main/resources/templates/nebula目录下创建entity.ftl文件 - 编写模板内容:
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() {
// 数据验证逻辑
}
}
- 配置使用自定义模板:
nebula.generator.template.entity=entity.ftl
5.2 扩展数据库支持
要添加对PostgreSQL的支持,只需实现DatabaseQueryStrategy和DbTypeMapper接口:
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 最佳实践指南
-
数据库设计规范
- 统一使用
id作为主键名 - 通过注释清晰描述字段含义
- 使用标准数据类型
- 统一使用
-
代码生成配置
# 推荐配置 nebula.generator.incremental=true nebula.generator.overwrite=false nebula.generator.ignore-columns=create_time,update_time -
团队协作建议
- 将模板文件纳入版本控制
- 建立团队共享的代码生成配置
- 定期更新代码生成器版本
七、总结与展望
Nebula Framework代码生成器通过元数据驱动和模板引擎的结合,实现了从数据库表结构到DDD架构代码的全自动化转换。其核心优势在于:
- 高度自动化:一键生成完整业务模块代码,减少90%重复工作
- 架构规范性:严格遵循DDD架构规范,确保代码质量
- 灵活扩展性:通过策略模式支持多数据库和自定义模板
- 技术先进性:采用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接口实现代码格式化。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



