SSM框架从入门到入土(SSM框架整合)

前言:++尽管我们以后要学Springboot,但是SpringMvc依旧是需要掌握的知识,他是Springboot的基础,学习他可以帮助我们更好的理解SPringboot的底层,而不是一味的"白雪"。况且面试题还会问到这两者的关系呢。不说废话了,这章我们要将前面学的三个框架放到一起工作(Spring SpringMVC,Mybatis)。++

++这里提一下,我在创建这个模块时,报了一个错,我的maven版本太过老旧好像是2019年的与 maven-archetype-plugin:3.4.1插件版本不兼容,这里提供更新的maven解压包,这样就解决了版本不兼容的问题https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip++

++下载解压后,不要忘记把原来旧版本maven的环境变量修改,最后在命令行中输入mvn -v(注意有个空格)检验版本是否是新版的3.6.3++

++如图所示:++

创建配置类:

复制代码
src/main/java
├── com.example.config
│   ├── ServletContainersInitConfig  (或者 MyWebAppInitializer)
│   ├── SpringConfig                (根容器配置)
│   ├── SpringMvcConfig            (Web层配置)
│   ├── MyBatisConfig              (MyBatis整合配置)
│   └── JdbcConfig                 (数据库连接池配置)

1.ServletContainersInitConfig(或 MyWebAppInitializer)

作用 :替代 web.xml,启动容器,加载 Spring 和 SpringMVC 配置
继承AbstractAnnotationConfigDispatcherServletInitializer

2. SpringConfig(根容器配置)

作用 :Spring 核心配置,扫描除 Controller 以外的 Bean
注解@Configuration@ComponentScan@Import

java

复制代码
@Configuration
@ComponentScan(basePackages = "com.example",
               excludeFilters = @ComponentScan.Filter(
                   type = FilterType.ANNOTATION,
                   classes = Controller.class
               ))
@Import({JdbcConfig.class, MyBatisConfig.class})
public class SpringConfig {
    // 可以配置一些全局的 Spring Bean
}

3. SpringMvcConfig(Web层配置)

作用 :SpringMVC 配置,扫描 Controller、视图解析器、静态资源等
注解@Configuration@ComponentScan@EnableWebMvc

复制代码
@Configuration
@ComponentScan(basePackages = "com.example.controller")
@EnableWebMvc  // 启用 SpringMVC 注解驱动
public class SpringMvcConfig implements WebMvcConfigurer {
    
    // 静态资源放行
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
    
    // 视图解析器(如果使用 JSP)
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/pages/");
        resolver.setSuffix(".jsp");
        resolver.setOrder(0);
        return resolver;
    }
    
    // JSON 转换器(如果使用 Jackson)
    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        return new MappingJackson2HttpMessageConverter();
    }
}

4. JdbcConfig(数据库连接池)

作用 :配置数据源(Druid、HikariCP 等)
注解@Configuration@Bean@PropertySource

复制代码
@Configuration
@PropertySource("classpath:jdbc.properties")  // 加载配置文件
public class JdbcConfig {
    
    @Value("${jdbc.driver}")
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
    
    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}

jdbc.properties 文件:

复制代码
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
jdbc.username=root
jdbc.password=123456

5.MyBatisConfig(MyBatis整合)

作用 :配置 SqlSessionFactory、Mapper 扫描等
注解@Configuration@Bean@MapperScan

复制代码
@Configuration
public class MyBatisConfig {
    
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setTypeAliasesPackage("com.example.domain");  // 实体类包
        
        // 配置 MyBatis 全局设置(可选)
        org.apache.ibatis.session.Configuration configuration = 
            new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);  // 驼峰命名
        factoryBean.setConfiguration(configuration);
        
        return factoryBean;
    }
    
    // Mapper 扫描也可以在这里配置,或者在 SpringConfig 配置

或者直接在 SpringConfig 上添加 @MapperScan

复制代码
@Configuration
@ComponentScan(...)
@MapperScan(basePackages = "com.example.mapper")  // 扫描 Mapper 接口
@Import({JdbcConfig.class, MyBatisConfig.class})
public class SpringConfig {
配置类 必选 作用
ServletContainersInitConfig 启动容器,整合 Spring/SpringMVC
SpringConfig Spring 根容器(Service、Dao)
SpringMvcConfig SpringMVC 容器(Controller)
JdbcConfig 数据源配置
MyBatisConfig MyBatis 整合配置

功能模块开发:

复制代码
src/main/java
├── com.example
│   ├── controller          # Controller层
│   │   └── UserController.java
│   ├── service            # Service层
│   │   ├── UserService.java
│   │   └── impl
│   │       └── UserServiceImpl.java
│   ├── dao                # Dao层(Mapper)
│   │   └── UserDao.java
│   ├── domain             # 实体类
│   │   └── User.java
│   └── config             # 配置类
│       ├── SpringConfig.java
│       └── ...      
层级 类/文件 核心注解 主要职责
Domain User.java 数据实体
Dao UserDao.java @Mapper 数据库操作接口
Mapper UserMapper.xml SQL映射(可选)
Service UserService.java 业务接口
ServiceImpl UserServiceImpl.java @Service 业务实现
Controller UserController.java @Controller 请求处

测试顺序:

  1. 测试DAO层(单独测试MyBatis)

  2. 测试Service层(Spring容器)

  3. 测试Controller层(Postman)

  4. 前后端联调

异常处理:

复制代码
客户端请求
    ↓
Controller层 (接收请求)
    ↓
Service层 (业务处理)  ← 抛出异常
    ↓                      ↓
    ↓                  异常向上传播
    ↓                      ↓
Controller层 (没有try-catch) 
    ↓                      ↓
    ↓                  异常继续传播
    ↓                      ↓
全局异常处理器  ← ← ← ← ← 捕获异常
    ↓
统一处理后返回给客户端

出现异常现象的常见位置与常见诱因如下:

框架内部抛出的异常:因使用不合规导致
数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)
业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)

表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)

工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)

项目异常处理方案

业务异常(BusinessException)
++发送对应消息传递给用户,提醒规范操作++

系统异常(SystemException)
++发送固定消息传递给用户,安抚用户。
发送特定消息给运维人员,提醒维护
记录日志++

其他异常(Exception)
++发送固定消息传递给用户,安抚用户
发送特定消息给编程人员,提醒维护(纳入预期范围内)
记录日志++

1.自定义项目系统级异常

2.自定义项目业务级异常

3.自定义异常编码

4.触发自定义异常(抛出)

5.拦截并处理异常

并在其中规范返回结果通知前端工作人员

相关推荐
fouryears_234172 小时前
源码阅读:Spring AI 框架是如何进行工具调用以及循环调用的过程
java·人工智能·spring·spring ai
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 基于Java的网上书店管理系统为例,包含答辩的问题和答案
java·开发语言
东东5162 小时前
ssm机场网上订票系统 +VUE
java·前端·javascript·vue.js·毕设
倚肆2 小时前
Kafka 生产者与消费者配置详解
java·分布式·后端·kafka
毕设源码-郭学长2 小时前
【开题答辩全过程】以 基于Java的体育馆管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
倚肆2 小时前
Kafka TopicBuilder 主题配置详解
java·服务器·kafka
p***19942 小时前
SpringBoot项目中替换指定版本的tomcat
spring boot·后端·tomcat