孟凡的博客blog.mengfanyaoapp.com
课程资料库›Spring + SpringMVC + MyBatis›第34次 · SSM整合与调用链
模块总览

第34次 · SSM整合与调用链

2026-10-02 · Spring + SpringMVC + MyBatis · 课程笔记
课堂练习资料 34-SSM整合与调用链.zip
下载 ZIP 压缩包

第34次 · SSM整合与调用链

第1/7页 · 先知道今天要做什么

先从一个熟悉的场景想一想:这节课的代码在帮我们解决什么问题?

先来一个生活里的画面

食堂窗口、后厨、仓库各有自己的工作:窗口接单,后厨安排制作,仓库按要求取物。SSM 的 Controller、Service、Mapper 也分工合作。本课先单独检查“后厨+仓库”的 BookServiceTest,Web 窗口另外部署。

你已经会的知识

用前面课的类、方法、参数和返回值来读本次例子。遇到新名字先看下一页;不用一开始读完整个工程。

为什么要学这一课

在chapter13-SSM中沿着Book查询串联Service与Mapper,先用JUnit验证服务,再阅读Controller入口。

今天完成的事情

先跑通 Service 查询,再定位 Controller、Service、Mapper 的调用。

这课在哪里做

要找什么 真实位置
下载后打开 04_源代码/chapter13-SSM/pom.xml
本次先读 src/main/java/com/itheima/service/impl/BookServiceImpl.java
运行或请求入口 src/test/java/BookServiceTest.java#findAllBooks

看到什么才算完成一小步

  1. BookServiceTest.findAllBooks:有真实Book列表与自己标记。
  2. Service加标记后再跑:标记在列表之前可见。
  3. 测试通过后访问HTTP:若没部署WAR,仍可能不能访问,分开验证。

阅读顺序

第2页查新词,第3页读这一份工程的代码,第4页先找文件和入口。第5页在 IDEA 按步骤修改;第6页对照效果和问题;第7页用自己的话复盘。

操作位置

下载、解压、打开、修改和运行在本机 IDEA;教学网站用于看讲义、下载资源、保存草稿和提交。先请教师提供本章的独立练习数据库、已初始化的表和连接参数。按指定配置文件填写本地连接;配置未就绪时先停在这一步。读到 SQLException 不等于 Java 写错。只在自己的教学库做新增、修改和回滚练习,单独运行指定测试方法,不点整个测试类的 Run All。

来源:第13章 框架整合 · 课件第6、9、13页(课件页码,不是教材印刷页码)

第2/7页 · 把新词说清楚

先把本课用得到的名字认清;看到名字时回到真实文件定位。

新词与本课含义

名字 在这个例子里是什么意思
SSM Spring、Spring MVC、MyBatis 各负责一部分工作。
服务测试 BookServiceTest 可单独验证查询,不等于 Web 已部署。
注入 BookServiceImpl 通过 Spring 得到 BookMapper。
数据源 数据库连接配置,在本项目 DAO 配置链里定位。

把生活画面对应到教材代码

生活里的角色或动作 本课真正的代码
接单窗口 BookController
安排具体查询 BookServiceImpl
取数据库记录 BookMapper 与 book 表

类比怎样用

先借这个画面记住分工,再回到本课文件逐项定位。生活里的角色只是类比,程序的实际行为以教材代码、配置和本机观察为准。

先对照文件名

src/main/java/com/itheima/service/impl/BookServiceImpl.java 是本次主阅读文件,位置在 04_源代码/chapter13-SSM 内。目录、类、方法和对象登记名是四种不同名字,不要随意互相替换。

读代码时只问三个问题

  1. 它从哪里得到输入:方法参数、XML、请求还是数据库?
  2. 它调用哪个具体方法:到同一个工程中查这个名字。
  3. 结果从哪里看:Run 控制台、请求响应还是数据库?本课第1页检查表给出位置。

先不用背术语

先能找到文件、指出一行的动作并描述输出。术语用来给已经看过的动作命名,不用它替代操作过程。

来源:第13章 框架整合 · 课件第6、9、13页(课件页码,不是教材印刷页码)

第3/7页 · 先看一个小例子

下面的教材片段来自本课下载项目;新增练习代码会另外标明。不要把节选直接当完整文件覆盖。

先猜一猜,读完代码再回答

服务测试通过,就能写“网页接口已验证成功”吗?

三个具体例子:先给输入,再想结果

输入或改动 应该观察什么 为什么
只运行 BookServiceTest 查询 可验证服务与数据访问路线 它不要求这次经过浏览器窗口。
JUnit 成功但 Tomcat 未部署 浏览器仍可能访问不到 测试入口与 Web 入口是两回事。
服务前加个人标记 标记应随该查询出现 帮助确认调用实际经过服务。

把例子用起来

这些是课堂推演,帮你看清“只改一个输入,结果怎样变化”。涉及数据库的编号、余额和数量是示意,动手时换成教师提供的真实练习数据;在 IDEA 写下自己的预测,再运行核对。

打开这一份文件

04_源代码/chapter13-SSM/src/main/java/com/itheima/service/impl/BookServiceImpl.java。在 IDEA 双击打开;以下只是它的第26—29行,完整类、import 和配置仍保留在项目中。

BookServiceImpl.java:先读这一段

04_源代码/chapter13-SSM/src/main/java/com/itheima/service/impl/BookServiceImpl.java 第26—29行

    public List<Book> findAllBooks() {
        return bookMapper.selectList(null);
    }
}

先看第1个动作

BookServiceImpl从Spring获得BookMapper,不在查询方法内手工new。

先看第2个动作

findAllBooks调用Mapper并返回图书列表。

先看第3个动作

BookServiceTest加载application-service.xml与application-dao.xml,单独测服务。

先看第4个动作

Controller属于Web请求层;JUnit通过不表示Tomcat已部署。

先读再动手

先在 IDEA 找到以上几行,逐项说出它们做什么。第5页会明确告诉你改哪一行、加到哪个大括号里、运行哪个入口;今天只改那几处。

来源:第13章 框架整合 · 课件第6、9、13页(课件页码,不是教材印刷页码)

第4/7页 · 一步一步做出来

先认清项目、文件和运行入口;保持同一个例子,再去第5页做个人修改。

本课项目目录

04_源代码/chapter13-SSM/pom.xml;选择直接包含 pom.xml 和 src 的这一层。

把这条路线讲成一段小故事

  1. JUnit 加载服务与 DAO 配置
  2. 获取 BookService
  3. 调用 BookMapper
  4. 返回列表并打印观察

先完成打开项目这一步

  1. 在讲义顶部点“下载代码资源”。等 ZIP 下载完成,在电脑文件管理器找到它,右键选择“全部提取/解压”,先解压成普通文件夹。不要直接在 ZIP 预览窗口中打开 Java 文件。
  2. 把解压目录复制一份作为自己的本课练习副本,例如 lesson-课次-学号。保留原包不改,后续课需要同章工程时可继续自己的副本,也可从原包重新开始。
  3. 按本页列出的“本课项目目录”进入到直接含 pom.xml 和 src 的那一层。整个 ZIP 解压目录、04_源代码 外层都不是这次的 Maven 项目根目录。
  4. 打开 IntelliJ IDEA。欢迎页点 Open(打开);已打开别的项目则点 File → Open。选择本课 pom.xml,出现选项时选 Open as Project(作为项目打开),或直接选它所在目录。已有项目时用 New Window,避免混淆。
  5. 导入后选择已安装的 JDK17,打开 Maven 面板 Reload All Maven Projects;依赖完成、代码无编译错误后再运行。

沿这些真实文件找代码

工程内路径 本次作用
src/test/java/BookServiceTest.java 先双击定位,与第5页指定的修改步骤对照;原包已有。
src/main/java/com/itheima/service/impl/BookServiceImpl.java 先双击定位,与第5页指定的修改步骤对照;原包已有。
src/main/resources/application-service.xml 先双击定位,与第5页指定的修改步骤对照;原包已有。
src/main/resources/application-dao.xml 先双击定位,与第5页指定的修改步骤对照;原包已有。

不要急着执行

先请教师提供本章的独立练习数据库、已初始化的表和连接参数。按指定配置文件填写本地连接;配置未就绪时先停在这一步。读到 SQLException 不等于 Java 写错。只在自己的教学库做新增、修改和回滚练习,单独运行指定测试方法,不点整个测试类的 Run All。

本页先定位,第5页再修改运行

下面说明本课的运行方式,先找到对应按钮。到第5页完成指定配置、新建文件或修改代码后,再按这些步骤执行;还不存在的类或测试方法先不要运行。

本课怎样运行:只运行一个 JUnit 测试

  1. 打开 src/test/java/BookServiceTest.java,找到 findAllBooks 方法(pagePractice 是本课按步骤新增的测试)。它带 @Test,不需要 main。
  2. 点该方法左侧绿色三角 → Run 方法名。不要点整个类的三角,本章可能同时有删除或转账测试。运行后在 Run 窗口同时检查测试结果、控制台与数据库实际值。
  3. 每次改代码后 Save All,再点同一方法的 Run/Rerun;若没有三角,先检查 src/test/java 是否被 Maven 识别、JUnit依赖是否下载完成以及代码是否有编译错误。

本课入口是否需要新增

运行入口已在下载包中;第5页先做必要的配置或改动,再执行这个入口。JUnit 只运行指定方法,避免其它实验一起改数据。

完成修改后检查

操作或输入 预期观察
BookServiceTest.findAllBooks 有真实Book列表与自己标记。
Service加标记后再跑 标记在列表之前可见。
测试通过后访问HTTP 若没部署WAR,仍可能不能访问,分开验证。

记录一遍过程

在第5页按顺序改完,每次 Save All 再运行。写下本次实际入口、输入与结果,和表里的预期逐项对照;第一次未成功就按第6页定位。

来源:第13章 框架整合 · 课件第6、9、13页(课件页码,不是教材印刷页码)

第5/7页 · 换成自己的代码

下载项目后,在电脑的 IntelliJ IDEA 中一步一步修改、运行并检查;网站最后只接收你的作业。

本课在 IDEA 中完成什么

先跑通 Service 查询,再定位 Controller、Service、Mapper 的调用。

今天就用这个具体版本练习

服务打印写“你的姓名:开始查书”。单独运行 BookServiceTest,再画出 Service→Mapper→book 的实际方法名。

这七页使用同一个工程例子

前面的代码阅读和下面的练习都使用本课下载项目。表中列出的文件已在包中;写明“新建”的文件由你按步骤在 IDEA 创建。先保留本地正确包名和目录,再按真实文件名提交修改后的文本。

本课项目目录

04_源代码/chapter13-SSM;选择这一层的 pom.xml。运行入口:src/test/java/BookServiceTest.java#findAllBooks。# 后面的文字表示要单独运行的测试方法。

第0步:下载、解压并在 IDEA 打开项目

  1. 在讲义顶部点“下载代码资源”。等 ZIP 下载完成,在电脑文件管理器找到它,右键选择“全部提取/解压”,先解压成普通文件夹。不要直接在 ZIP 预览窗口中打开 Java 文件。
  2. 把解压目录复制一份作为自己的本课练习副本,例如 lesson-课次-学号。保留原包不改,后续课需要同章工程时可继续自己的副本,也可从原包重新开始。
  3. 按本页列出的“本课项目目录”进入到直接含 pom.xml 和 src 的那一层。整个 ZIP 解压目录、04_源代码 外层都不是这次的 Maven 项目根目录。
  4. 打开 IntelliJ IDEA。欢迎页点 Open(打开);已打开别的项目则点 File → Open。选择本课 pom.xml,出现选项时选 Open as Project(作为项目打开),或直接选它所在目录。已有项目时用 New Window,避免混淆。
  5. 确认导入方式为 Maven。若出现信任提示,先核对这确实是本课程下载的工程再信任。等右下角索引与依赖下载结束,不在下载尚未完成时急着运行。
  6. 点 File → Project Structure → Project,将 SDK 设为已安装的 JDK 17。列表没有17就按教师安装包先安装,再 Add SDK/JDK 选择实际安装目录;不要把语言级别选17当作JDK已安装。
  7. 打开 View → Tool Windows → Maven,点击 Reload All Maven Projects(重新加载全部 Maven 项目)。若没有Maven面板,右键本课 pom.xml → Add as Maven Project。红色依赖仍存在时看下载错误,先解决网络/仓库和JDK配置。
  8. 回到左侧 Project,按本课文件表展开目录并双击文件。Java包可能合并显示为 com.itheima;表中的 src/main/java 表示主代码,src/test/java 表示测试。先核对包名与文件名,再修改。

先找到这些真实文件

项目根目录下的路径 怎么找到
src/test/java/BookServiceTest.java 在 IDEA 左侧 Project 按路径展开、双击;这份文件已在下载包中。
src/main/java/com/itheima/service/impl/BookServiceImpl.java 在 IDEA 左侧 Project 按路径展开、双击;这份文件已在下载包中。
src/main/resources/application-service.xml 在 IDEA 左侧 Project 按路径展开、双击;这份文件已在下载包中。
src/main/resources/application-dao.xml 在 IDEA 左侧 Project 按路径展开、双击;这份文件已在下载包中。

第1步前:准备运行依赖

先请教师提供本章的独立练习数据库、已初始化的表和连接参数。按指定配置文件填写本地连接;配置未就绪时先停在这一步。读到 SQLException 不等于 Java 写错。只在自己的教学库做新增、修改和回滚练习,单独运行指定测试方法,不点整个测试类的 Run All。 SSM 的数据源从 application-dao.xml 及其引用的配置定位;Boot 从 application.yml 定位。先核对启动的是哪个工程。

本课怎样运行:只运行一个 JUnit 测试

  1. 打开 src/test/java/BookServiceTest.java,找到 findAllBooks 方法(pagePractice 是本课按步骤新增的测试)。它带 @Test,不需要 main。
  2. 点该方法左侧绿色三角 → Run 方法名。不要点整个类的三角,本章可能同时有删除或转账测试。运行后在 Run 窗口同时检查测试结果、控制台与数据库实际值。
  3. 每次改代码后 Save All,再点同一方法的 Run/Rerun;若没有三角,先检查 src/test/java 是否被 Maven 识别、JUnit依赖是否下载完成以及代码是否有编译错误。

第1步:在 IDEA 操作并核对

本章压缩包有 SSM 与 Boot 两个工程,今天 File → Open 选择 chapter13-SSM/pom.xml。不要打开另一个项目的启动类。

第2步:在 IDEA 操作并核对

打开 BookServiceTest.java,在 println(allBooks) 前加一行自己的班级文字;单独运行 findAllBooks,核对测试输出和真实图书列表。

第3步:在 IDEA 操作并核对

打开 service/impl/BookServiceImpl.java,找到 findAllBooks,定位它调用的 Mapper 方法;再打开对应 Mapper 和 XML,记录三层实际名字。

第4步:在 IDEA 操作并核对

在 Service 的 findAllBooks 中、查询语句之前加一行自己的标记,保存重跑,确认标记出现在列表之前。不要改事务或数据源配置。

第5步:在 IDEA 操作并核对

查看 application-service.xml 与 application-dao.xml,分别记录服务扫描和数据源/Mapper 配置位置。今天测试没有启动 HTTP 页面,要看接口使用后续 Web 部署流程。

在本地写练习记录

  1. 在 IDEA 项目根目录右键 New → File,新建 练习说明.md。填写改过的完整文件路径、方法或行位置,别只写“改了代码”。
  2. 每组检查写输入/操作、预期、实际结果;文字输出从 Run 控制台抄,接口结果从本机请求抄,数据库结果写实际查到的值。未运行就写“未实测”,并说明卡在哪一步。
  3. 临时故意写错的对象名、请求或配置按本课要求恢复,Save All。关闭再打开修改文件,确认本地改动保留;最终效果用最后一次重新运行检查。

最后才回网站交作业

本课代码的打开、修改、运行和检查都在本机 IDEA 完成。网站只用来下载讲义/资源和提交结果,不能运行 Java。完成后点讲义顶部“打开代码任务”,将自己在 IDEA 改过的文本文件复制到任务对应文件中;名称与模板不同就“+ 添加文件”填写真实文件名,不为迁就网站模板改错本地包名。保留自己的旧草稿,只提交需要交的源码和练习说明。

保存与提交

添加练习说明.md 并核对本地运行记录 → 保存草稿 → 等显示已保存 → 正式提交并核对新增版本。草稿不计入正式提交次数。项目 ZIP 留在电脑,按教师指定方式另交;不要把 ZIP 二进制内容粘进文本编辑器。提交材料去掉真实密码与登录token。

来源:第13章 框架整合 · 课件第6、9、13页(课件页码,不是教材印刷页码)

第6/7页 · 出错时从哪里查

先保留现象,只检查这一课的同一条调用路线。一次改一处,再重跑确认。

常见现象

现象 先做什么
IDEA 没有运行三角或依赖报红 先查已安装的 JDK17、Maven 导入与下载错误;不要给 DAO/Controller 硬加 main。
运行结果还是旧的 核对右上角入口与当前工程;main/JUnit重新 Run,Web修改后重新编译部署或重启。
连接或启动失败 按第一段关键错误定位数据库、配置、端口或存储;环境未就绪先请教师检查。
没有预期数据或文字 按下面的具体输入表查调用链,分开看控制台、响应和真实数据,不把无报错等同完成。

遇到问题,先演一遍这一条路线

JUnit 加载服务与 DAO 配置 → 获取 BookService → 调用 BookMapper → 返回列表并打印观察

用本课的输入复查

操作或输入 对照实际结果
BookServiceTest.findAllBooks 有真实Book列表与自己标记。
Service加标记后再跑 标记在列表之前可见。
测试通过后访问HTTP 若没部署WAR,仍可能不能访问,分开验证。

按本课路线检查

  1. BookServiceImpl从Spring获得BookMapper,不在查询方法内手工new。
  2. findAllBooks调用Mapper并返回图书列表。
  3. BookServiceTest加载application-service.xml与application-dao.xml,单独测服务。
  4. Controller属于Web请求层;JUnit通过不表示Tomcat已部署。

需要老师帮忙时交这些

工程名 chapter13-SSM;运行入口 src/test/java/BookServiceTest.java#findAllBooks;你改的文件;输入或请求;第一段关键错误;本次预期与实际。截图之外保留错误文字,方便找到具体行。

把预测和实测分开

检查表是预期,不是替你运行过的证明。未在本机执行就写“未实测”;原教材配置或逻辑出现问题时记录原文件与现象,不写“系统判错”。

来源:第13章 框架整合 · 课件第6、9、13页(课件页码,不是教材印刷页码)

第7/7页 · 用自己的话讲一遍

用真实文件和本机结果说明你完成了什么;先说动作,再说术语。

回到第3页:你刚才猜对了吗?

服务测试通过,就能写“网页接口已验证成功”吗?

老师带你说清原因

不能。你已检查的是服务测试;浏览器请求还要正确部署 WAR、配置上下文并实际访问。

请换一个自己的例子

照着本课三个例子的写法,说清“我只改什么、预计哪一处变化、到哪里看结果”。不需要再发明一个陌生项目;用本课同一组文件和入口。

回答本课的两个问题

问题 参考解释
本节应打开哪个工程? chapter13-SSM,不是同包里的chapter13-springboot。
Spring主要负责什么? 创建和连接这些对象,Service/Mapper各自执行实际工作。

按这个顺序讲给同学听

  1. 我打开的工程是 chapter13-SSM,本次阅读文件是 src/main/java/com/itheima/service/impl/BookServiceImpl.java。
  2. 我实际改了哪一行、加了哪个方法;指着 IDEA 的代码说明。
  3. 我运行或请求的入口是 src/test/java/BookServiceTest.java#findAllBooks,输入是什么。
  4. 我在控制台、响应或数据库看到了什么,与第1页预期有什么差异。
  5. 我还有哪步没完成,保留了什么错误信息。

交作业前最后检查

文件与练习说明在 IDEA 已保存,正式提交的是自己的最终文本。下载包原样未改的部分标为参考;配置去掉真实密码和token。原有草稿不会被起始文件覆盖,需要时在代码任务查看本次起始文件对照。

课后再做一个小对照

只换本课检查表的一项输入,按同一入口重新执行,补一行预期和实际。没有环境时写明前置条件并停在实际完成的位置;不增加下一章的陌生功能。

来源:第13章 框架整合 · 课件第6、9、13页(课件页码,不是教材印刷页码)