主要改进: - 新增OrderCreationRequest及相关DTO类,使用Builder模式提升代码可读性 - 引入类型安全的枚举类OrderConstant,替代魔法字符串常量 - 重构PlayOrderInfoServiceImpl,新增基于Builder模式的createOrderInfo方法 - 保留原有方法并标记为@Deprecated,确保向后兼容性 - 完善单元测试覆盖,包含Mockito模拟和边界条件测试 - 优化包结构,将DTO类从vo包迁移到dto包 - 添加JUnit 5和Mockito测试依赖 - 移除实体类过度使用的Lombok注解,改用精简的自定义构造器 - 新增数据库开发工作流程文档 技术栈: - Spring Boot 2.7.9 - MyBatis-Plus 3.5.3.2 - JUnit 5 + Mockito - Lombok Builder模式 - 类型安全枚举设计
6.9 KiB
6.9 KiB
Database Development Workflow
This document outlines the recommended workflow for database schema changes and code generation in the peipei-backend project.
Overview
The project uses a Database-First approach with the following flow:
Flyway Migration → Database Schema → Code Generator → Java Code
Step-by-Step Workflow
1. Create Flyway Migration
Create a new migration file in /play-admin/src/main/resources/db/migration/:
-- V{version}__{description}.sql
-- Example: V2__add_new_feature_table.sql
CREATE TABLE `play_new_feature` (
`id` varchar(32) NOT NULL COMMENT 'UUID',
`feature_name` varchar(100) COMMENT '功能名称',
`feature_type` varchar(20) DEFAULT NULL COMMENT '功能类型',
`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
`tenant_id` varchar(32) NOT NULL COMMENT '租户ID',
`created_by` varchar(32) DEFAULT NULL COMMENT '创建人的id',
`created_time` datetime DEFAULT NULL COMMENT '创建时间',
`updated_by` varchar(32) DEFAULT NULL COMMENT '修改人的id',
`updated_time` datetime DEFAULT NULL COMMENT '修改时间',
`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除',
`version` int(11) NOT NULL DEFAULT '1' COMMENT '数据版本',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='新功能表';
Migration Naming Convention:
V{version}__{description}.sql- Version format:
V1.2025.0609.10.11(timestamp-based) - Description: snake_case with double underscore
2. Run Flyway Migration
Apply the migration to update database schema:
# Run from project root
mvn flyway:migrate
# Or check migration status
mvn flyway:info
3. Configure Code Generator
Edit /play-generator/src/main/resources/config.properties:
# Database configuration (should match main app)
db.url=jdbc:mysql://localhost:3306/play-with?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
db.driver=com.mysql.cj.jdbc.Driver
db.username=root
db.password=your_password
# Code generation configuration
gen.author=your_name
gen.packageName=com.starry.admin
gen.outputDir=./generated-code
gen.autoRemovePre=false
gen.tablePrefix=play_
gen.tplCategory=crud
# Specify the new table(s) to generate
gen.tableNames=play_new_feature
4. Run Code Generator
Generate Java code from the new table structure:
cd play-generator
./run.sh
# Or manually: mvn clean compile exec:java
5. Review Generated Code
Check the generated files in ./generated-code/:
generated-code/
├── src/main/java/com/starry/admin/
│ ├── entity/PlayNewFeatureEntity.java
│ ├── mapper/PlayNewFeatureMapper.java
│ ├── service/IPlayNewFeatureService.java
│ ├── service/impl/PlayNewFeatureServiceImpl.java
│ └── controller/PlayNewFeatureController.java
└── src/main/resources/mapper/PlayNewFeatureMapper.xml
6. Integrate Generated Code
Copy generated files to the appropriate module in play-admin:
# Create new module directory structure
mkdir -p play-admin/src/main/java/com/starry/admin/modules/newfeature/{controller,service,mapper,module/entity}
# Copy generated files to appropriate locations
cp generated-code/src/main/java/com/starry/admin/controller/* \
play-admin/src/main/java/com/starry/admin/modules/newfeature/controller/
cp generated-code/src/main/java/com/starry/admin/service/* \
play-admin/src/main/java/com/starry/admin/modules/newfeature/service/
cp generated-code/src/main/java/com/starry/admin/mapper/* \
play-admin/src/main/java/com/starry/admin/modules/newfeature/mapper/
cp generated-code/src/main/java/com/starry/admin/entity/* \
play-admin/src/main/java/com/starry/admin/modules/newfeature/module/entity/
cp generated-code/src/main/resources/mapper/* \
play-admin/src/main/resources/mapper/newfeature/
7. Customize and Test
- Review generated code for any needed customizations
- Add business logic to Service implementations
- Customize validation in Controllers
- Add custom queries in Mapper if needed
- Test the new endpoints via Swagger UI
- Run application to ensure everything works
Database Design Best Practices
Table Naming Convention
- Use
play_prefix for all tables - Use snake_case for table names
- Example:
play_order_info,play_clerk_level_info
Required Standard Columns
All tables should include these standard columns:
`id` varchar(32) NOT NULL COMMENT 'UUID',
`tenant_id` varchar(32) NOT NULL COMMENT '租户ID',
`created_by` varchar(32) DEFAULT NULL COMMENT '创建人的id',
`created_time` datetime DEFAULT NULL COMMENT '创建时间',
`updated_by` varchar(32) DEFAULT NULL COMMENT '修改人的id',
`updated_time` datetime DEFAULT NULL COMMENT '修改时间',
`deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除',
`version` int(11) NOT NULL DEFAULT '1' COMMENT '数据版本',
Column Guidelines
- Always add meaningful
COMMENTto columns - Use appropriate data types (
varchar,int,decimal,datetime) - Set proper defaults where applicable
- Consider indexing for foreign keys and frequently queried columns
Code Generation Notes
What Gets Generated
- Entity: MyBatis Plus entity with Lombok annotations
- Mapper: Database access interface extending BaseMapper
- Service: Business logic interface with standard CRUD operations
- ServiceImpl: Service implementation with basic CRUD logic
- Controller: REST API endpoints with Swagger documentation
- Mapper XML: MyBatis SQL mapping files
Generated Code Features
- Swagger API documentation
- Spring Security integration (
@PreAuthorize) - Audit logging (
@Log) - Input validation
- Pagination support
- Logical deletion support
- Multi-tenant support
Troubleshooting
Common Issues
Migration Fails:
- Check database connection settings
- Verify migration SQL syntax
- Ensure proper permissions
Generator Fails:
- Verify database connection in config.properties
- Check if table exists after migration
- Ensure table follows naming conventions
Generated Code Issues:
- Review column comments (used for Java doc)
- Check data type mappings
- Verify package naming in config
Database Type Mappings
| MySQL Type | Java Type | Notes |
|---|---|---|
varchar(n) |
String |
|
int, bigint |
Integer, Long |
|
decimal(p,s) |
BigDecimal |
Precise decimal calculations |
datetime |
Date |
Or LocalDateTime |
tinyint(1) |
Boolean |
For flags/status |
char(1) |
String |
For status codes |
Tips
- Always create migration first, then generate code
- Use descriptive table and column names - they become class and field names
- Test migrations on dev environment before applying to production
- Review generated code before committing - customize as needed
- Follow existing module patterns when organizing generated code
- Backup database before running migrations in production