Manage Apple Reminders via the `remindctl` CLI on macOS (list, add, edit, complete, delete)....
npx skills add techthird/skills --skill "mysql-to-java-ddd"
Install specific skill from multi-skill repository
# Description
MySQL表结构转Java Spring Boot DDD代码生成器
# SKILL.md
name: mysql-to-java-ddd
description: MySQL表结构转Java Spring Boot DDD代码生成器
Agent Skills - MySQL到Java Spring Boot DDD代码生成器
技能描述
根据MySQL表结构自动生成符合DDD(领域驱动设计)模式的Spring Boot项目代码,包含完整的API层、应用服务层、领域层和基础设施层,使用MyBatis Plus进行数据库操作。
功能范围
1. 支持的功能模块
- ✅ 新增(Create)
- ✅ 修改(Update)
- ✅ 根据ID查询(Get by ID)
- ✅ 分页查询(Page Query)
2. 生成的代码层次
API层 (entrance/api)
- SDK接口实现类
- 请求/响应DTO
- 参数校验
应用服务层 (service)
- ApplicationService实现
- 业务编排逻辑
- 事务管理
领域层 (domain)
- 聚合根(Aggregate)
- 值对象(ValueObject)
- 领域服务(DomainService)
- 仓储接口(Repository)
- 领域事件(Event)
基础设施层 (infrastructure)
- 仓储实现(RepositoryImpl)
- MyBatis Plus Mapper
- DO(数据对象)转换
代码规范
1. 命名规范
类命名
聚合根: *Aggregate.java
值对象: *ValueObject.java
领域服务: *DomainService.java
应用服务: *ApplicationService.java
仓储接口: *Repository.java
仓储实现: *RepositoryImpl.java
API接口: *OperateApi.java / *QueryApi.java
DTO请求: *Request.java
DTO响应: *Response.java
DO对象: *DO.java
Mapper: *Mapper.java
字段命名
- 遵循Java驼峰命名规范
- 数据库字段snake_case → Java字段camelCase
- 示例:
user_name→userName
2. 注解规范
API层出参注解
// 时间类型字段
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
// API文档注解
@ApiModelProperty(value = "支付中心支付单号")
private String payOrderNo;
@ApiModelProperty(value = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
入参校验注解
@NotNull(message = "ID不能为空")
@ApiModelProperty(value = "主键ID", required = true)
private Long id;
@NotBlank(message = "订单号不能为空")
@ApiModelProperty(value = "订单号", required = true)
private String orderNo;
项目结构
整体架构
shop-payment/
├── shop-payment-server/ # 主应用模块 - 业务逻辑实现
├── shop-payment-sdk/ # 内部SDK - 供内部系统调用
├── shop-payment-open-sdk/ # 开放SDK - 供外部合作伙伴调用
├── shop-payment-dao/ # 数据访问层
├── shop-payment-common/ # 公共组件
└── shop-payment-anticorruption/ # 防腐层 - 外部系统适配
核心包结构
com.shop.payment.server.{domain}/
├── entrance/ # 入口层
│ ├── api/ # SDK接口实现(操作类)
│ │ └── *OperateApiImpl.java
│ ├── openapi/ # 开放API实现
│ ├── listener/ # MQ监听器
│ └── schedule/ # 定时任务
├── service/ # 应用服务层
│ └── *ApplicationService.java
├── domain/ # 领域层
│ ├── model/ # 聚合根和实体
│ │ ├── *Aggregate.java
│ │ └── *ValueObject.java
│ ├── service/ # 领域服务
│ │ └── *DomainService.java
│ ├── repository/ # 仓储接口
│ │ └── *Repository.java
│ ├── factory/ # 工厂类
│ │ └── *Factory.java
│ ├── event/ # 领域事件
│ └── listener/ # 事件监听器
└── infrastructure/ # 基础设施层
├── repository/ # 仓储实现
│ └── *RepositoryImpl.java
├── gateway/ # 支付网关
├── producer/ # 消息生产者
└── rest/ # HTTP处理器
SDK包结构
com.shop.payment.sdk.{domain}/
├── *OperateApi.java # 操作接口(新增、修改)
├── *QueryApi.java # 查询接口(查询、分页)
├── request/ # 请求DTO
│ ├── *CreateReqDTO.java
│ ├── *UpdateReqDTO.java
│ └── *PageQueryReqDTO.java
└── response/ # 响应DTO
├── *ResDTO.java
└── *PageResDTO.java
DAO包结构
com.shop.payment.dao.{domain}/
├── mapper/ # MyBatis Mapper
│ └── *Mapper.java
└── dataobject/ # 数据对象
└── *DO.java
技术栈
核心框架
- Spring Boot 2.x
- MyBatis Plus 3.x
- Lombok
必需依赖
<!-- MyBatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- Swagger注解 -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</dependency>
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
代码生成流程
输入要求
-
MySQL DDL语句
sql CREATE TABLE `t_payment_order` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `order_no` varchar(64) NOT NULL COMMENT '订单号', `amount` decimal(10,2) NOT NULL COMMENT '金额', `status` tinyint(4) NOT NULL COMMENT '状态', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付订单表'; -
业务域名称
-
示例:
pay、refund、reconcile -
实体名称
- 示例:
PaymentOrder、RefundOrder
输出内容
1. SDK模块代码
shop-payment-sdk/
└── src/main/java/com/shop/payment/sdk/{domain}/
├── PaymentOrderOperateApi.java # 操作接口
├── PaymentOrderQueryApi.java # 查询接口
├── request/
│ ├── PaymentOrderCreateReqDTO.java
│ ├── PaymentOrderUpdateReqDTO.java
│ └── PaymentOrderPageQueryReqDTO.java
└── response/
├── PaymentOrderResDTO.java
└── PaymentOrderPageResDTO.java
2. Server模块代码
shop-payment-server/
└── src/main/java/com/shop/payment/server/{domain}/
├── entrance/api/
│ ├── PaymentOrderOperateApiImpl.java
│ └── PaymentOrderQueryApiImpl.java
├── service/
│ └── PaymentOrderApplicationService.java
├── domain/
| ├── factory/
│ │ └── PaymentOrderFactory.java
│ ├── model/
│ │ ├── PaymentOrderAggregate.java
│ │ └── AmountValueObject.java
│ ├── repository/
│ │ └── PaymentOrderRepository.java
│ └── service/
│ └── PaymentOrderDomainService.java
└── infrastructure/
└── repository/
└── PaymentOrderRepositoryImpl.java
3. DAO模块代码
shop-payment-dao/
└── src/main/java/com/shop/payment/dao/{domain}/
├── mapper/
│ └── PaymentOrderMapper.java
└── dataobject/
└── PaymentOrderDO.java
DDD核心概念实现
1. 聚合根(Aggregate)
- 封装业务规则和不变性约束
- 作为事务一致性边界
- 包含业务方法(非贫血模型)
public class PaymentOrderAggregate {
private Long id;
private String orderNo;
private AmountValueObject amount;
private Integer status;
// 业务方法
public void pay() {
// 业务规则校验
this.status = PaymentStatus.PAID;
}
}
2. 值对象(ValueObject)
- 不可变对象
- 通过值比较相等性
- 无ID标识
@Value
public class AmountValueObject {
BigDecimal value;
String currency;
}
3. 仓储(Repository)
- 领域层定义接口
- 基础设施层实现
- 面向聚合根操作
// 领域层接口
public interface PaymentOrderRepository {
void save(PaymentOrderAggregate aggregate);
PaymentOrderAggregate findById(Long id);
}
// 基础设施层实现
public class PaymentOrderRepositoryImpl implements PaymentOrderRepository {
@Autowired
private PaymentOrderMapper mapper;
// 使用MyBatis Plus实现
}
4. 应用服务(ApplicationService)
- 编排领域对象完成用例
- 管理事务
- 不包含业务逻辑
5. 领域服务(DomainService)
- 跨聚合根的业务逻辑
- 无状态
- 纯业务逻辑
MyBatis Plus使用规范
1. Mapper接口
public interface PaymentOrderMapper extends BaseMapper<PaymentOrderDO> {
// 自定义复杂查询方法
IPage<PaymentOrderDO> pageQuery(Page<PaymentOrderDO> page,
@Param("query") PaymentOrderPageQueryRequest query);
}
2. 基础CRUD
- 继承
BaseMapper自动获得增删改查方法 - 使用
LambdaQueryWrapper构建查询条件 - 使用
LambdaUpdateWrapper构建更新条件
3. 分页查询
Page<PaymentOrderDO> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<PaymentOrderDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(PaymentOrderDO::getStatus, status);
Page<PaymentOrderDO> result = mapper.selectPage(page, wrapper);
接口实现规范
操作类接口(OperateApi)
public interface PaymentOrderOperateApi {
/**
* 创建支付订单
*/
Result<Long> create(PaymentOrderCreateRequest request);
/**
* 更新支付订单
*/
Result<Boolean> update(PaymentOrderUpdateRequest request);
}
查询类接口(QueryApi)
public interface PaymentOrderQueryApi {
/**
* 根据ID查询
*/
Result<PaymentOrderResponse> getById(Long id);
/**
* 分页查询
*/
Result<PageResult<PaymentOrderResponse>> pageQuery(PaymentOrderPageQueryRequest request);
}
数据转换规范
转换链路
Request DTO → Aggregate → DO → Database
Database → DO → Aggregate → Response DTO
转换器实现
// 使用工厂或转换器类
public class PaymentOrderFactory {
public static PaymentOrderAggregate fromDO(PaymentOrderDO dataObject) {
// DO转聚合根
}
public static PaymentOrderDO toDO(PaymentOrderAggregate aggregate) {
// 聚合根转DO
}
public static PaymentOrderResponse toResponse(PaymentOrderAggregate aggregate) {
// 聚合根转响应DTO
}
}
事务管理
应用服务层添加事务
@Service
public class PaymentOrderApplicationService {
@Transactional(rollbackFor = Exception.class)
public Long createOrder(PaymentOrderCreateRequest request) {
// 业务逻辑
}
}
异常处理
异常层次
BizException (业务异常)
├── ValidationException (参数校验异常)
├── NotFoundException (资源不存在异常)
└── StatusException (状态异常)
代码质量要求
1. 代码风格
- 遵循阿里巴巴Java开发手册
- 所有类和方法必须有清晰的Javadoc注释
- 方法长度不超过50行
2. 必需注解
@Slf4j- 日志@Data/@Value- Lombok@Service/@Repository- Spring组件@Transactional- 事务管理@ApiModelProperty- API文档
3. 最佳实践
- 使用
Optional处理可能为空的返回值 - 使用
@NonNull标注非空参数 - 使用枚举代替魔法值
- 合理使用设计模式(工厂、策略等)
使用示例
输入
业务域: pay
实体名: PaymentOrder
表名: t_payment_order
CREATE TABLE `t_payment_order` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`order_no` varchar(64) NOT NULL,
`amount` decimal(10,2) NOT NULL,
`status` tinyint(4) NOT NULL,
`create_time` datetime NOT NULL,
`update_time` datetime NOT NULL,
PRIMARY KEY (`id`)
);
输出
生成完整的DDD分层代码,包括:
- 2个SDK接口(OperateApi、QueryApi)
- 6个DTO类(3个Request、3个Response)
- 2个API实现类
- 1个ApplicationService
- 1个Aggregate
- 1个Repository接口
- 1个RepositoryImpl实现
- 1个Mapper接口
- 1个DO类
注意事项
- ⚠️ 表名必须符合规范(建议
t_前缀) - ⚠️ 主键必须为
id,类型为bigint - ⚠️ 必须包含
create_time和update_time字段 - ⚠️ 字段COMMENT必须填写,用于生成API注解
- ⚠️ 生成代码后需要手动添加业务逻辑到聚合根
- ⚠️ 复杂查询需要在Mapper XML中编写SQL
- ⚠️ 需要根据实际业务调整领域服务和应用服务
扩展能力
可选生成内容
- 领域事件及监听器
- MQ消息生产者
- 定时任务
- 开放API实现
- 防腐层适配器
- 单元测试用例
版本: v1.0
最后更新: 2025-01-20
适用框架: Spring Boot 2.x + MyBatis Plus 3.x
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.