简介这份源码资源面向Java Web初学者与需要从零搭建SSM框架的开发者基于IDEA2021、Tomcat9.0与MySQL8.0.25环境完整演示SpringSpringMVCMyBatis整合过程帮助读者理解分层架构、依赖注入与数据库映射的落地方式。压缩包共105个文件约22.34MB其中52个jar为框架与数据库驱动依赖28个xml承担Spring、MyBatis及Web配置另有java源码、jsp页面、properties配置、class编译文件等覆盖从配置到运行的完整链路。目前已有3136人学习下载说明该搭建流程具备一定参考价值。读者可据此获得一套可直接导入IDEA的工程结构对照Controller、Service、Dao与实体类的组织方式掌握SSM各层职责划分、配置文件写法及常见启动报错的排查思路适合作为课程设计或入门练手的起步模板。1. 从一次“找不到依赖”的翻车说起IDEA 2021 搭 SSM 到底要装什么很多人第一次在 IDEA 2021 里搭 SSM卡住的地方根本不是 Spring、SpringMVC、MyBatis 三者怎么串起来而是打开项目第一眼就飘红Cannot resolve symbol springframework。我见过一个模拟项目X代码逻辑写得挺完整结果换台机器重新拉下来Maven 本地仓库是空的IDEA 又默认走它自带的 Maven版本和pom.xml里写的对不上光“让依赖下载下来”就耗掉一整个下午。SSM 框架搭建在 JavaWeb 里属于最经典、也最容易被低估的一类环境活它不挑高深算法但特别挑版本对齐和目录结构。这篇笔记面向的是正准备用 IDEA 2021 从零搭一套 SSM 源码的开发者尤其是那种“照着视频敲完却跑不起来”的情况。下面按装什么、怎么装、坏了怎么救的顺序走一遍版本和参数我都会写清楚能直接抄。2. 环境清单与版本选择IDEA 2021 下 SSM 的依赖怎么定2.1 先把 JDK、Maven、Tomcat 三件套定死SSM 本身是代码层面的框架但它跑起来要靠一整套外部环境托着。IDEA 2021 这个版本对 JDK 8 的支持最稳再往上到 JDK 11 也能跑但 Spring 5.x 配 JDK 8 是社区里踩坑最少的组合。我一般会这样定组件推荐版本说明JDK1.88u 系列Spring 5.x 官方基线IDEA 2021 识别无压力Maven3.6.3比 3.8 少一些镜像和 HTTP 仓库的拦截问题Tomcat8.5 或 9.0别用 Tomcat 10javax.*包名变了会直接崩MySQL5.7 或 8.08.0 要换驱动类和时区参数IDEA2021.1 ~ 2021.3社区版够用旗舰版对 Web 支持更全这里最容易被忽略的是 Tomcat 版本。Tomcat 10 把javax.servlet改成了jakarta.servlet而 Spring 5.x 还在用javax一旦用 Tomcat 10 部署启动就报ClassNotFoundException。所以搭 SSM 源码Tomcat 停在 9.0 就行别追新。Maven 版本也不是越新越好。3.8 之后默认拦截 HTTP 仓库如果你settings.xml里配的是公司内网或老镜像会直接报blocked mirror。3.6.3 相对省心这也是我反复用它的原因。2.2 pom.xml 里 SSM 依赖的版本对齐环境定完真正决定能不能跑通的是pom.xml。SSM 三件套的版本必须互相兼容Spring 和 MyBatis 之间还要靠mybatis-spring这个桥接包粘起来。下面是我常用的一套组合直接抄!-- Spring 核心context 负责 IoC 容器webmvc 负责 MVC 调度 -- dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version5.3.20/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version5.3.20/version /dependency !-- Spring 事务管理Service 层 Transactional 靠它 -- dependency groupIdorg.springframework/groupId artifactIdspring-tx/artifactId version5.3.20/version /dependency dependency groupIdorg.springframework/groupId artifactIdspring-jdbc/artifactId version5.3.20/version /dependency !-- MyBatis 本体与 Spring 桥接包版本要成对看 -- dependency groupIdorg.mybatis/groupId artifactIdmybatis/artifactId version3.5.9/version /dependency dependency groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId version2.0.7/version /dependency !-- 数据库驱动MySQL 8 用 com.mysql.cj.jdbc.Driver -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.28/version /dependency !-- 连接池Druid 或 HikariCP 二选一 -- dependency groupIdcom.alibaba/groupId artifactIddruid/artifactId version1.2.8/version /dependency逻辑说明spring-context和spring-webmvc版本必须一致混用会出现NoSuchMethodErrormybatis-spring2.0.x 对应 MyBatis 3.5.x如果mybatis-spring用 1.x 配 MyBatis 3.5运行时会报SqlSessionFactoryBean找不到方法。参数上mysql-connector-java8.0 的驱动类名是com.mysql.cj.jdbc.DriverURL 还要带serverTimezoneAsia/Shanghai否则连接直接抛时区异常。提示依赖下载不下来时先看 IDEA 右侧 Maven 面板用的是不是 Bundled Maven。我一般改成自己装的 3.6.3并在settings.xml里指定本地仓库路径避免和系统默认仓库打架。3. 从零建工程IDEA 2021 里 SSM 目录结构与配置落地3.1 用 Maven 骨架建 Web 工程并补全目录IDEA 2021 新建工程时选 Maven勾上Create from archetype选maven-archetype-webapp。建完你会发现目录是残缺的只有src/main/webapp没有java和resources。这两个目录得手动补而且要在 Project Structure 里标记类型否则编译时 Java 文件根本不被识别。# 在 src/main 下手动创建两个目录 src/main/java # 标记为 Sources Root src/main/resources # 标记为 Resources Root操作路径是 File → Project Structure → Modules → Sources把java标成 Sourcesresources标成 Resources。这一步不做后面applicationContext.xml放在 resources 里也加载不到报FileNotFoundException。目录补完后标准结构应该是java下按controller / service / mapper / entity分包resources下放applicationContext.xml、spring-mvc.xml、mybatis-config.xml、jdbc.properties。3.2 web.xml 与三个 Spring 配置文件的挂载关系SSM 的配置核心是“三个 XML 各管一摊web.xml 负责把它们串起来”。applicationContext.xml管 Service 和 Daospring-mvc.xml管 Controllerweb.xml里用监听器和 Servlet 分别加载。!-- web.xml加载 Spring 根容器 -- context-param param-namecontextConfigLocation/param-name param-valueclasspath:applicationContext.xml/param-value /context-param listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener !-- DispatcherServlet加载 SpringMVC 子容器 -- servlet servlet-namedispatcher/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLocation/param-name param-valueclasspath:spring-mvc.xml/param-value /init-param load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namedispatcher/servlet-name url-pattern//url-pattern /servlet-mapping逻辑说明ContextLoaderListener启动时创建父容器DispatcherServlet创建子容器子容器能拿到父容器的 Bean反过来不行。所以 Controller 里能注入 Service但 Service 里注入 Controller 会失败。url-pattern写/而不是/*/*会拦截 jsp 导致页面 404这是很经典的一个坑。3.3 applicationContext.xml 里数据源与 MyBatis 的整合根容器里最关键的是数据源和SqlSessionFactory的装配。用 Druid 做连接池把jdbc.properties抽出来单独放改数据库时不用动 XML。!-- 读取 jdbc.properties -- context:property-placeholder locationclasspath:jdbc.properties/ !-- Druid 数据源 -- bean iddataSource classcom.alibaba.druid.pool.DruidDataSource property namedriverClassName value${jdbc.driver}/ property nameurl value${jdbc.url}/ property nameusername value${jdbc.username}/ property namepassword value${jdbc.password}/ /bean !-- SqlSessionFactory 交给 Spring 管理 -- bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refdataSource/ property nameconfigLocation valueclasspath:mybatis-config.xml/ property namemapperLocations valueclasspath:mapper/*.xml/ /bean !-- 扫描 Mapper 接口生成代理实现 -- bean classorg.mybatis.spring.mapper.MapperScannerConfigurer property namebasePackage valuecom.demo.mapper/ /bean逻辑说明MapperScannerConfigurer会为com.demo.mapper下的接口生成动态代理所以 Mapper 接口不需要写实现类。mapperLocations指向 XML 映射文件如果接口和 XML 同名同包也可以不配这一项但分开放更清晰。jdbc.properties里 MySQL 8 的 URL 要写成jdbc:mysql://localhost:3306/ssm_demo?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8少一个参数都可能连不上。注意context:property-placeholder只能配一次如果 spring-mvc.xml 里也配了后加载的会覆盖前面的导致数据源读不到值。我一般只在根容器里配。4. 避坑与排查SSM 搭建中最容易翻车的 5 个点4.1 现象启动报 NoClassDefFoundError: javax/servlet/ServletContext原因基本锁定在 Tomcat 版本。Tomcat 10 用的是jakarta.servlet而 Spring 5.x 编译时依赖javax.servlet两者包名对不上。解决方式是换回 Tomcat 9.0 或 8.5在 IDEA 的 Run/Debug Configurations 里重新指定 Tomcat 安装目录别用默认下载的最新版。4.2 现象Mapper 接口注入失败报 NoSuchBeanDefinitionException原因是MapperScannerConfigurer的basePackage写错或者 Mapper 接口没放在指定包下。还有一种情况是applicationContext.xml没被加载检查 web.xml 里contextConfigLocation的路径是不是classpath:开头。我一般会在启动日志里搜MapperScannerConfigurer看它扫描了哪些包。4.3 现象中文乱码页面提交后数据库存的是问号三个地方要同时设web.xml里加CharacterEncodingFilterjdbc.url带characterEncodingutf8数据库建表时字符集用utf8mb4。少一处都可能乱码。过滤器要放在所有 filter 最前面否则顺序不对不生效。filter filter-nameencoding/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter filter-mapping filter-nameencoding/filter-name url-pattern/*/url-pattern /filter-mapping4.4 现象IDEA 里 Tomcat 启动后访问 404但控制台没报错先看 Artifact 有没有配。File → Project Structure → Artifacts确认war exploded存在并且 Output Layout 里WEB-INF/classes下有编译后的 class 和 resources。如果 classes 是空的说明模块没编译Build → Rebuild Project 走一遍。另一个常见原因是url-pattern写成了/*改成/。4.5 现象Maven 依赖全部飘红reimport 也没用先确认 IDEA 用的 Maven 是不是 Bundled。Settings → Build Tools → Maven把 Maven home path 改成自己装的 3.6.3User settings file 指向改好的settings.xml。然后在本地仓库目录执行一次清理把*.lastUpdated文件删掉再 reimport。如果公司网络有限制就在settings.xml里配好镜像地址别用默认中央仓库硬拉。5. 装完怎么验证一套能跑通的 SSM 最小闭环配置写完不代表跑通得用一个最小的增删改查闭环验证。我一般会建一张user表写一个查询接口从 Controller 一路打到数据库能返回数据才算环境真的立住了。先建表CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(32) NOT NULL, age INT DEFAULT 0 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO user (name, age) VALUES (测试用户, 20);然后写 Mapper 接口和 XML// UserMapper.java public interface UserMapper { ListUser selectAll(); }!-- UserMapper.xml -- mapper namespacecom.demo.mapper.UserMapper select idselectAll resultTypecom.demo.entity.User SELECT id, name, age FROM user /select /mapperController 里注入 ServiceService 注入 Mapper最后用浏览器或 Postman 访问/user/list。如果返回 JSON 里能看到测试用户说明 Spring 容器、MyBatis 映射、数据源、MVC 调度四条链路全通了。验证时重点看三处日志启动阶段有没有Root WebApplicationContext initialized说明根容器起来了请求进来有没有DispatcherServlet的映射日志SQL 有没有打印可以在mybatis-config.xml里配logImpl为STDOUT_LOGGING临时打开。settings setting namelogImpl valueSTDOUT_LOGGING/ /settings这个配置只在排查时开上线要关掉否则日志量很大。我自己的习惯是每次搭完 SSM先不写业务就用这张user表跑一遍查询确认四条链路都活着再往里加功能。从那以后我每次新建 SSM 工程都会强制走一遍这个最小闭环省得写到一半才发现是环境问题而不是代码问题。希望帮到你。本文还有配套的精品资源点击获取