Spring + Spring MVC + MyBatis

SSM 是 Spring + Spring MVC + MyBatis 的缩写,是 Java 企业级开发中经典的三层架构组合框架,广泛用于开发中小型企业级应用。三者分工明确、协同工作,形成了 "业务层 + 表现层 + 数据访问层" 的完整解决方案。

一、SSM 各组件的角色与核心功能

1. Spring(业务层框架)
  • 核心定位:负责全局的对象管理(IOC)和切面编程(AOP),是 SSM 的 "胶水",整合其他框架。
  • 核心功能
    • IOC(控制反转):通过容器统一管理对象的创建、依赖注入和生命周期,降低类之间的耦合。
    • AOP(面向切面编程):将日志、事务、权限等横切逻辑抽离为切面,与业务逻辑解耦。
    • 事务管理 :通过声明式事务(@Transactional)简化事务控制,保证数据一致性。
  • 核心组件
    • ApplicationContext:IOC 容器的核心实现。
    • @Component@Service@Autowired:用于对象注册和依赖注入。
    • @Aspect@Transactional:用于 AOP 和事务管理。
2. Spring MVC(表现层框架)
  • 核心定位:处理 Web 请求,负责前端与后端的交互,是 MVC 设计模式的实现。
  • MVC 角色分工
    • Model(模型) :封装业务数据(如 UserOrder 实体类)。
    • View(视图):展示数据(如 JSP、Thymeleaf 页面)。
    • Controller(控制器) :接收请求、调用业务逻辑、返回结果(如 @Controller 标注的类)。
  • 核心功能
    • 请求映射 :通过 @RequestMapping 等注解将 URL 与控制器方法绑定。
    • 参数绑定 :自动将请求参数转换为 Java 对象(如表单数据 → User 对象)。
    • 视图解析 :将控制器返回的逻辑视图名解析为实际视图(如 indexWEB-INF/index.jsp)。
    • 拦截器:对请求进行前置 / 后置处理(如登录验证、日志记录)。
  • 核心组件
    • DispatcherServlet:前端控制器,统一处理所有请求,分发到对应控制器。
    • @Controller@RequestMapping@RequestParam:用于请求处理。
    • ViewResolver:视图解析器,负责视图定位。
3. MyBatis(数据访问层框架)
  • 核心定位:简化数据库操作,实现 Java 对象与数据库表的映射(ORM),替代传统 JDBC。
  • 核心功能
    • SQL 映射:通过 XML 或注解定义 SQL 语句,将查询结果映射为 Java 对象。
    • 参数映射 :自动将 Java 对象的属性映射为 SQL 参数(支持 #{} 占位符,防止 SQL 注入)。
    • 事务支持:与 Spring 的事务管理整合,保证数据操作的原子性。
  • 核心组件
    • SqlSessionFactory:创建 SqlSession 的工厂(依赖数据源配置)。
    • SqlSession:执行 SQL 的核心接口(提供 selectOneinsert 等方法)。
    • Mapper 接口:定义数据操作方法,与 XML 映射文件关联(无需实现类,MyBatis 动态代理生成)。
    • 映射文件(如 UserMapper.xml):存放 SQL 语句,定义参数和结果映射规则。

二、SSM 工作流程(请求处理全链路)

  1. 用户发起请求 :浏览器发送 HTTP 请求(如 http://localhost:8080/user/1)。
  2. Spring MVC 接收请求
    • 请求被 DispatcherServlet 拦截,根据 URL 匹配 @RequestMapping 找到对应的 Controller 方法(如 UserController.getUser(1))。
  3. 调用业务逻辑
    • Controller 方法通过 @Autowired 注入 Service 层对象(如 UserService),调用其业务方法(如 userService.findById(1))。
    • Service 层可能包含事务注解(@Transactional),Spring 自动管理事务。
  4. 数据访问操作
    • Service 调用 Mapper 接口(如 UserMapper.selectById(1)),MyBatis 通过 SqlSession 执行映射文件中的 SQL(如 select * from user where id = ?)。
    • 数据库返回结果,MyBatis 将结果集映射为 User 对象,返回给 Service
  5. 处理结果返回
    • ServiceUser 对象返回给 Controller
    • Controller 将数据放入模型(Model),返回视图名(如 userInfo)。
  6. 渲染视图
    • ViewResolver 将视图名解析为实际视图(如 WEB-INF/views/userInfo.jsp),渲染页面并返回给浏览器。

三、SSM 整合核心配置

SSM 整合需通过配置文件协调三者的工作(以 XML 配置为例,也可使用注解配置):

1. Spring 配置(applicationContext.xml
复制代码
<!-- 扫描 Service 层组件 -->
<context:component-scan base-package="com.example.service"/>

<!-- 数据源配置(连接池) -->
<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/test"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</bean>

<!-- MyBatis 的 SqlSessionFactory 整合 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="classpath:mapper/*.xml"/> <!-- 映射文件路径 -->
    <property name="typeAliasesPackage" value="com.example.pojo"/> <!-- 实体类包 -->
</bean>

<!-- 扫描 Mapper 接口,生成代理对象 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper"/>
</bean>

<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<!-- 开启声明式事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
2. Spring MVC 配置(spring-mvc.xml
复制代码
<!-- 扫描 Controller 层组件 -->
<context:component-scan base-package="com.example.controller"/>

<!-- 开启 MVC 注解驱动(支持 @RequestMapping 等) -->
<mvc:annotation-driven/>

<!-- 视图解析器(JSP 为例) -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/> <!-- 视图前缀 -->
    <property name="suffix" value=".jsp"/> <!-- 视图后缀 -->
</bean>

<!-- 静态资源放行(如 CSS、JS、图片) -->
<mvc:default-servlet-handler/>
3. Web 配置(web.xml
复制代码
<!-- Spring 容器初始化 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- Spring MVC 前端控制器 -->
<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup> <!-- 启动时加载 -->
</servlet>
<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern> <!-- 拦截所有请求 -->
</servlet-mapping>

四、SSM 代码示例(核心层)

1. 实体类(Model)
复制代码
public class User {
    private Integer id;
    private String name;
    private Integer age;
    // getters and setters
}
2. Mapper 接口(数据访问层)
复制代码
public interface UserMapper {
    // 方法名与映射文件中的 SQL id 对应
    User selectById(Integer id);
}
3. MyBatis 映射文件(UserMapper.xml
复制代码
<mapper namespace="com.example.mapper.UserMapper">
    <!-- 查询用户 -->
    <select id="selectById" parameterType="int" resultType="User">
        select id, name, age from user where id = #{id}
    </select>
</mapper>
4. Service 层(业务逻辑)
复制代码
@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    @Transactional // 声明事务
    public User findById(Integer id) {
        return userMapper.selectById(id);
    }
}
5. Controller 层(请求处理)
复制代码
@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/{id}")
    public String getUser(@PathVariable Integer id, Model model) {
        User user = userService.findById(id);
        model.addAttribute("user", user); // 存入模型
        return "userInfo"; // 返回视图名(对应 WEB-INF/views/userInfo.jsp)
    }
}

五、SSM 的优缺点

优点
  1. 分工明确:Spring 管业务,Spring MVC 管 Web,MyBatis 管数据库,架构清晰。
  2. 灵活性高:MyBatis 允许手写 SQL,适合复杂查询场景;Spring 的 IOC/AOP 降低耦合。
  3. 成熟稳定:三者均是经过长期验证的框架,社区活跃,资料丰富。
缺点
  1. 配置繁琐:需要编写大量 XML 配置(可通过注解优化,但仍比 Spring Boot 复杂)。
  2. 开发效率:相比 Spring Boot 的 "开箱即用",SSM 整合和配置耗时较长。
  3. 学习成本:需掌握三个框架的细节,对新手不够友好。

六、SSM 与 Spring Boot 的关系

  • Spring Boot 是 SSM 的简化:Spring Boot 整合了 SSM 的核心功能,并通过 "自动配置" 消除了繁琐的 XML 配置,内置服务器,简化了开发和部署。
  • 替代与兼容:新项目更推荐 Spring Boot,但 SSM 的核心思想(IOC、AOP、MVC)在 Spring Boot 中完全继承,掌握 SSM 后容易迁移到 Spring Boot。

总结

SSM 是 Java 企业级开发的经典组合,通过 Spring 的对象管理、Spring MVC 的 Web 交互和 MyBatis 的数据库操作,形成了完整的三层架构解决方案。尽管配置相对繁琐,但其灵活性和稳定性使其在中小型项目中仍被广泛使用。对于新手,学习 SSM 有助于理解 Java 后端开发的核心思想,为后续学习 Spring Boot、微服务等技术打下基础。

相关推荐
Halo_tjn1 天前
Java 相关资料
java·开发语言·计算机
Slow菜鸟1 天前
Java开发规范(十一)| 数据全生命周期治理规范—Java应用的“数据资产化手册”
java·servlet·oracle
丸码1 天前
Java异常体系全解析
java·开发语言
v***88561 天前
Springboot项目:使用MockMvc测试get和post接口(含单个和多个请求参数场景)
java·spring boot·后端
q***49451 天前
Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat
java·ubuntu·centos
IMPYLH1 天前
Lua 的 require 函数
java·开发语言·笔记·后端·junit·lua
曾经的三心草1 天前
基于正倒排索引的Java文档搜索引擎1-实现索引模块-实现Parser类
java·开发语言·搜索引擎
vx_bscxy3221 天前
告别毕设焦虑!Python 爬虫 + Java 系统 + 数据大屏,含详细开发文档 基于web的图书管理系统74010 (上万套实战教程,赠送源码)
java·前端·课程设计
字节拾光录1 天前
Java工具库三足鼎立:Hutool、Apache Commons、Guava深度测评与场景化选型指南
java·apache·guava
爱学习的小可爱卢1 天前
Java UDP编程实战:UDP数据报套接字编程DatagramPacket、DatagramSocket 、InetSocketAddress
java·udp·udp数据报