搭一个SSM项目,目实最耗时间的战完整教不是写业务代码,是目实配环境。我见过太多人卡在第一步——Maven依赖下载不下来,战完整教或者Spring和MyBatis的目实版本对不上,光这两个问题就能耗掉一整个下午。战完整教所以这篇教程不讲虚的目实,直接从建表开始,战完整教把每个环节的目实坑标出来。
用一个图书管理系统当案例。战完整教功能很简单:查书、目实加书、战完整教改书、目实删书。战完整教数据库两张表就够——book表存书籍信息,目实user表做登录校验。别小看这个体量,SSM该有的东西一样不少:Controller收请求,Service处理逻辑,Mapper操作数据库,Spring管对象,SpringMVC管路由,MyBatis管SQL。
IDEA里新建Maven Web项目,pom.xml是关键。Spring用5.3.x,MyBatis用3.5.x,mybatis-spring用2.0.x。这三个版本搭配比较稳,别追最新版,容易踩兼容性问题。数据库连接池用Druid,日志用Log4j2。JSON处理加Jackson。
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.30</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.7</version> </dependency> 打包方式设成war,不然Tomcat跑不起来。
SSM有三套配置要整合:web.xml、spring.xml(或者叫applicationContext.xml)、springmvc.xml。很多人搞混它们的分工,这里说清楚。
web.xml干两件事:注册ContextLoaderListener加载Spring容器,注册DispatcherServlet加载SpringMVC容器。两个容器是父子关系,Spring管Service和Mapper,SpringMVC管Controller。
spring.xml里配数据源、SqlSessionFactory、Mapper扫描、事务管理。数据源那块,Druid的配置直接贴:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/library?useSSL=false&serverTimezone=Asia/Shanghai"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean> springmvc.xml里开注解驱动、配视图解析器、扫描Controller包。视图解析器前缀写/WEB-INF/jsp/,后缀写.jsp。
实体类字段和数据库列名对不上是高频错误。比如数据库里是book_name,实体类里是bookName,要么在SQL里用别名,要么开mapUnderscoreToCamelCase。我习惯在mybatis-config.xml里直接开这个设置,省事。
Mapper接口和XML文件的路径必须严格对应。接口在com.xxx.mapper包下,XML就放在resources/com/xxx/mapper目录下。名字一模一样,差一个字母都报BindingException。
Controller用@Controller和@RequestMapping。返回JSON就加@ResponseBody,返回页面就返回字符串视图名。分页查询用PageHelper插件,在Service层调PageHelper.startPage(pageNum, pageSize),紧跟着的那条查询自动分页。
JSP页面用JSTL遍历数据。表单提交用POST,删除用GET或者DELETE都行,但要在web.xml里配HiddenHttpMethodFilter才能把POST转成DELETE。
事务不生效——检查@Transactional加在public方法上,且Spring配置里开了<tx:annotation-driven/>。中文乱码——在web.xml里加CharacterEncodingFilter,forceEncoding设true。静态资源404——springmvc.xml里加<mvc:default-servlet-handler/>。
最后说一句:SSM整合的核心就一句话——让Spring把MyBatis的Mapper接口变成可以注入的Bean,让SpringMVC的Controller能调到Service。把这条线捋顺了,剩下的都是查文档能解决的问题。