当前位置: 首页 > news >正文

ssm框架整合全攻略:从环境搭建到功能实现

SSM 框架(Spring + SpringMVC + MyBatis)是 Java EE 开发中常用的企业级解决方案,三者各司其职:Spring 负责核心的依赖注入和事务管理,SpringMVC 处理 Web 层请求,MyBatis 简化数据库操作。本文将详细介绍如何通过 “XML + 注解” 的方式整合 SSM 框架,从环境搭建到完整功能实现,一步步带你掌握整合精髓。

一、整合环境搭建

1. 整合说明与思路

  • 整合方式:采用 XML 配置文件 + 注解结合的方式,兼顾灵活性和开发效率。
  • 核心思路
    1. 先搭建 Spring 基础环境;
    2. 再整合 SpringMVC,实现 Web 层与业务层的交互;
    3. 最后整合 MyBatis,完成业务层与数据层的对接。

2. 数据库与表结构

首先创建用于测试的数据库和表,以 “账户管理” 为例:

-- 创建数据库
create database ssm;-- 创建账户表
create table account(id int primary key auto_increment,name varchar(20),money double
);

3. Maven 工程配置

创建 Maven Web 工程,在pom.xml中引入所需依赖,包括 Spring、SpringMVC、MyBatis、数据库驱动、日志等:

<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.springframework</groupId><artifactId>spring-context</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-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.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>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version> <!-- 德鲁伊连接池 --></dependency><!-- Web相关 --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</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-log4j12</artifactId><version>${slf4j.version}</version></dependency><!-- 测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
</dependencies><!-- 编译配置 -->
<build><finalName>ssm</finalName><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></configuration></plugin></plugins>
</build>

4. 实体类编写

ssm_domain模块中创建账户实体类Account,封装数据:

package cn.tx.domain;import java.io.Serializable;public class Account implements Serializable {private Integer id; // 主键private String name; // 账户名称private Double money; // 金额// Getter、Setter与toString方法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 +'}';}
}

二、Spring 框架基础配置

Spring 是整合的核心,负责管理 Service、Dao 等对象的依赖注入。

1. Spring 配置文件(applicationContext.xml)

创建applicationContext.xml,开启 Service 层的注解扫描:

<?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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 扫描Service层注解(@Service) --><context:component-scan base-package="cn.tx.service"></context:component-scan>
</beans>

2. 编写 Service 层并测试

  • Service 接口:定义核心业务方法

    package cn.tx.service;
    import cn.tx.domain.Account;
    import java.util.List;public interface AccountService {List<Account> findAll(); // 查询所有账户void save(Account account); // 新增账户
    }
    
  • Service 实现类:使用@Service注解交由 Spring 管理

    package cn.tx.service.Impl;
    import cn.tx.domain.Account;
    import cn.tx.mapper.AccountMapper;
    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 {@Autowired // 后续会注入Mapperprivate AccountMapper accountMapper;@Overridepublic List<Account> findAll() {System.out.println("业务层:查询所有账户");return accountMapper.findAll();}@Overridepublic void save(Account account) {accountMapper.save(account);}
    }
    
  • 测试 Spring 环境:通过 Junit 测试 Spring 是否能正常加载 Service

    package cn.tx.test;
    import cn.tx.service.AccountService;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestSpring {@Testpublic void testSpring() {// 加载Spring配置文件ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取Service对象AccountService service = ac.getBean(AccountService.class);// 调用方法(此时Mapper未注入,仅测试Spring加载)service.findAll(); }
    }
    

三、Spring 整合 SpringMVC

目标:实现 Web 层(Controller)对业务层(Service)的调用,即 Controller 中能注入 Service 对象。

1. SpringMVC 配置

(1)配置前端控制器(web.xml)

web.xml中配置DispatcherServlet,指定 SpringMVC 配置文件:

<!-- 前端控制器 -->
<servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 加载SpringMVC配置文件 --><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> <!-- 拦截.do结尾的请求 -->
</servlet-mapping><!-- 解决中文乱码的过滤器 -->
<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>
(2)SpringMVC 核心配置(springmvc.xml)

创建springmvc.xml,配置注解扫描(Controller)、视图解析器等:

<?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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 扫描Controller层注解 --><context:component-scan base-package="cn.tx.controller"></context:component-scan><!-- 视图解析器:指定JSP路径前缀和后缀 --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/pages/" /> <!-- JSP存放路径 --><property name="suffix" value=".jsp" /> <!-- 后缀 --></bean><!-- 开启SpringMVC注解支持(如@RequestMapping) --><mvc:annotation-driven />
</beans>

2. 测试 SpringMVC 单独工作

(1)编写 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 {@Autowired // 注入Service(整合核心)private AccountService accountService;// 查询所有账户@RequestMapping("/findAll.do")public ModelAndView findAll() {System.out.println("表现层:查询所有账户");List<Account> list = accountService.findAll();ModelAndView mv = new ModelAndView();mv.setViewName("suc"); // 跳转至成功页面return mv;}// 新增账户@RequestMapping("/save.do")public String save(Account account) {accountService.save(account);return "suc"; // 跳转至成功页面}
}
(2)编写页面
  • 首页(index.jsp):提供查询和新增入口

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <body><h3>账户管理</h3><a href="/account/findAll.do">查询所有账户</a><form action="/account/save.do" method="post"><h3>新增账户</h3>姓名:<input type="text" name="name"><br>金额:<input type="text" name="money"><br><input type="submit" value="保存"></form>
    </body>
    </html>
    
  • 成功页(pages/suc.jsp):操作成功后跳转

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <body><h1>操作成功!</h1>
    </body>
    </html>
    

3. 整合核心:让 Spring 与 SpringMVC 共享容器

SpringMVC 的容器是 Spring 容器的子容器,需确保 Spring 容器在项目启动时加载,才能让 Controller 注入 Service。

web.xml中配置 Spring 监听器,指定 Spring 配置文件路径:

原理:监听器在项目启动时加载applicationContext.xml,初始化 Spring 容器;SpringMVC 容器启动时会作为子容器,可访问父容器(Spring)中的 Bean(如 Service),因此 Controller 能注入 Service。

四、Spring 整合 MyBatis

目标:让 Spring 管理 MyBatis 的核心对象(如SqlSessionMapper),实现 Service 对 Mapper 的调用。

1. MyBatis 配置(整合前准备)

(1)编写 Mapper 接口与映射文件
  • Mapper 接口AccountMapper(数据访问层)

    package cn.tx.mapper;
    import cn.tx.domain.Account;
    import org.apache.ibatis.annotations.Insert;
    import org.springframework.stereotype.Repository;
    import java.util.List;@Repository // 标识为数据访问层组件
    public interface AccountMapper {List<Account> findAll(); // 查询所有@Insert("insert into account (name, money) values (#{name}, #{money})")void save(Account account); // 新增(注解方式,也可XML配置)
    }
    
  • XML 映射文件(AccountMapper.xml):放在classpath:mapper/目录下

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.tx.mapper.AccountMapper"> <!-- 对应Mapper接口全类名 --><!-- 查询所有账户 --><select id="findAll" resultType="cn.tx.domain.Account">select * from account</select>
    </mapper>
    

2. 整合到 Spring(核心配置)

修改applicationContext.xml,添加数据源、MyBatis 整合配置和事务管理:

<?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:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 扫描所有组件(Service、Mapper等) --><context:component-scan base-package="cn.tx"/><!-- 1. 配置德鲁伊连接池 --><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/ssm?useSSL=false&serverTimezone=UTC" /><property name="username" value="root" /><property name="password" value="root" /></bean><!-- 2. 配置SqlSessionFactory(MyBatis核心) --><bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /> <!-- 关联数据源 --><property name="mapperLocations" value="classpath:mapper/*.xml" /> <!-- 加载Mapper映射文件 --><property name="typeAliasesPackage" value="cn.tx.domain" /> <!-- 实体类别名包(简化映射文件) --></bean><!-- 3. 扫描Mapper接口,生成代理对象(交由Spring管理) --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactoryBeanName" value="sessionFactory" /> <!-- 关联SqlSessionFactory --><property name="basePackage" value="cn.tx.mapper" /> <!-- Mapper接口所在包 --></bean><!-- 4. 事务管理 --><!-- 平台事务管理器 --><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="*" propagation="REQUIRED" /> <!-- 其他方法需要事务 --></tx:attributes></tx:advice><!-- AOP织入事务 --><aop:config><aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.tx.service.*Impl.*(..))" /></aop:config>
</beans>

2. 整合测试

部署项目到 Tomcat,访问http://localhost:8080/ssm/index.jsp

  • 点击 “查询所有账户”:Controller 调用 Service,Service 调用 Mapper,最终从数据库查询数据并跳转至成功页;
  • 填写表单提交:数据通过 Controller→Service→Mapper 保存到数据库,完成新增功能。

 

 

五、总结

SSM 整合的核心是职责分离与依赖注入

  • Spring:管理所有 Bean(Service、Mapper、事务),通过依赖注入解耦;
  • SpringMVC:处理 Web 请求,通过 Spring 容器获取 Service;
  • MyBatis:简化数据库操作,通过 Spring 管理核心对象,无需手动创建SqlSession

本文通过 “环境搭建→Spring→SpringMVC 整合→MyBatis 整合” 的步骤,实现了完整的账户查询与新增功能。关键配置包括各框架的 XML 文件、依赖管理和包扫描,开发者可根据实际需求扩展更多功能(如分页、复杂查询等)。

你的实现代码在细节上做了优化(如使用sqlSessionFactoryBeanName避免配置顺序问题、调整包结构),更符合实际开发规范,值得参考!

http://www.dtcms.com/a/274073.html

相关文章:

  • 什么是Podman?能否替代Docker?Podman快速入门
  • dockerfile 笔记
  • STM32-DAC数模转换
  • 将英语转化为语音 英文转音频 英语转语音朗读
  • 嵌入式八股文之 GPIO
  • RISC-V:开源芯浪潮下的技术突围与职业新赛道 (三)RISC-V架构深度解剖(下)
  • FPGA实现SDI转LVDS视频发送,基于GTX+OSERDES2原语架构,提供2套工程源码和技术支持
  • Spring注解IoC与JUnit整合实战
  • MyBatis-Plus通用中等、大量数据分批查询和处理
  • 蔚来测开一面:HashMap从1.7开始到1.8的过程,既然都解决不了并发安全问题,为什么还要进一步解决环形链表的问题?
  • XPath 语法【Web 自动化-定位方法】
  • [java][springboot]@PostConstruct的介绍和用法
  • 机器学习基础知识【 激活函数、损失函数、优化器、 正则化、调度器、指标函数】
  • AI加持的开源知识库新秀:PandaWiki,如何用它打造智能化文档系统?
  • 「日拱一码」024 机器学习——防止过拟合
  • 【yolo】模型训练参数解读
  • 哪个ai写论文比较好?实测推荐这6大AI论文写作神器
  • CCF-GESP 等级考试 2025年6月认证C++五级真题解析
  • 2025年值得推荐的5款 AI赋能企业级项目管理软件工具大盘点!
  • Linux:多线程---同步生产者消费者模型
  • 【尝试】基于YoloV8做安全帽识别
  • 12. 说一下 https 的加密过程
  • 2025 年第十五届 APMCM 亚太地区大学生数学建模竞赛-B题 疾病的预测与大数据分析
  • CCN-508 规范
  • Web 网站性能优化之 Nginx 优化指南
  • 提示工程:突破Transformer极限的计算科学
  • S7-1200 系列 PLC 中 SCL 语言的 PEEK 和 POKE 指令使用详解
  • IDE 关联 Git 操作
  • Java使用OSHI获取服务器信息
  • 如何在报表开发工具FastReport .NET 中构建和连接 Firebird 插件?