SpringMVC(四)【SSM 整合、统一结果封装、异常处理、前后台协议联调】(1)

简介: SpringMVC(四)【SSM 整合、统一结果封装、异常处理、前后台协议联调】

前言

       昨天拿到了第一份实习 offer,无奈牛魔学院不让走,导员说学校的实训(装个hadoop环境都得两三天的课程)比实习强多了,没办法,我只能心里说“汝之顶患疾久矣,莫如粪”,然后和导员笑着说说“好的呢”,其实心里万马奔腾。也是没有办法,country让促进就业、大力xxx、全力、三步走、六个抓牢、七个推进、就业加速度 ... 都是扯淡,下面的领导们才不关心你就不就业,搬砖还是吃土。

1、SSM 整合

1.1、总览

SSM 整合

  • Spring
  • SpringConfig
  • Mybatis
  • MybatisConfig
  • JdbcConfig
  • jdbc.properties
  • SpringMVC
  • ServletConfig
  • SpringMvcConfig

功能模块

  • 表与实体类
  • dao(接口 + 自动代理)
  • service(接口 + 实现类)
  • 业务层接口测试(整合 JUnit)
  • controller
  • 表现层接口测试(PostMan)

1.2、Spring 整合 Mybatis

1.2.1、Spring 配置类

这里先设置 Spring 负责管理的 Bean 路径

@Configuration
@ComponentScan({"com.lyh.service"})
@PropertySource("jdbc.properties")
@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {
}

这里的 jdbc.properties 是为了整合 Mybatis 用的:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_db
jdbc.username=root
jdbc.password=Yan1029.

       如果报错:Could not open ServletContext resource [/jdbc.properties] 就替换为 @PropertySource("classpath:jdbc.properties")

1.2.2、Jdbc 配置类

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;
    }
}

1.2.3、Mybatis 配置类

       这里需要写两个方法,分别负责返回 Mybatis 创建连接对象的工厂和设置 Mybatis 的 Mapper 扫描包(Mapper 接口所在的包)。

public class MybatisConfig {
 
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setTypeAliasesPackage("com.lyh.domain");
        return factoryBean;
    }
 
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer msc = new MapperScannerConfigurer();
        msc.setBasePackage("com.lyh.dao");
        return msc;
    }
 
}

1.2.4、事务处理

1、首先在 JdbcConfig 中添加事务管理器

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

2、然后在 SpringConfig 中启用事务

3、最后在 BookService 设置事务注解

@Transactional
public interface BookService {
    //...
}

1.3、Spring 整合 SpringMVC

1.3.1、Servlet 容器配置类

public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
 
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }
 
    // Web 容器加载的是 SpringMVC 的配置类
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }
 
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
 
    // 中文乱码处理
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        return new Filter[]{filter};
    }
}

       注意这里 getRootConfigClass 和 getServletConfigClass 造出来的容器对象不是同一个容器对象。但是 SpringMVC 的容器可以访问 Spring 的容器,但是 Spring 的容器不能访问 SpringMVC 的容器。 也就相当于 Spring 的容器是父容器,而 SpringMVC 是子容器,儿子可以向父亲无限索取,但是父亲却不能向儿子索取一点。

1.3.2、SpringMVC 配置类

@Configuration
@ComponentScan("com.lyh.controller")
@EnableWebMvc
public class SpringMvcConfig {
    
}

       到这里我们就把 Spring、Mybatis 和 SpringMVC 整合在了一起,这样当我们的 Web 容器启动的时候,他就会把我们 SpringConfig 和 SpirngMvcConfig 进行加载,然后这两个配置类会各自加载自己对应的 Bean。

1.4、功能模块开发

先把文件创建出来:

  • 在 domain 下创建 Book 类
  • 在 dao 下创建 BookDao 接口
  • 在 service 下创建 BookService 接口
  • 在 service 下的 impl 下创建 BookServiceImpl 实现类
  • 在 controller 下创建 BookController 控制器类

1.4.1、dao 层

public interface BookDao {
 
//    @Insert("insert into tbl_book values(null,#{type},{name},{description})")
    @Insert("insert into tbl_book (type,name,description) values(null,#{type},{name},{description})")
    void save(Book book);
 
    @Update("update tbl_book set type = #{type},name = #{},description = #{description} where id = #{id}")
    void update(Book book);
 
    @Delete("delete from tbl_book where id = #{id}")
    void delete(Integer id);
 
    @Select("select * from tbl_book where id = #{id}")
    Book getById();
 
    @Select("select * from tbl_book")
    List<Book> getAll();
}

       这里的两个插入语句都是可以的。

1.4.2、service 层

1)service 接口开发

       接口我们按照开发规范是必须写注释的。

public interface BookService {
 
    /**
     * 新增
     * @param book
     * @return
     */
    boolean save(Book book);
 
    /**
     * 更新
     * @param book
     * @return
     */
    boolean update(Book book);
 
    /**
     * 根据 id 删除
     * @return
     */
    boolean delete(Integer id);
 
    /**
     * 按照 id 查询
     * @param id
     * @return
     */
    Book getById(Integer id);
 
    /**
     * 查询所有
     * @return
     */
    List<Book> getAll();
}
2)接口实现

       com.lyh.service 这个包已经被我们设置让 Spring 管理了 ,这里因为要用到 BookDao 的实现类对象,所以这里自动装配一下就好了,因为我们在 BookDao 中已经配置了自动代理了。

@Service
public class BookServiceImpl implements BookService {
 
    @Autowired
    private BookDao bookDao;
 
    @Override
    public boolean save(Book book) {
        bookDao.save(book);
        return true;
    }
 
    @Override
    public boolean update(Book book) {
        bookDao.update(book);
        return true;
    }
 
    @Override
    public boolean delete(Integer id) {
        bookDao.delete(id);
        return true;
    }
 
    @Override
    public Book getById(Integer id) {
        return bookDao.getById(id);
    }
 
    @Override
    public List<Book> getAll() {
        return bookDao.getAll();
    }
}

1.4.3、controller 层

controller 层依赖我们的 BookService 实现类。

@RestController
@RequestMapping("/books")
public class BookController {
 
    @Autowired
    private BookService bookService;
 
    @PostMapping
    public boolean save(@RequestBody Book book) {
        return bookService.save(book);
    }
 
    @PutMapping
    public boolean update(@RequestBody Book book) {
        return bookService.update(book);
    }
 
    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable Integer id) {
        return bookService.delete(id);
    }
 
    @GetMapping("/{id}")
    public Book getById(@PathVariable Integer id) {
        return bookService.getById(id);
    }
 
    @GetMapping
    public List<Book> getAll() {
        return bookService.getAll();
    }
 
}

SpringMVC(四)【SSM 整合、统一结果封装、异常处理、前后台协议联调】(2)https://developer.aliyun.com/article/1534218

相关文章
|
14天前
|
前端开发
SpringMVC(四)【SSM 整合、统一结果封装、异常处理、前后台协议联调】(3)
SpringMVC(四)【SSM 整合、统一结果封装、异常处理、前后台协议联调】
|
14天前
|
JSON 前端开发 程序员
SpringMVC(四)【SSM 整合、统一结果封装、异常处理、前后台协议联调】(2)
SpringMVC(四)【SSM 整合、统一结果封装、异常处理、前后台协议联调】
|
18天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的大学生校园兼职附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的大学生校园兼职附带文章和源代码部署视频讲解等
41 8
|
18天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的电影评价系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的电影评价系统附带文章和源代码部署视频讲解等
34 8
|
18天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的停车场微信小程序附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的停车场微信小程序附带文章和源代码部署视频讲解等
28 6
|
18天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的使命召唤游戏助手附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的使命召唤游戏助手附带文章和源代码部署视频讲解等
25 5
基于ssm+vue.js+uniapp小程序的使命召唤游戏助手附带文章和源代码部署视频讲解等
|
18天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的移动端购物系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的移动端购物系统附带文章和源代码部署视频讲解等
24 4
基于ssm+vue.js+uniapp小程序的移动端购物系统附带文章和源代码部署视频讲解等
|
18天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的跑腿平台附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的跑腿平台附带文章和源代码部署视频讲解等
32 10
|
18天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的疫情期间学生请假与销假系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的疫情期间学生请假与销假系统附带文章和源代码部署视频讲解等
46 7
|
18天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的英语学习交流平台附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的英语学习交流平台附带文章和源代码部署视频讲解等
25 7