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、微服务等技术打下基础。

相关推荐
TDengine (老段)3 小时前
TDengine 聚合函数 ELAPSED 用户手册
java·大数据·数据库·sql·物联网·时序数据库·tdengine
我不是混子3 小时前
数据误删了咋办?别怕,今天来教你如何恢复数据
java·后端
zjjuejin3 小时前
Maven 最佳实践与性能优化
java·后端·maven
卷Java3 小时前
WXML 编译错误修复总结
xml·java·前端·微信小程序·uni-app·webview
Yilena3 小时前
跟进 JDK25:将虚拟线程安全引入生产的权衡与实战
java·开发语言·虚拟线程·结构化并发·jdk25
_extraordinary_3 小时前
Java HTTP协议(二)--- HTTPS,Tomcat
java·http·https
钟离墨笺3 小时前
Go语言-->切片注意点及理解
java·开发语言·golang
麦麦鸡腿堡3 小时前
Java的数组查找
java·开发语言