SSM 框架整合教程:从环境搭建到 CRUD 实现
前言
SSM 框架(Spring + SpringMVC + MyBatis)是企业级 Java 开发中非常流行的技术栈组合。Spring 负责依赖注入和事务管理,SpringMVC 处理 web 层请求,MyBatis 作为 ORM 框架操作数据库。本文将详细介绍 SSM 框架的整合过程,采用 XML + 注解的方式,从环境搭建到实现基本的 CRUD 操作,适合初学者入门学习。
第一章:搭建整合环境
1.1 整合思路
SSM 整合需要遵循一定的步骤,我们采用以下思路:
- 先搭建基础环境和 Spring 配置
- 整合 SpringMVC 框架
- 整合 MyBatis 框架
- 实现基本业务功能
1.2 创建数据库和表结构
首先创建所需的数据库和表:
create database ssm;use ssm;create table account(id int primary key auto_increment,name varchar(20),money double
);
1.3 创建 Maven 工程
创建一个 Maven Web 工程,命名为ssm
,并在pom.xml
中添加以下依赖:
<properties><spring.version>5.0.2.RELEASE</spring.version><slf4j.version>1.6.6</slf4j.version><log4j.version>1.2.12</log4j.version><mysql.version>5.1.6</mysql.version><mybatis.version>3.4.5</mybatis.version>
</properties><dependencies><!-- Spring相关依赖 --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.6.8</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><!-- 单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!-- Servlet和JSP --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- 日志 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><!-- MyBatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version></dependency><!-- 连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency>
</dependencies><build><finalName>ssm</finalName><pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding><showWarnings>true</showWarnings></configuration></plugin></plugins></pluginManagement>
</build>
第二章:实体类与基础架构
2.1 编写实体类
创建cn.tx.domain
包,编写 Account 实体类:
package cn.tx.domain;import java.io.Serializable;/*** 账户实体类*/
public class Account implements Serializable{// 主键private Integer id;// 账户名称private String name;// 账号的金额private Double money;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getMoney() {return money;}public void setMoney(Double money) {this.money = money;}@Overridepublic String toString() {return "Account{" +"id=" + id +", name='" + name + '\'' +", money=" + money +'}';}
}
2.2 编写 Service 接口和实现类
创建cn.tx.service
包,编写 AccountService 接口:
package cn.tx.service;import cn.tx.domain.Account;
import java.util.List;/*** 账户服务接口*/
public interface AccountService {// 查询所有public List<Account> findAll();// 保存账户public void save(Account account);
}
创建cn.tx.service.impl
包,编写 AccountServiceImpl 实现类:
package cn.tx.service.impl;import cn.tx.dao.AccountDao;
import cn.tx.domain.Account;
import cn.tx.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;/*** 账户服务实现类*/
@Service
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;@Overridepublic List<Account> findAll() {System.out.println("业务层:查询所有的账号...");return accountDao.findAll();}/*** 保存账户* @param account*/@Overridepublic void save(Account account) {accountDao.save(account);}
}
第三章:Spring 框架配置
3.1 搭建 Spring 开发环境
在src/main/resources
目录下创建applicationContext.xml
配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 开启注解扫描,扫描service包 --><context:component-scan base-package="cn.tx.service" /><!-- 配置druid连接池 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql:///ssm" /><property name="username" value="root" /><property name="password" value="root" /></bean><!-- Spring整合MyBatis --><bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" ><!-- 注入连接池对象 --><property name="dataSource" ref="dataSource" /><!-- 加载映射配置文件 --><property name="mapperLocations" value="classpath:mappers/*.xml" /></bean><!-- 把dao对象存入到IOC容器中 --><bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactory" ref="sessionFactory" /><!-- 扫描dao所在的包 --><property name="basePackage" value="cn.tx.dao" /></bean><!-- 配置声明式事务管理 --><!-- 平台事务管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><!-- 配置事务的通知 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="find*" read-only="true"/><tx:method name="*" /></tx:attributes></tx:advice><!-- 配置事务的增强 --><aop:config><aop:advisor advice-ref="txAdvice" pointcut="execution(public * cn.tx.service.impl.*ServiceImpl.*(..))" /></aop:config>
</beans>
3.2 测试 Spring 环境
创建测试类,验证 Spring 环境是否搭建成功:
package cn.tx.test;import cn.tx.service.AccountService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** Spring测试类*/
public class TestSpring {/*** 测试Spring框架的环境*/@Testpublic void run1(){// 创建工厂,加载配置文件ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");// 获取service对象,调用方法AccountService service = ac.getBean(AccountService.class);service.findAll();}
}
第四章:SpringMVC 框架配置与整合
4.1 配置 web.xml
在webapp/WEB-INF
目录下配置web.xml
:
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><!-- 配置Spring的监听器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 配置加载类路径的配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- 配置前端控制器 --><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 加载springmvc.xml配置文件 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!-- 启动加载 --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping><!-- 解决post请求中文乱码的过滤器 --><filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
</web-app>
4.2 创建 SpringMVC 配置文件
在src/main/resources
目录下创建springmvc.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 扫描controller的注解 --><context:component-scan base-package="cn.tx.controller"></context:component-scan><!-- 配置视图解析器 --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- JSP文件所在的目录 --><property name="prefix" value="/pages/" /><!-- 文件的后缀名 --><property name="suffix" value=".jsp" /></bean><!-- 开启对SpringMVC注解的支持 --><mvc:annotation-driven />
</beans>
4.3 编写 Controller
创建cn.tx.controller
包,编写 AccountController:
package cn.tx.controller;import cn.tx.domain.Account;
import cn.tx.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;/*** 账户控制器*/
@Controller
@RequestMapping("/account")
public class AccountController {// 注入Service@Autowiredprivate AccountService accountService;/*** 查询所有* @return*/@RequestMapping("/findAll.do")public ModelAndView findAll(){System.out.println("表现层:查询所有的账号...");// 调用service对象的方法List<Account> list = accountService.findAll();for (Account account : list) {System.out.println(account);}ModelAndView mv = new ModelAndView();mv.addObject("accountList", list);mv.setViewName("suc");return mv;}/*** 保存* @return*/@RequestMapping("/save.do")public String save(Account account){// 调用service,保存数据accountService.save(account);return "redirect:findAll.do"; // 重定向到查询所有方法,避免表单重复提交}
}
第五章:MyBatis 框架配置与整合
5.1 编写 Dao 接口
创建cn.tx.dao
包,编写 AccountDao 接口:
package cn.tx.dao;import cn.tx.domain.Account;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import java.util.List;/*** 账户数据访问接口*/
public interface AccountDao {@Select(value = "select * from account")public List<Account> findAll();@Insert("insert into account (name,money) values (#{name},#{money})")void save(Account account);
}
5.2 编写 MyBatis 配置文件(可选)
在src/main/resources
目录下创建SqlMapConfig.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 可以配置MyBatis的全局属性 --><!-- 例如别名设置、插件等 -->
</configuration>
第六章:编写 JSP 页面
6.1 创建首页
在webapp
目录下创建index.jsp
:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>SSM整合示例</title>
</head>
<body><h3>账号列表页面</h3><a href="/account/findAll.do">查询所有</a><h3>添加账户</h3><form action="/account/save.do" method="post">姓名:<input type="text" name="name" /><br/>金额:<input type="text" name="money" /><br/><input type="submit" value="保存" /></form>
</body>
</html>
6.2 创建成功页面
在webapp/pages
目录下创建suc.jsp
:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head><title>账户列表</title><style>table {border-collapse: collapse;width: 60%;margin: 20px auto;}th, td {border: 1px solid #ddd;padding: 8px;text-align: left;}th {background-color: #f2f2f2;}tr:nth-child(even) {background-color: #f2f2f2;}.container {text-align: center;margin-top: 20px;}</style>
</head>
<body>
<div class="container"><h3>账户列表</h3><table><tr><th>ID</th><th>姓名</th><th>金额</th></tr><c:forEach items="${accountList}" var="account"><tr><td>${account.id}</td><td>${account.name}</td><td>${account.money}</td></tr></c:forEach></table><a href="/index.jsp">返回首页</a>
</div>
</body>
</html>
第七章:部署与测试
7.1 部署项目
- 将项目添加到 Tomcat 服务器
- 启动 Tomcat 服务器
- 在浏览器中访问
http://localhost:8080/ssm
7.2 功能测试
- 测试查询功能:点击 "查询所有" 链接,应该能看到数据库中的所有账户信息(如果有的话)
- 测试添加功能:在表单中输入姓名和金额,点击 "保存" 按钮,应该能看到新添加的账户信息
总结
通过本文的步骤,我们完成了 SSM 框架的整合,并实现了基本的查询和保存功能。主要关键点包括:
- 正确配置 Maven 依赖,确保各框架版本兼容
- 配置 Spring 的核心配置文件,实现依赖注入和事务管理
- 配置 SpringMVC,实现请求处理和视图解析
- 整合 MyBatis,实现数据访问层功能
- 通过注解实现各层之间的依赖注入
在实际开发中,还可以根据需要添加更多功能,如分页、条件查询、删除、更新等操作。同时,也可以考虑使用 Spring Boot 来简化 SSM 框架的配置,提高开发效率。
常见问题及解决方法
- 数据库连接问题:检查数据库驱动版本、连接 URL、用户名和密码是否正确
- 依赖冲突:使用
mvn dependency:tree
命令查看依赖树,解决版本冲突 - 注解扫描问题:确保 Spring 和 SpringMVC 的注解扫描包配置正确,避免重复扫描或漏扫
- 事务不生效:检查事务配置是否正确,特别是 AOP 切入点表达式是否匹配 Service 实现类
- 中文乱码:确保 web.xml 中配置了 CharacterEncodingFilter 过滤器