前言
学习完 Spring + SpringMVC + Mybatis 三个架构,弄个基本项目来把这三个东西整合在一起。
准备工作
导入依赖
需要导入 Mybatis、Spring、SpringMVC 以及 数据库等包,具体如下
1 |
|
在配置一个东西,Maven 的资源过滤,防止 Maven 不导出一些资源文件
1 | <!-- 在bulid中的resources中添加一个新的resouce,如果没有父标签就创建 --> |
创建数据库
导入完依赖以后,创建一个数据用,用于等等做测试,数据库的创建 SQL 如下
1 | # 创建表 |
创建对应的目录结构
到这里,准备工作就已经差不多了,接下来分别配置 SSM 的东西
先在资源目录下创建一个总的配置文件,用来整合其他的配置文件
MyBatis 配置
编写 MyBatis 配置文件,本来需要配置数据库,但是整合以后,这个过程交给 Spring 注入完成。
在配置文件中配置类别名。
根据创建的数据库编写 POJO 对象
1 | package com.jeislu.pojo; |
然后根据需求编写 DAO 接口和对应的配置文件
1 | package com.jeislu.dao; |
1 |
|
编写业务层接口
1 | package com.jeislu.service; |
业务层接口实现类
1 | package com.jeislu.service; |
Spring 配置
由于我们将 Mybatis 配置数据库的工作交给了 Spring 实现,所以先创建一个配置文件 spring-dao-config.xml ,用于配置 DAO 层的功能。
首先,创建一个数据库配置文件 database.properties ,用于存储数据库的配置
1 | = com.mysql.jdbc.Driver |
然后在 spring-dao-config.xml 中导入该配置文件
1 | <!-- 关联数据库配置文件 --> |
接着配置连接池(这里使用了 c3p0):
1 | <!-- 连接池 --> |
接着配置 SqlSessionFactory ,需要传入一个数据库配置(连接池也行)
1 | <!-- 配置 SqlSessionFactory --> |
我们之前整合 Spring 和 MyBatis 的时候,是使用创建一个实现类先手动实现 Mapper,以后不需要了,在配置文件中开启自动配置即可,Spring 帮我们完成
1 | <!-- 配置 Mapper 实现类自动完成 --> |
配置事务(未具体实现功能)
1 | <!-- 创建事务管理器 --> |
再创建一个配置文件 spring-service-config.xml 用于配置 Service 层的东西。
Service 层目前只需要开启扫描注册的功能即可(未使用 @Service 所以未生效),以及注册一个 bean。
1 |
|
SpringMVC 配置
从下面到这里,还没有将项目设置为 Web 项目,先设置成为 web 项目,然后在 web.xml 中配置 SpringMVC 的核心——DispatchServlet 。
1 | <!-- 配置DispatchServlet --> |
配置过滤器,防止乱码
1 | <!-- 过滤器,防止乱码 --> |
配置 Session 存活时间
1 | <!-- 配置 Session 存活时间 --> |
然后设置 SpringMVC 的配置文件 spring-mvc-config.xml。
首先,配置注解驱动,静态资源过滤,包扫描
1 | <!-- 注解驱动 --> |
配置视图解析器
1 | <!-- 视图解析器 --> |
添加业务
上面已经把三个框架整合完毕,接下来添加具体业务。
但是先说说上面的两个错误,第一个错误在 web.xml 这里面 DispatchServlet 配置的文件是 SpringMVC 的文件,里面没有其他 Spring 配置文件的 bean,所以修改为总的配置文件 applicationContext.xml 。
第二个问题就是 web 工程不将依赖一起导出,会直接 404 ,在项目结构里面的 Artifacts 里面新建 lib ,并添加依赖。
好了解决完这两个问题,就可以正式的写业务了。
先创建一个 Controller ,负责查询书籍并返回数据
1 |
|
然后编写首页,使其跳转到 BookController 执行查询书籍并返回数据
1 | <%-- |
然后在 WEB-INF/ jsp 下新建一个 allBook.jsp (和 Controller 返回的视图名对应),编写展示数据页面(前端不太熟,这个完全是抄的)
1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
这样,一个查询业务就做好了,可以通过启动项目查看效果

再添加一个增加书籍业务
首先在显示所有书籍页面添加一个跳转链接,跳转到增加书籍的按钮,在 Controller 中编写对应方法
1 | <div class="row"> |
1 | // 跳转到添加书籍页面 |
然后编写添加书籍页面
1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
在 Controller 中添加一个方法,用于处理表单的提交
1 | // 增加业务 |
然后就完成了!不过当你点击提交按钮的时候,就会出现 500 错误,这是因为 Mybatis 里面的有一些问题。
在设计新增和更新书籍的时候,我接受的参数是 Map,我以为他会根据表单里面 input 的 name 给我添加对应的键值对,可惜不行,如果不行的话,那肯定会出问题。
解决方法就是,将 Map 全部换成 Book,Spring 会根据 input 中的名称以及 Book 类的属性名注入值。
在替换掉 Map 以后,一切就正常了。

接下来增加查询和删除业务
先扩展原有的,来所有书籍页面添加修改和删除按键
1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
然后新建一个修改页面
1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
注意添加隐藏域,不然取不到 bookID 无法更新。
在 BookController 中添加两个方法,分别是跳转到更新书籍页面和更新操作
1 | // 跳转到修改页面 |
这样就好了,接下来是删除方法,首页已经修改过了,直接在 BookController 下面添加一个删除方法即可
1 | // 删除书籍 |
增删改查功能全部完成。
新增一个根据书名查询功能,由于是横向扩展功能,写的东西有点多。
首先修改 BookMapper,新增一个方法,然后编写该方法的 SQL 语句,然后修改 Service 层和 Service 实现类,同样新增该方法。编写首页,新增搜索栏和搜索按钮,使用 Controller 完成查询操作并返回数据给展示页面。
由于改动的地方有点多,一点一点贴代码也不太好,最后把项目所有的文件代码贴上来。
项目所有文件
pom.xml
1 |
|
web.xml
1 |
|
addBook.jsp
1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
allBook.jsp
1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
updateBook.jsp
1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
BookController.java
1 | package com.jeislu.controller; |
BookMapper.java
1 | package com.jeislu.dao; |
BookMapper.xml
1 |
|
book.java
1 | package com.jeislu.pojo; |
BookService.java
1 | package com.jeislu.service; |
BookServiceImpl.java
1 | package com.jeislu.service; |
问题
1. 404
报错如下,经典问题,没有在 Artifacts 里面添加 lib 依赖。
1 | [2021-03-13 11:43:27,023] Artifact SSM:war exploded: Artifact is being deployed, please wait... |
2. 500
点击跳转的时候,发现报500
1 | org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bookController': Unsatisfied dependency expressed through field 'bookService'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.jeislu.service.BookService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=BookServiceImpl)} |
因为我们在配置 DispatchServlet 的时候,配置是这样子的
1 | <!-- 配置DispatchServlet --> |
<param-value>classpath:spring-mvc-config.xml</param-value>,SpringMVC 里面当然没有 Service 层的 bean 啊
修改此配置为
1 | <param-value>classpath:applicationContext.xml</param-value> |