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.拦截并处理异常

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

相关推荐
JAVA面经实录91725 分钟前
集合框架 (六)
java·开发语言
骇客野人30 分钟前
Linux 查看 Java 进程常用命令
java·linux·运维
周GZ1 小时前
简单讲解Java中静态方法与 实例方法
java·开发语言
疯狂打码的少年1 小时前
【数据结构】树的基本概念与二叉树定义
java·数据结构·笔记·算法
盗理者2 小时前
AI Agent 技能分享|SQL 性能诊断与优化
java·sql·spring·skill
GitLqr2 小时前
Java 26 终于原生支持 HTTP/3 了:告别 Netty,直接用 QUIC
java·netty·http3
用户40966601317512 小时前
Jackson 序列化:@JsonIgnore / @JsonProperty / @JsonFormat / @JsonInclude / @JsonUnwrapped 一次讲清楚
java·后端
码路漫漫2 小时前
用了 Caffeine,消息为什么还是被处理了两次?
java
云和数据.ChenGuang2 小时前
fastapi项目拆分实战数据模型
java·服务器·数据库·人工智能·深度学习·fastapi·强化学习
小龙报3 小时前
【优选算法】1.搜索插入位置 2.x的平方根
java·c语言·数据结构·c++·python·算法·蓝桥杯