ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

SSM框架游戏交易网毕设源码全解析:从搭建到答辩改造指南

SSM框架游戏交易网毕设源码全解析:从搭建到答辩改造指南

简介:一份面向Java方向毕业设计场景的完整项目包,基于SSM框架与MySQL数据库实现游戏交易网站,采用B/S模式,前端面向会员提供商品浏览、选购下单、资讯查看及注册信息维护功能,后台则由系统管理员统一管理商品、资讯和会员资料。压缩包共包含1221个文件,整体大小约107MB,其中以JSP页面、Java类文件、JS脚本、CSS样式、XML配置和SQL脚本为主,并配有JAR依赖库、GIF演示截图及演示视频,覆盖从源码到运行说明的完整链路。资源附带项目说明文档与操作演示,便于毕业生对照部署、调试支付回调等关键环节,或快速提取前端页面与后端控制器代码进行二次开发。目前已有172人学习该资源,适合需要参考成套SSM毕业设计项目或补充实战经验的学生。

1. 游戏交易网的毕设源码:值不值得下,拿到手能做什么

先把这个题目的边界划清楚。基于SSM框架的游戏交易网,是一个用 Spring + SpringMVC + MyBatis 搭起来的虚拟商品交易平台,买家注册登录、按分类或关键字搜游戏账号、道具、金币,下单走模拟支付;卖家发布商品、改价、下架、处理订单;管理员在后台维护分类、审核违禁商品、看用户和订单统计。你从压缩包里拿到的是整套源码、说明文档和演示视频,解开就是一条完整的毕设生产线。这东西适合谁?一类是做 Java 课程设计或毕业设计、不想从零造轮子的学生;另一类是刚学完 SSM 框架、想看看三层架构在真实业务里怎么落位的人。它最大的价值不是“交上去能过”,而是给你一份能跑通、能改名的骨架,让你在答辩时能把每一层讲清楚。这篇文章就按我从拿到压缩包到跑通、改造、准备答辩的完整顺序来讲。

2. SSM框架在游戏交易网里怎么分工:业务闭环、表设计与三层职责

有个反直觉的结论先放在这:拿到源码就急着点开 Java 类,是效率最低的读法。真正顺手的顺序是“需求 → 表结构 → 三层代码”。因为 SSM 这类项目本质上是围绕数据库表在转的,表看明白了,代码就只是表的搬运工。

2.1 交易网的三类角色与完整业务闭环:从注册、上架到订单完成

游戏交易网在毕设语境下,一般只有三类角色:买家、卖家和管理员。买家就是普通注册会员,卖家不需要单独开新号,同一个账号在个人中心切换身份即可。管理员是内置在数据库初始化脚本里的固定账号,负责后台维护。

买家侧的流程很标准:注册登录 → 逛首页商品列表 → 按分类过滤或按关键字搜索 → 进详情页看价格、描述和卖家信息 → 下单 → 走模拟支付 → 在“我的订单”里跟踪状态。这里要注意,毕设里说的“支付”基本都是假的,点一下按钮把订单状态从“待支付”改成“已支付”就算完事,不用接任何真实支付接口,但订单状态的流转逻辑必须完整。常见状态机是:待支付 → 已支付 → 待发货 → 已发货 → 交易完成,加上一个“取消订单”的旁路分支,用来处理卖家一直不发货的情况。

卖家侧是另一个视图。卖家登录后进“卖家中心”,可以发布商品、改价格改描述、上架下架、查看自己收到的订单并发货。这里有一个这个题目最容易忽略的业务细节:游戏交易网里的商品,比如一个游戏账号、一件限定道具,通常是一次性售卖的,卖完就没了。它和淘宝的“商品 + SKU 库存”模型完全不同,商品和订单往往是一对一关系,而不是一对多。这个差异直接决定了后面的表结构设计,也决定了订单创建时要同步把商品置为“已售出”。

管理员侧相对简单但答辩时很重要:管理商品分类(端游账号、手游道具、游戏币、点卡充值这类)、审核新发布的商品、下架违规商品、禁用违规用户、查看注册量和订单量统计。你拿到的版本如果没做审核功能,那至少也会有直接下架按钮。这三段逻辑是递进的:买家要买东西,前提是有人卖;卖家发商品要经过管理员;管理员审核通过后商品才出现在买家端。演示视频里往往只走了“注册→发商品→下单”这条主线,答辩时你主动把管理员这一环补上,明显会加分。

2.2 数据库表是项目的骨架:用户、分类、商品、订单四个核心表

SSM 项目的核心表一般就四张,别的附加表都是为了凑功能丰富度。四张表的关系不复杂:用户发布商品,用户下单,商品挂在一个分类下,订单关联一个商品和一个买家。

表名关键字段说明
t_userid, username, password, nickname, balance, role, create_timebalance 是虚拟币余额,模拟支付用;role 区分普通用户和管理员
t_categoryid, name, parent_idparent_id=0 表示一级分类
t_goodsid, user_id, cate_id, title, description, price, cover, status, create_timestatus 用 0上架 / 1下架 / 2审核
t_orderid, order_no, goods_id, buyer_id, seller_id, amount, status, create_timegoods_id 与商品一对一,一单一件

字段设计有几个容易被答辩追问的点。第一,密码到底加不加密。很多模板源码确实是明文存密码,甚至 Stored Procedures 里拼 SQL 直接查,这在答辩时是送命题。哪怕你不改代码,也要在说明文档里清楚写一句“生产环境应使用 BCrypt 加密,此处为教学演示未加密”,好过被老师问住。第二,t_goods.status 是全表最重要的字段:买家端列表只捞 status=0 的;卖家手动下架改成1;管理员审核中的商品是2。如果你拿到的版本没有 status 而是 on_sale 布尔字段,逻辑等价,但状态扩展性差一些。第三,t_order 里冗余了 buyer_id 和 seller_id,好处是查“我买到的”和“我卖出的”订单时,不用再 join 用户表,SQL 更简单。这在数据建模里叫合理冗余,答辩时老师喜欢听到这个词。

除了这四张表,常见的附加表还有 t_comment(评价)、t_news(公告)、t_feedback(留言反馈)。这些表的作用是让功能列表看起来更丰满,真正改造项目时,优先从这些表下手最安全——动了核心表结构,所有关联的页面和 SQL 都得改,工作量瞬间翻倍。

2.3 Spring、SpringMVC、MyBatis各扛什么活:为什么毕设偏爱这套组合

SSM 不是某一个框架的名字,而是三个框架的叠放:Spring 管对象生命周期和事务,SpringMVC 管 HTTP 请求的路由分发和参数绑定,MyBatis 管 SQL 执行和结果映射。三者在一次请求里的协作顺序是固定的:浏览器发请求 → SpringMVC 的 DispatcherServlet 找到对应 Controller → Controller 调 Service → Service 调 Mapper 接口 → MyBatis 通过 XML 里的 SQL 查数据库 → 结果逐层返回。

Spring 在这一套里的角色是大管家。所有 @Service 标注的类由它创建和维护,所有 @Autowired 注入都是它在背后把对象塞给你,@Transactional 事务注解也是它拦截并管理的。你不需要手动 new Service,也不需要手动 commit/rollback。SpringMVC 是前台调度员,@RequestMapping 把 URL 和 Java 方法绑在一起,方法参数上的 @RequestParam、@PathVariable 都是它的语法糖。如果前端传参顺序和 Controller 方法参数对不上,报 400 或参数为 null,多半是这一层出了问题。

MyBatis 和其他 ORM 最大的区别是 SQL 依然由你亲手写。Mapper 接口只有方法签名,真正的逻辑在对应的 XML 文件里,SQL 写得好不好、能不能走索引、会不会注入,全在你的掌控之下。对比 Hibernate 自动生成 SQL 的方式,MyBatis 更符合国内教学和面试的口味,也方便后期调优。

为什么毕设偏爱 SSM 而不是直接上 Spring Boot?我理解有两个现实原因。第一,SSM 是“配置显式暴露”的框架,web.xml、spring-mvc.xml、applicationContext.xml、mybatis-config.xml 四个配置文件的折腾过程,恰好能证明学生理解三层架构,导师审题时也更有安全感。第二,SSM 的报错案例和解决方案在搜索引擎里沉淀了十几年,遇到问题一搜就有。代价是配置繁琐,第一次跑通通常要消耗半天到一天。至于 Spring Boot 与 SSM 的关系,我在第 6 章单独讲迁移,提前记住一个结论:Spring Boot 不是取代 SSM 的新技术,而是把 SSM 的配置做了约定化封装,底层跑的还是这套东西。

3. 把源码跑起来:解压、导库、改配置、启动Tomcat的完整步骤

我不建议一上来就双击演示视频。建议按“说明文档 → 数据库脚本 → 配置文件 → 启动 → 对照视频”这个顺序走。原因是:校园里流传的这套源码大多出自同一个模板,功能结构相似,但作者本机的环境和你的环境几乎不可能完全一样。你能做的不是祈祷一次跑通,而是把自己的环境对齐到他留在配置里的痕迹上。

3.1 环境准备先对齐:JDK、MySQL、Tomcat、IDEA的常见版本搭配

SSM 项目对环境极其敏感。最常见的坑是 JDK 版本太高,旧 Maven 工程直接编译不过。按我给人远程排障的经验,最省事的一套组合是:JDK 1.8(javac -version 显示 1.8.0_xx 才行)、MySQL 5.7(8.0 也能用但驱动要换)、Tomcat 8.5 或 9(千万别上 Tomcat 10,它把 javax.servlet 换成了 jakarta.servlet,SSM 老代码编译必炸)、IDEA 2020 以后的版本。如果工程是 Maven 管理的,Maven 3.6.3 最稳。

组件推荐版本不推荐的原因
JDK1.811/17 会报 javax 缺失或语法降级问题
MySQL5.78.0 需把驱动换成 com.mysql.cj.jdbc.Driver
Tomcat8.5 / 910+ 的 servlet 包名变更,老项目直接编不过
Maven3.6.33.8+ 对镜像仓库配置更严格,容易下载依赖失败
IDEA2020+太老的版本对 Maven 导入和 Tomcat 集成支持弱

如果解压出来的工程根目录没有 pom.xml,只有 .classpath 和 .project,说明这是个 Eclipse 普通 Web 工程。IDEA 导入时选择 “Eclipse” 或 “Java Project in Eclipse” 模式,不要手动新建一个 Project 再把 src 拷过去,那样会丢掉编译配置和部署描述符。

3.2 压缩包里的内容怎么用:源码、说明、演示视频的配合顺序

压缩包解开后,一般就是三类东西:源码工程目录、数据库脚本(.sql)、说明文档和演示视频。说明文档通常是 Word,别只把它当成交差用的附件,先翻一遍。里面有大概率写明了数据库名、默认账号密码、Tomcat 端口、项目访问路径这些关键信息,甚至作者用的是哪个版本的 JDK。这就是第一手配置依据,比你盲猜强得多。

演示视频的正确用途是校准页面顺序。它会告诉你这个网站跑起来以后登录页长什么样、注册之后点哪几个按钮、管理员入口在哪。先把视频里出现的操作流程记下来,再对照 SQL 脚本里的初始化数据,一般能反推出哪个账号是管理员、哪些商品是预置数据。

在打开 IDE 之前,先在纯文件层面做三件事:确认 .sql 脚本存在;找到 jdbc.properties 或 db.properties 这类数据库配置文件;比对脚本里的库名和配置文件里的库名是否一致。很多版本里这两处对不上,这一步就能发现问题,不用等启动报错才回头查。

3.3 改数据库连接与端口再启动:两个必改项和启动后的验证姿势

先建库导数据。手动建库我推荐用命令行而不是图形化工具,因为编码问题在命令行里看得最清楚。

CREATE DATABASE IF NOT EXISTS game_trade DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE game_trade; SOURCE /your/path/game_trade.sql;

这段 SQL 干了三件事。第一行创建数据库,game_trade 是我习惯用的库名,你直接替换成 SQL 脚本里原有的库名即可;字符集用 utf8mb4 是为了防游戏昵称、道具描述里出现 emoji 导致保存失败,如果脚本里已有建库语句且是 utf8,统一改成 utf8mb4 问题不大。第二行切到该库。第三行把 SQL 脚本原样执行进去,路径不要带中文目录。导入完成后执行 SHOW TABLES; 确认核心表都在,这一步能过滤掉“SQL 脚本只写了一半”这种隐蔽问题。

接着改数据库连接。SSM 的数据库配置绝大部分在 src/main/resources/jdbc.properties 或更老的 src/jdbc.properties。

jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/game_trade?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai jdbc.username=root jdbc.password=你的本机密码

参数说明:driver 用 com.mysql.jdbc.Driver 对应 MySQL 5.x 的驱动版本;如果你装的是 MySQL 8.0,这里必须换成 com.mysql.cj.jdbc.Driver,同时 url 里要带 serverTimezone,否则 MyBatis 初始化连接池时直接报时区错误。characterEncoding=utf-8 是页面不出现中文乱码的前提,这个参数经常被模板源码漏掉。password 不要照着网上教程抄,改成你本机 MySQL 的真实密码。

启动分两种情况:Maven 工程用 IDEA 打开,等依赖下载完,配置一个本地 Tomcat Server;非 Maven 老工程直接把工程的 web 目录部署进 Tomcat。配置 Tomcat 时注意 Deployment 里的 artifact 要选 war exploded 展开部署,比 war 包模式好调试;Application context 填的值要和后面浏览器访问的 URL 一致。

启动后用浏览器做三个验证:首页能不能打开、验证码图片能不能显示、用普通账号能不能登录进去。这些验证如果有一个失败,别急着改业务代码,先看 Tomcat 日志,把异常堆栈贴到搜索引擎里找答案。

补充一个命令行启动 Tomcat 的姿势,方便不用 IDEA 的同学:

cd /path/to/apache-tomcat-8.5.x/bin ./startup.sh tail -f ../logs/catalina.out

tail -f 是实时盯日志。日志里出现 “Deploying web application archive” 或 “Server startup in [xxxx] milliseconds” 才代表部署成功。如果报 ClassNotFoundException 或 BeanCreationException,直接查异常堆栈第一段即可定位,比逐行研究配置高效得多。

提示:MySQL 5.7 和 8.0 的驱动类名不同、url 参数也不同,这是 SSM 项目跑不起来的第一大环境差异来源。

4. 走读核心代码:登录、下单、查询在SSM三层里是怎么串起来的

跑通以后,你要从“能点”过渡到“能讲”。这一章选三个最常被答辩追问的片段拆开看,顺序按一次完整交易的自然流程走:先登录,再下单,最后讲列表查询。

4.1 一次登录请求的三层流转:Controller收参数、Service校验、Mapper查库

登录是所有页面的入口,也是理解三层分工最好的切片。先看 Controller:

@Controller @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @RequestMapping(value = "/login", method = RequestMethod.POST) public String login(String username, String password, HttpSession session, Model model) { User user = userService.login(username, password); if (user == null) { model.addAttribute("msg", "用户名或密码错误"); return "login"; // 转发回登录页 } session.setAttribute("loginUser", user); return "redirect:/goods/list"; } }

这一段说明三件事。第一,Controller 里没有一行 JDBC 代码,它只做参数接收和页面跳转,这是 SpringMVC 的定位。第二,password 以 String 直接接收,如果 JSP 登录表单里的密码控件 name 不叫 password,这里收到的就是 null,这是最常见的低级 bug。第三,登录成功后的用户对象放进 session,后续页面用 sessionScope.loginUser 取值。

再看 Service 层:

public User login(String username, String password) { User user = userMapper.selectByUsername(username); if (user != null && user.getPassword().equals(Md5Utils.md5(password))) { return user; } return null; }

Service 层不写 SQL,只调 Mapper 接口并夹带业务判断。注意这里的密码比对用了 Md5Utils 做了一次摘要,算是模板源码里比较讲究的写法;如果你拿到的版本是明文 equals,答辩前要么补齐加密,要么在文档里如实说明。分工上,Service 层的存在感全在“业务规则”,比如密码校验失败返回 null,以及后面下单时的状态校验,都在这一层完成。

4.2 下单动作为什么必须加事务:拦截超卖、状态联动与回滚逻辑

游戏交易网的商品是一次性虚拟物品,没有库存扣减的说法,正确的实现是“创建订单的同时把商品标记为已售出”。这段逻辑必须在一个事务里:

@Transactional(rollbackFor = Exception.class) public Order createOrder(int goodsId, int buyerId) { Goods goods = goodsMapper.selectById(goodsId); if (goods == null || goods.getStatus() != 0) { throw new BizException("商品不存在或已下架"); } Order order = new Order(); order.setOrderNo("G" + System.currentTimeMillis()); order.setGoodsId(goodsId); order.setBuyerId(buyerId); order.setSellerId(goods.getUserId()); order.setAmount(goods.getPrice()); order.setStatus(0); // 0代表待支付 orderMapper.insert(order); goodsMapper.updateStatus(goodsId, 1); // 同步把商品置为已售出 return order; }

@Transactional 是这一段的重心。它保证“插入订单”和“商品下架”两个操作要么都成功,要么都回滚。如果漏掉这个注解,第二步 updateStatus 抛异常时订单已经落库,结果就是买家手里有订单、卖家商品还在架上,同一件货可能被卖第二次,这是交易系统最忌讳的超卖。rollbackFor = Exception.class 的含义是所有异常都触发回滚,别只写 @Transactional 不带条件,那样默认只对 RuntimeException 回滚,检查异常拦不住。

你还可以在答辩时主动指出一个设计选择:这里没有做库存字段的原子扣减,而是直接把商品状态置为已售出。原因是虚拟物品一对一交易的业务模型决定的,不是偷懒。这句话说出来,老师会认可你是真的理解了业务约束。

4.3 MyBatis的XML与动态SQL:查商品列表时最容易写错的细节

交易网首页的商品列表一般要支持分类过滤加关键字搜索加分页。MyBatis 的 XML 写法是:

<select id="selectByCondition" resultType="com.example.entity.Goods"> SELECT id, title, price, cover, create_time FROM t_goods <where> <if test="status != null"> AND status = #{status} </if> <if test="cateId != null and cateId != 0"> AND cate_id = #{cateId} </if> <if test="keyword != null and keyword != ''"> AND (title LIKE CONCAT('%', #{keyword}, '%') OR description LIKE CONCAT('%', #{keyword}, '%')) </if> </where> ORDER BY create_time DESC LIMIT #{offset}, #{pageSize} </select>

三个关键点。第一, 标签会动态去掉第一个多余的 AND,手写 SQL 时容易写出 WHERE AND title = ... 这种语法错误,MyBatis 帮你消掉了。第二,#{keyword} 是预编译占位符,会渲染成 ? 再传参;如果写成 ${keyword} 就是字符串直接拼接,存在 SQL 注入风险,论文里出现这种写法基本会被评委一票否决。第三,分页用 LIMIT #{offset}, #{pageSize},offset 要在 Service 或 Controller 层算好传进来,即 (pageNum - 1) * pageSize。

还有一个隐蔽问题:如果表字段是下划线命名 create_time,而 Java 实体类属性叫 createTime,需要 mybatis-config.xml 里开启 mapUnderscoreToCamelCase=true 才能自动映射。这个开关没开的话,查询结果里时间字段永远是 null,页面显示空白,排查起来非常折磨。建议拿到源码第一件事就检查这个配置。

5. 拿源码到能上线答辩的避坑清单:五类高频翻车现场与排查顺序

这一章每一条都是真实遇到过的场景。在没跑通之前不要动任何业务代码,先按下面的顺序排查环境。很多问题看起来像代码 bug,其实是环境、路径和配置三方叠加的产物,按规律查比乱试快得多。

5.1 导入IDEA一片红:别急着改代码,先查JDK与Maven仓库

现象:项目导入进去满屏红波浪线,所有 import 都标红,或者 pom.xml 第一行就报错。

原因:九成是 IDE 的 Project SDK 停在 11 或 17,源码按 JDK 1.8 写的;另一种常见情况是 Maven 本地仓库缓存不完整或镜像源不可达,依赖没下载下来。

解决:先打开 File → Project Structure → Project,把 SDK 和 language level 切回 1.8;再点开右侧 Maven 面板执行 Reimport 强制重新解析。如果依然红,检查本地 .m2 目录下有没有 spring-webmvc 对应版本的 jar;没有的话,修改 Maven 的 settings.xml 配置一个国内镜像源,这只是常规依赖加速,不涉及任何特殊网络配置。改完等右下角进度条走完,红色基本消掉大半。

5.2 页面404:八成是部署路径和context path没对上

现象:Tomcat 能启动,控制台没有任何异常,浏览器访问 http://localhost:8080 却能打开 Tomcat 默认首页;或者点登录后跳到一个 URL 报 404。

原因:IDEA 里 Tomcat 的 Deployment 里没有把当前工程加进去,项目根本没部署上;或者 Application context 填的和页面实际请求的路径不一致。

解决:打开 Run → Edit Configurations → Deployment,确认 Artifact 是 war exploded,Application context 与源码里 ${pageContext.request.contextPath} 的使用保持一致。保守做法是填 /,再用浏览器开发者工具抓一下页面实际发出的请求路径,按那个值对齐。改完配置记得 Restart Server,只点 Rerun 不会触发重新部署的案例非常常见。

5.3 页面中文全变问号:数据库连接串里的编码参数在背锅

现象:注册、发布商品之后,数据库里中文是正常的,页面读出来却全是 ??;或者打开数据表直接看到存的就是 ???。

原因:典型的编码链路断裂,通常出在两个位置:jdbc.url 里没有 useUnicode=true&characterEncoding=utf-8;或者连接串正确但建表时用的字符集是 latin1。

解决:先查表确认:SHOW TABLE STATUS LIKE 't_goods'; 如果 Collation 列带有 latin1_swedish_ci,就重新建库或用 ALTER TABLE t_goods CONVERT TO CHARACTER SET utf8mb4; 再改 jdbc.url 加上 encoding 参数并重启 Tomcat。已存在的脏数据大概率救不回来,删掉重新录入即可。这个过程建议录屏,答辩时讲“中文乱码从环境到数据的排查”,老师会认为你有实操经验。

5.4 登录就报500:Mapper绑定失败是SSM第一大黑匣子

现象:点登录或浏览商品列表,页面直接跳 500,日志里出现 BindingException: Invalid bound statement (not found),类似这样。

原因:Mapper 接口和 XML 文件没有正确绑定。要么 XML 里的 namespace 和接口的全限定名不一致,要么 mapper 接口的方法名和 XML 里的 id 对不上,要么 XML 文件没被编译进 classes 目录。

解决:按顺序三查。一查 XML 的 namespace 是否为接口全限定名;二查接口方法名和 XML 的 id 是否一字不差;三查 target/classes 目录下有没有对应的 XML 文件,没有就在 pom.xml 的 build 节点里补 resource 配置把 xml 目录收进去。还有一个容易忽视的点:Spring 配置里 Mapper 扫描的包路径是 com.xxx.dao,而接口放在 com.xxx.mapper 下,路径不匹配就会绑定失败。

5.5 改了JSP页面不生效:Tomcat缓存和重启用哪个都别乱

现象:改了 index.jsp 里的标题,刷新浏览器还是旧内容;改了 Controller 方法,重启后路由还是旧的。

原因:JSP 会被 Tomcat 预编译成 class 缓存在 work 目录;Java 类的修改如果改变了类结构,IDEA 的热部署机制并不总是生效。

解决:改 JSP 后执行 Build → Rebuild Project,再加一个强制刷新;改 Java 后直接 Restart Server,顺手清掉 Tomcat 的 work/Catalina/localhost 缓存目录。SSM 阶段的热部署体验本就粗糙,正确心态是把它当成一个“改完必须重启”的老牌框架。等后面迁到 Spring Boot,再享受 DevTools 的自动重启不迟。

6. 从“能跑”到“能答辩”:三个投入最小的改造方向与验证技巧

6.1 给交易网加一个“求购发布”的小需求,顺便补齐双向闭环

不管压缩包里的功能全不全,加一个“求购大厅”是成本最低的扩展。它不用新增核心表,在 t_goods 表里加一个 type 字段区分出售和求购,再让列表查询按 type 过滤即可。代码量不大,但把“C2C 交易平台的双向闭环”讲圆了,从单向出售变成买卖双向,这一句就能说明你不只是在抄代码。

6.2 把SSM平滑迁到Spring Boot:迁移清单与边界在哪里

把 Service 和 Mapper 原样搬过来,spring-mvc.xml、applicationContext.xml、spring-dao.xml 里的配置翻译成 application.yml 里的数据源、事务和 mybatis 配置;注解基本不用改,MyBatis 的 XML 可以保留。真正的边界在 web.xml 用内嵌 Tomcat 替代,JSP 的目录语义要换。如果一周内答辩,这个迁移不一定做,但要能说清:Spring Boot 是“约定大于配置”的 SSM 封装,不是新框架。这个话题经常出现在 Java 面试题里,提前想清楚,答辩时被问到的概率不低。

6.3 答辩前你自己就能做的自测:用真实订单把流程走三遍

准备三个账号:管理员、卖家 A、买家 B,按“发布 → 审核 → 搜索 → 下单 → 发货 → 确认 → 完结”完整走三遍。第一遍跑通主线;第二遍故意输入错误密码、越权访问管理员页面;第三遍把 MySQL 服务停掉再重启,看页面是否正常回退。这套自测比背代码有效得多。最后分享一个我自己的习惯:每次改完代码,都把 Tomcat 日志窗口开着再操作页面,观察每一跳背后的请求是不是预期的那一个。很多隐蔽 bug 都是这样在看日志时逮到的,希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进