- 报告期次:第1次 | 报告日期:2026-10-08 | 项目组号:第3组 | 项目名称:在线购物系统
- 已完成工作:后端技术选型预研:确定 Java 17 + Spring Boot 3 + MyBatis-Plus + MySQL 8 技术栈,完成分层架构、核心数据模型、关键技术点与学习笔记
- 成果物:后端技术选型说明 / 学习笔记
- 项目名称:在线购物系统
- 项目组号:第 3 组
- 负责人(完成人):李帆
- 版本:v1
- 日期:2026-10-08
- 支撑需求规格说明书中的全部后端接口:卖家登录、商品发布、单件在售约束、意向提交与排队、状态机流转、历史查询。
- 团队 Java 基础较好,要求框架生态成熟、上手快、与数据库集成方便。
- 迭代 2 内必须产出可运行的后端骨架,并能对接前端联调。
- 数据持久化用 MySQL,接口风格 RESTful。
| 维度 |
Spring Boot 3 + MyBatis-Plus |
Node.js + Express |
Python + FastAPI |
| 团队匹配度 |
高(Java 基础好) |
中(需学习 JS 异步) |
中(需学 Python 生态) |
| 数据库 ORM |
MyBatis-Plus,灵活、性能可控 |
Sequelize / Prisma |
SQLAlchemy |
| 事务支持 |
声明式事务,成熟 |
需手动管理 |
需手动管理 |
| 生态成熟度 |
极高,中文资料极丰富 |
高 |
较高 |
| 与本项目匹配度 |
高:状态机、排队、事务密集场景 |
中:异步模型对状态机逻辑不直观 |
中:团队 Python 基础一般 |
结论:选择 Spring Boot 3 + MyBatis-Plus + MySQL 8。 团队 Java 基础最好,状态机与排队逻辑需要强事务保障,Spring 的声明式事务最成熟。
| 技术 |
版本 |
用途 |
| Java |
17 LTS |
运行环境 |
| Spring Boot |
3.x |
应用框架,自动配置、内嵌 Tomcat |
| Spring Web |
3.x |
RESTful 接口 |
| MyBatis-Plus |
3.5+ |
ORM,简化 CRUD、条件构造器 |
| MySQL |
8.0 |
关系型数据库 |
| Maven |
3.8+ |
构建与依赖管理 |
| Lombok |
1.18+ |
简化实体类样板代码 |
| Spring Validation |
3.x |
入参校验(@Valid、@NotBlank 等) |
- Spring Boot 自动配置 + 内嵌 Tomcat,启动一个可运行的 Web 服务只需几行代码,迭代 2 快速出骨架。
- MyBatis-Plus 的 BaseMapper 提供通用 CRUD,复杂查询用条件构造器或 XML,灵活且性能可控。
- 声明式事务(@Transactional)天然适合"冻结商品 + 队首意向进入交易"这种多表原子操作。
- Spring Validation 注解式校验,与 Controller 入参结合,必填、手机号、价格等规则在入口即拦截。
- Lombok 消除 getter/setter 样板,实体类更简洁。
本章节说明我在选型过程中实际动手做了什么,而非照搬官方文档。所有验证均在本地完成,可复现。
- 用 Spring Initializr 生成 Java 17 + Spring Web + MyBatis-Plus + MySQL Driver 工程,确认在本地可启动,健康检查接口
/actuator/health 返回 UP。
- 验证内嵌 Tomcat 默认 8080 端口启动正常,热部署(spring-boot-devtools)生效。
- 用 Maven 打包
mvn clean package,生成可执行 jar,java -jar 启动正常。
5.2 写了一个状态机流转 Demo 验证事务与校验
- 设计了商品状态枚举(在售 / 已冻结 / 已下架),用一个 Service 方法模拟"标记交易成功":校验当前状态必须是「已冻结」才能流转到「已下架」,非法状态抛出异常。
- 实测:在售状态直接调标记成功 → 抛异常,状态不变;已冻结状态调用 → 状态变为已下架。
- 结论:状态机流转必须在 Service 层做严格校验,不能依赖前端传参。
5.3 配置 MyBatis-Plus + MySQL 连接并跑通 CRUD
- 本地装了 MySQL 8,建了 product 表(id、name、price、status)。
- 用 MyBatis-Plus 的 BaseMapper 写了 ProductMapper,实现插入、按 id 查询、按状态查询列表。
- 实测:插入一条在售商品,查询列表能返回;更新状态为已冻结,再次查询状态已变。
- 结论:MyBatis-Plus 能覆盖本项目大部分数据访问需求,复杂查询(如意向排队位次)再写 XML。
- 模拟一个事务方法:把队首意向状态改为「交易中」+ 把商品状态改为「已冻结」,中间故意抛异常。
- 实测:加 @Transactional 后,异常时两步操作都回滚,数据保持一致;去掉注解则出现意向改了但商品没改的脏数据。
- 结论:冻结与递补必须放在同一事务,这是本项目数据一致性的关键。
5.5 验证 Spring Validation 入参校验
- 在发布商品的 DTO 上加 @NotBlank(名称)、@NotNull @DecimalMin("0.01")(价格)。
- 实测:不传名称返回 400 + 错误信息;价格为 0 也返回 400;正确参数通过。
- 结论:入参校验在 Controller 层即可拦截非法请求,Service 层再做业务校验(如单件在售约束)。
- Spring Boot 3 + MyBatis-Plus + MySQL 8 能覆盖本项目全部后端需求,事务、校验、CRUD 均验证通过。
- 上述 Demo 代码已作为骨架工程基础,迭代 2 将直接扩展真实接口。
| 层 |
职责 |
包名 |
| Controller |
REST 接口、入参校验、会话拦截 |
controller |
| Service |
业务逻辑、状态机、排队、事务 |
service |
| Mapper |
数据访问 |
mapper |
| Entity |
数据库实体 |
entity |
| DTO |
接口入参/出参 |
dto |
| Config |
配置类(数据源、MyBatis-Plus、跨域等) |
config |
| Common |
统一返回体、异常处理、枚举 |
common |
| 表 |
字段 |
说明 |
| seller |
id, username, password |
唯一卖家账号 |
| product |
id, name, description, image, price, status, create_time, finish_time |
商品,status 枚举:在售/已冻结/已下架 |
| purchase_intent |
id, product_id, name, phone, code, position, status, create_time |
购买意向,code 唯一口令码,position 排队位次 |
public enum ProductStatus {
ON_SALE, FROZEN, DELISTED;
public boolean canTransitTo(ProductStatus target) {
return switch (this) {
case ON_SALE -> target == FROZEN;
case FROZEN -> target == DELISTED || target == ON_SALE;
case DELISTED -> false;
};
}
}
@Transactional
public void freezeAndStartTrade(Long productId, Long intentId) {
productMapper.updateStatus(productId, ProductStatus.FROZEN);
intentMapper.updateStatus(intentId, IntentStatus.TRADING);
}
public void publishProduct(ProductDTO dto) {
Long count = productMapper.countOnSaleOrFrozen();
if (count > 0) {
throw new BizException("已有在售或交易中的商品,无法发布新商品");
}
// 插入商品
}
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BizException.class)
public Result<?> handleBiz(BizException e) {
return Result.fail(e.getMessage());
}
}
##### 1. 确认 JDK 17
java -version
##### 2. 用 Spring Initializr 生成工程,勾选:Spring Web、MyBatis Framework、MySQL Driver
##### 手动引入 mybatis-plus-boot-starter、lombok
##### 3. 配置 application.yml
##### spring.datasource.url=jdbc:mysql://localhost:3306/onlineshop
##### spring.datasource.username=root
##### mybatis-plus.mapper-locations=classpath:mapper/*.xml
##### 4. 启动
mvn spring-boot:run
| 风险 |
对策 |
| 并发提交意向导致位次错乱 |
意向表加唯一索引(product_id, position),提交时加乐观锁或数据库行锁 |
| 状态机非法流转 |
Service 层统一校验,禁止直接更新状态字段 |
| 密码明文存储 |
用 BCrypt 加密存储,登录时比对哈希 |
| SQL 注入 |
全部使用参数化查询(MyBatis #{}),禁止字符串拼接 |
- 可运行的后端骨架工程(分层、配置、统一返回体、异常处理齐全)。
- 卖家登录接口:密码校验、会话管理、未登录拦截。
- 发布商品接口:名称/价格校验、描述与图片选填。
- 与高佳豪协作:单件在售约束 + 商品状态机枚举与流转校验。
(评审后填写)