SpringMVC+Spring +MyBatis,这是一个标准的MVC设计模式,它将整个系统划分为web、service层、dao层。Spring MVC、Spring、Mybatis各司其职,在整个项目中有着不同的作用。
image.png

SSM整合流程

1.创建数据库和表
2.创建Maven Web模块
3.创建三层架构的包
4.SSM整合
①Spring整合MyBatis
②Spring整合SpringMVC

Spring整合MyBatis

image.png

配置

JdbcConfig

  1. package com.itheima.config;
  2. import com.alibaba.druid.pool.DruidDataSource;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.PropertySource;
  6. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  7. import javax.sql.DataSource;
  8. // Jdbc相关的配置类
  9. @PropertySource("classpath:jdbc.properties")
  10. public class JdbcConfig {
  11. // CTRL + D: 复制一行, ALT + SHIFT + ↓: 向下移动
  12. @Value("${jdbc.driver}")
  13. private String driver;
  14. @Value("${jdbc.url}")
  15. private String url;
  16. @Value("${jdbc.username}")
  17. private String username;
  18. @Value("${jdbc.password}")
  19. private String password;
  20. // @Bean: 创建第三方Bean,并且放到IoC容器中, 没有取id,使用方法名作为id
  21. @Bean
  22. public DataSource dataSource() {
  23. DruidDataSource ds = new DruidDataSource();
  24. ds.setDriverClassName(driver);
  25. ds.setUrl(url);
  26. ds.setUsername(username);
  27. ds.setPassword(password);
  28. return ds;
  29. }
  30. @Bean//创建Spring事务管理器并放啊Spring容器中
  31. public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource){
  32. DataSourceTransactionManager manager = new DataSourceTransactionManager();
  33. manager.setDataSource(dataSource);
  34. return manager;
  35. }
  36. }

jdbc.properties

  1. jdbc.driver=com.mysql.jdbc.Driver
  2. jdbc.url=jdbc:mysql://127.0.0.1:3306/ssm_db?useSSL=false
  3. jdbc.username=root
  4. jdbc.password=root

SpringConfig

package com.itheima.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration//标记为配置类
@ComponentScan("com.itheima.service")
@Import({JdbcConfig.class,MyBatisConfig.class})//导入JdbcConfig配置类
@EnableTransactionManagement//启用事务管理器
public class SpringConfig {
}

MyBatisConfig

package com.itheima.config;

import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

public class MyBatisConfig {
        // 1.创建 SqlSessionFactoryBean 到 IoC容器中
        @Bean
        public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) {
            SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
            ssfb.setTypeAliasesPackage("com.itheima.pojo");
            ssfb.setDataSource(dataSource);

            return ssfb;
        }

        // 2.创建 MapperScannerConfigurer 到 IoC容器中
        @Bean
        public MapperScannerConfigurer mapperScannerConfigurer() {
            MapperScannerConfigurer msc = new MapperScannerConfigurer();
            msc.setBasePackage("com.itheima.dao"); // MyBatis会扫描这个包中的所有接口生成实现类
            return msc;
        }
    }

模型,数据层,业务层,测试接口

666.png
11.png

Spring整合SpringMVC

导入配置

SpringMvcConfig

package com.itheima.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@ComponentScan({"com.itheima.controller","com.itheima.config"})
@EnableWebMvc//开启SpringMVC的驱动注解
public class SpringMvcConfig {
}

ServletConfigInitializer

package com.itheima.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class ServletConfigInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    //告诉Tomcat Spring的核心配置类(SSM整合核心)
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {SpringConfig.class};
    }
    //告诉Tomcat Spring MVC的核心配置类
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] {SpringMvcConfig.class};
    }
    //告诉Tomcat SpringMVC要处理的请求路径
    @Override
    protected String[] getServletMappings() {
        return new String[] {"/"};
    }
}

关键在此:image.png

创建控制器

在controller包下创建控制器

package com.itheima.controller;

import com.itheima.pojo.Book;
import com.itheima.service.Bookservice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired
    private Bookservice bookservice;

    @GetMapping
    public List<Book> findAll(){
        List<Book> bookList = bookservice.findAll();
        return bookList;
    }
}

最后在Postman中测试网页。

SSM整合后基于Restful的Controller开发

11.png

Spring和SpringMVC框架整合本质

Spring和SpringMVC框架的整合本质上是两个Spring容器的整合,Spring管理service,dao,事务等相关的组件的注入;SpringMVC管理控制器相关的组件controller。
父子容器:
在配置文件中的ServletConfigInitializer中,getRootConfigClasses设置的是父容器,getServletMappings设置的是子容器。
ce8cbd360ad8453a825f2445b7acc77.png
•IoC容器体系中可以有多个子容器,但是父容器只有一个。不同的子容器之间不能共享bean,但是子容器都可以获得父容器中的bean信息。
•Spring容器对应的是父容器,SpringMVC容器对应的是子容器。从容器里面getBean的时候,先从本容器取,如果取不到再从父容器取。

表现层数据封装

前端接收数据格式——创建结果模型类,封装数据到data属性中。
前端接收数据格式——封装操作结果到code属性中。

目的:方便前端查看
步骤如下:
1.设置统一数据返回结果类,让前端更好的理解和处理
image.png
2.设置统一数据返回结果编码
接口中的成员变量都是public static final修饰:常量

// 状态码
public interface Code {
    // 正常状态码
    Integer SAVE_OK = 20011;
    Integer DELETE_OK = 20021;
    Integer UPDATE_OK = 20031;
    Integer GET_OK = 20041;

    // 错误状态码
    Integer SAVE_ERR = 20010;
    Integer DELETE_ERR = 20020;
    Integer UPDATE_ERR = 20030;
    Integer GET_ERR = 20040;

    // 异常状态码
    Integer SYSTEM_ERR = 50001;
    Integer SYSTEM_TIMEOUT_ERR = 50002;
    Integer SYSTEM_UNKNOWN_ERR = 59999;
    Integer BUSINESS_ERR = 60002;
}

3.根据情况设定合理的Result
image.png

项目异常统一处理

image.png所有的异常均抛出到表现层进行处理
项目异常通知(对控制器进行增强,如果控制器中的方法出现异常都来这里处理)
image.png这里创建

抓项目中的所有异常

image.png
@ControllerAdvice:普通控制器的异常处理,这个类创建对象放到IoC容器中
@RestControllerAdvice=@ControllerAdvice+@ResponseBody

项目异常处理方案

image.png

业务异常

//业务异常
@AllArgsConstructor
@NoArgsConstructor
public class BusinessException extends RuntimeException{
    //保存异常状态码
    private int code;

    public BusinessException(String message, int code) {
        super(message);
        this.code = code;
    }
}

系统异常

//系统异常
@Data
public class SystemException extends RuntimeException{
    //保存异常状态码
    private int code;

    public SystemException(String message, int code) {
        super(message);
        this.code = code;
    }
}

拦截并处理异常(注:这个切面类所在的包要能被扫描到)
image.png

SSM整合静态资源放行

在config包下创建SpringMvcSupport

package com.itheima.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
//SpringMVC的额外配置,创建IoC(静态资源放行,拦截器)
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    //静态资源放行
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        //addResourceHandler("css/**"):浏览器的访问路径
        //addResourceLocations("/css/"):资源的真实位置
        registry.addResourceHandler("css/**").addResourceLocations("/css/");
        registry.addResourceHandler("js/**").addResourceLocations("/js/");
        registry.addResourceHandler("pages/**").addResourceLocations("/pages/");
        registry.addResourceHandler("plugins/**").addResourceLocations("/plugins/");
    }
}