SSM(B站黑马)学习笔记
01-1-Spring概述
01-2-Spring IOC
01-3-Spring AOP
01-4-Spring 事务
02-SpringMVC
03-SSM整合
04-Maven高级
05-SpringBoot
06-MyBatisPlus
文章目录
前言
SSM(B站黑马)学习笔记 03-SSM整合
03-SSM整合
SSM整合(配置整合)
1.创建工程
使用骨架(模板)的方式创建Maven Web项目
2.pom.xml导入所需依赖
<dependencies>
<!--SpringMVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<!--servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--SpringMvc json解析库-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<!--mybatis依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!--mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.24</version>
</dependency>
<!--数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<!--Spring操作数据库-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<!--Spring整合Mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!--JUnit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!--Spring整合JUnit-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!--tomcat 插件-->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
3.创建包层次结构
4.Spring核心配置
5.Spring整合Mybatis
6.SpringMVC配置
SSM整合(功能模块开发)
导入sql文件
链接:https://pan.baidu.com/s/16nmiqsj4DhHzM–N_nkplQ?pwd=wzvu
提取码:wzvu
功能模块开发
Spring事务开启
SSM整合(接口测试)
在企业开发时,有两个环节要进行测试,一个是业务层(service)要使用JUnit对接口进行测试,另一个是表现层(controller)要使用PostMan对接口进行测试
Spring整合JUnit
这里只测了两个
PostMan测试
表现层与前端数据传输协议(Result结果集)
定义
要将后端的数据与前端连接,结果在连的时候前端人员给我们反馈一些问题,当你现在进行增删改操作时返回的是true。但是进行查询操作的时候查了单条数据,前端发现取出来以后这不是直接数据,是json格式还要进去解析才能得到,当进行查询全部的时候,发现拿到以后直接进行解析json格式发现得不到数据他是个json数组,要遍历以后才能解析。
每次操作后得到的格式各种各样,这样的话后端和前端要沟通好,把格式给做一个整合,变成统一的格式交给前端。于是我们就想了一个方案,我们创建一个模型类一般就叫结果(Result),在里面声明一个data属性,以后我们操作的结果数据都扔到data这样就不乱了,就知道哪里面放的是数据了。前端就知道数据都在data里,在data里取数据就行。
还有一个问题,增删改返回的都是true,前端不知道这是哪个操作的true。既然现在没办法从数据上区分操作,我们必须得再加一个识别的符号,比如说1代表新增、2代表修改、3个了删除。那前后端约定好,把上面的格式又改了,我们在封装的结果集再加一个code属性,比如说第一组数据"code":20031就代表这是个删除操作,以后看到20031的结果就是删除操作的结果,是true就代表删除成功了是false就代表删除失败。20041呢代表查询,不管是查单条还是查全部都代表查询。
增删改的问题解决了查询又出问题了,为什么,假如查了一个不存在的数据,那这个时候data一定返回是个null。那"code":20041代表查询,没说查询成功还是失败,这时前后端又约定,结尾0就查询失败,1就成功。这么做程序员是知道了,前端页面显示给用户什么呢,不能什么都不说吧。于是又在封装的结果集中增加一个message(msg)属性,对操作的消息进行显示。
这套模型就是前端人员写页面和后端人员写服务器之间通信的协议,也就是大家都按照约定来。在企业开发中教程在一块跑协议、联调协议说的就是这个东西。目前我们使用的协议就定义成这样(如下图),我们定义一个类Result,里面封装三个属性 数据 data、编码 code、消息 msg。有了这三个东西前后端人员就能合作工作了。注意这个类定义的时候不是固定的死格式,这个类名也不一定非得Result,想叫什么叫什么,想加几个字段都行,只要够用就好,同时不同的项目组这个东西的格式也完全不一样,所以要根据项目组的约定来进行。
实现

实现初始化(同上方SSM整合到接口测试一模一样)
Result是属于表现层用的,数据展示相关的,所以放在controller包里(放其它地方也行)
如果使用new对象 用set方法传递数据就太麻烦了,所以这里使用构造方法传递。可以使用带消息或者不带消息的,视情况而定
code值是前后端约定好的,每次直接写的话容易出问题,直接定出来,创建一个新的类叫Code专门用来定义code值。(枚举或许更好)
暂时这么多,少了再加
使用
异常处理
异常处理器
各个层级均有可能出现异常,异常处理代码写在哪一层——所有的异常均抛出到表现层进行处理
表现层处理异常,每个方法中单独书写try{}catch{}代码书写量巨大且意义不强,如何解决——AOP思想
SpringMVC提供快捷的处理方案——异常处理器(相当于SpringMVC提供的AOP)
使用案例
案例初始化(跟Result结果集完成后一样)
因为是将异常都抛到表现层进行处理,所以将其放到controller包里最合理
注意:注解@RestControllerAdvice要被扫描到才能用,因为放在controller包下所以不用更改,换地方要加上
手动制造异常并测试
未开启异常处理器的情况下
开启异常处理器
出现异常会被异常处理器拦截,通过异常处理器返回给前端提示信息
项目异常处理(如何向上层抛异常并分类处理)
项目异常分类
发现出异常了并且是属于业务级的,外边用户折腾的,看来你没有预计到用户能这么折腾,把它纳入到业务异常。如果不是业务异常,不去没办法完全避免,然后随时还可能的放到系统异常里。
案例:制造业务异常和系统异常并分类处理
这里一般用aop处理(在业务完成,把能想到的异常都加上)
第一步,自定义异常类——业务异常、系统异常
自定义异常类要继承RuntimeException,是因为这种运行时异常可以出现后不处理,它自动向上抛。要是不继承RuntimeException以后每个方法后都要写throw SystemException(直接继承Exception也可以)
在类里面覆盖所有的构造方法(用哪个留哪个),就是要创建的异常。因为自定义异常没办法区分是哪一种,所以定义code属性——异常编号,帮助识别(不定义也行,定义规范)。
SystemException类和BusinessException类一模一样
补充Result时写的Code值(根据项目所需补充)
第二步,模拟可能发生异常的地方,对其进行处理
这里一般用aop处理(在业务完成,把能想到的异常都加上)
第三步,使用异常处理器对拦截的异常进行反馈
ex.getCode()和ex.getMessage()是拦截到了自定义SystemException的异常,通过构造方法从被拦截处传入的(上图BookServiceImpl类的36、42行)
PostMan测试
记得把前面controller处的int i=1/0去掉,不然一直是Exception系统繁忙在处理
总结
自定义异常类->拦截异常(构造方法传入异常信息)->使用异常处理器反馈异常信息
SSM整合前后台协议联调
案例初始化——从整合开始到异常处理的全部内容
导入前端页面,并设置配置类放行静态页面,访问静态资源不经过SpringMVC
记得进行扫描
查询全部
注意分清res.data和res.data.data 前者是Result结果集后者是结果集内data既要显示的数据
保存图书(新增)
完善后端代码,原先写死了,不管成功还是失败都返回的true。修改为通过数据库影响行数判断是否成功
修改功能
scope.row获取当前行数据
点击获取当前行数据,根据id查询,设置并显示formData表单数据
原先测试异常处理,在BookServiceImpl设置了必出异常,注释掉系统异常模拟,保留业务异常模拟用户非法输入
修改数据(和新增操作基本一样)
输入修改信息
成功修改
出现异常情况
删除
注:
该内容是根据B站黑马程序员学习时所记,相关资料可在B站查询:黑马程序员2022最新SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术