2024-01-15(SpringMVCMybatis)

1.拦截器:如果我们想在多个handler方法(controller中的方法)执行之前或者之后都进行一些处理,甚至某些情况下需要拦截掉,不让handler方法执行,那么就可以使用SpringMVC为我们提供的拦截器。

拦截器和过滤器的区别:过滤器是在Servlet执行之前或者之后进行处理。而拦截器是对handler执行前后进行处理。

步骤:

① 创建并配置拦截器:

public class MyInterceptor implements HandlerInterceptor{
}

② 实现方法:

public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("preHandle");return HandlerInterceptor.super.preHandle(request, response, handler);}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion");HandlerInterceptor.super.afterCompletion(request, response, handler, ex);}
}

③ 配置拦截器:

(springboot中用@Bean注解就可以配置拦截器了)

2.

preHandler方法会在Handler方法(controller中的方法/不同url)执行之前进行,我们可以在其中进行一些前置的判断或者处理。

postHandler方法会在Handler方法(controller中的方法/不同url)执行之后进行,我们可以在其中对域中的数据进行修改,也可以修改要跳转的页面。

afterCompletion方法会在最后执行,这个时候已经没有办法对域中的数据进行修改,也没有方法修改要跳转的路径。我们在这个方法中一般进行一些资源的释放。

3.多拦截器执行顺序:如果我们配置了多个拦截器,拦截器的顺序是按照配置的先后顺序来执行的

注意:

4.统一异常处理:

我们在实际项目中Dao层和Service层的异常都会被抛到Controller层。但是如果我们在Controller的方法中都加上异常的try...catch处理也会显得非常的繁琐。

所以SpringMVC为我们提供了统一异常处理方案。可以把Controller层的异常进行统一处理。这样既提高了代码的复用性也让异常处理代码和我们的业务代码解耦。

一种方法是实现HandlerEeceptionResolver接口(后期不用)的方式,一种是使用@ControllerAdvice注解(重要)的方式。

HandlerEeceptionResolver接口:该接口中只有一个可被重写的方法resolveException。如果handler中出现了异常,就会调用该方法,我们可以在resolveException方法中进行统一的异常处理。

@ControllerAdvice注解使用:

@ControllerAdvice
@Component
public class MyControllerAdvice {@ExceptionHandler({NullPointerException.class, ArrayIndexOutOfBoundsException.class})public ModelAndView handlerException(Exception ex){// 如果出现了上面两种异常,就会调用该方法String msg = ex.getMessage();ModelAndView modelAndView = new ModelAndView();// 把异常信息存入到域中modelAndView.addObject("msg",msg);// 跳转到error.jspmodelAndView.setViewName("/WEB-INF/page/error.jsp");return modelAndView;}
}

5.

前后端不分离模式(如jsp):使用ModelAndView对象来传递信息,跳转页面等。

前后端分离模式(vue): 定义响应体对象Result<T>,配置@ResponseBody注解的方式,将响应数据,响应码等以json格式的形式封装成Result<T>对象给前端做处理。

6.SpringMVC实现文件上传。Http协议规定了我们在进行文件上传时的请求格式要求。所以在进行文件上传时,除了在表单中增加一个用于上传文件的表单项(input标签,type=file),另外还需要满足以下的条件才能进行上传:

① 请求方式为POST请求

② 请求头Content-Type必须为mulipart/form-data

7.接受上传的文件数据并处理

8.SpringMVC执行流程

我们有两种开发模式:

① 一种是类似JSP的开发流程

        把数据放入域对象中,然后进行页面跳转。

② 另外一种是前后端分离的开发模式,这也是目前市场上主流的模式:

        把数据转化为Json放入响应体中。 

所以采用前后端分离的开发模式,从第六步开始,后续的ModelAndView对象都是null,所以第八步:如果ModelAndView为null,就不会去请求视图解析器(视图解析器就是用来拼接跳转页面的名称的,例如拼接.jsp)

9.Spring解决了创建bean(控制反转IOC)和注入属性(依赖注入DI),避免了对象与对象之间的耦合;SpringMVC简化了展示层采用Servlet开发,封装了web原生对象;Mybatis将SQL与代码的解耦,在配置文件中单独书写sql。

10.框架(脚手架)其实就是开发好了很多代码,使得我们在开发相应场景时,可以直接进行调用,快速并简化我们的后续开发。

例如:JavaWeb阶段所有的代码都需要我们自己写,所以我们的代码自己门清。但是框架就不一样了,因为框架内部已经写好了很多代码,我们只是在它的基础之上去添加一些代码,去控制框架,指挥框架,因此有一种“我们只写了一两行代码,但是它发挥出来的效果和之前写很多代码的效果一样”的感觉。

例如:汽车就是框架,我们驾驶汽车不难,但是随着我们驾驶技术的提高,我们也应该去理解学习汽车内部的原理。

11.Mybatis中相关核心类:SqlSessionFactory(用来获取SqlSession对象),SqlSession(提供了在数据库中执行sql命令所需的所有方法,还提供了事务的相关操作)

12.Mybatis配置文件的常用配置属性:Mybatis常用配置属性_mybatis 属性-CSDN博客

13.Mybatis还可以通过内置的日志工厂提供日志功能。内置的日志工厂将会把日志工作委托给下面的实现之一:

SLF4J,Apache Commons Logging,Log4j2,Log4j,JDK logging

Mybatis的日志可以查看我们执行的Sql语句,用于排错。

14.Mybatis也支持注解开发,但是我们一般用Mybatis就是采用xml配置文件的方式来书写sql语句。

---------------------------------------------------------------------------------------------------------------------------------

动态SQL

15.<trim/>标签:可以使用该标签动态的添加前缀或者后缀,也可以使用该标签动态的消除前缀。

① trim标签中的prefixOverrides属性:用来设置需要被清除的前缀,多个值可以用|分隔,注意|前后不要有空格。例如and|or

例如:

② trim标签中的suffixOverrides属性:用来设置需要被清除的后缀,多个值可以|分隔,注意|前后不要有空格。

例如:

③ trim标签中的prefix属性:用来设置动态添加的前缀,如果标签中有内容就会添加上设置的前缀。

例如:

④ trim标签中的suffix属性:用来设置动态添加的后缀,如果标签中有内容就会添加上设置的后缀。

例如:

16.<where/>标签等价于:

<trim prefix = "where" prefixOverrides = "and|or"></trim>

可以使用where标签动态的拼接where并且去除前缀的and 或者 or。 

例如:

17.<set/>标签等价于

<trim prefix = "set" suffixOverrides = ","></set>

 可以使用set标签动态的拼接set并且去除后缀的逗号。

例如:

18.foreach标签:可以使用foreach标签遍历集合或者数组中的参数,获取其中元素拿来动态的拼接SQL语句。

例如:

collection:表示要遍历的数组/集合。

open:表示遍历开始时拼接的语句

item:表示给当前遍历到的元素取的名字

separator:表示每遍历完一次拼接的分隔符

close:表示最后一次遍历完拼接的语句

注意:如果方法参数是数组类型,collection默认的参数名是array,如果方法参数是list,collection默认的参数名是list。建议遇到数组或者集合类型的参数统一使用@Param注解进行命名。

19.choose,when,otherwise标签

当我们不想使用所有的条件,而只是想从多个条件中选择一个使用时。可以使用choose系列标签。类似于Java中的switch。

例如:

20.SQL片段的抽取:相同sql语句抽取出来,通过复用sql片段,来降低sql语句的重复。

21.resultType自动映射实体类的时候出现问题可以使用resutlMap。当我们sql变复杂的时候,我们需要使用resultMap标签自定义结果集实体类的映射规则。

22.mybatis多表连表查询一对一,一对多,多对多:

Mybatis基于xml的一对一、一对多、多对多嵌套结果查询和嵌套查询_java xml 一对多查询-CSDN博客

一对一标签<association/>

一对多List集合的话标签<collection/>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/634714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于内容的图像web检索系统

题目&#xff1a;基于内容的图像在线检索系统 简介&#xff1a;基于内容的图像在线检索系统&#xff08;Content Based Online Image Retrieval , 以下简称 CBOIR&#xff09;&#xff0c;是计算机视觉领域中关注大规模数字图像内容检索的研究分支。典型的CBOIR系统&#xff…

分布式事务Seata实战-AT模式(注册中心为Eureka)

大致记录Seata的AT模式下创建项目过程中需要注意的点和可能遇到的问题。 本项目是以官网的给的示例&#xff08;即下图&#xff09;进行创建的&#xff0c;以Eureka为注册中心。 官网&#xff1a;Seata AT 模式 | Apache Seata™ 官方代码示例&#xff1a; 快速启动 | Apac…

算法笔记(动态规划入门题)

1.找零钱 int coinChange(int* coins, int coinsSize, int amount) {int dp[amount 1];memset(dp,-1,sizeof(dp));dp[0] 0;for (int i 1; i < amount; i)for (int j 0; j < coinsSize; j)if (coins[j] < i && dp[i - coins[j]] ! -1)if (dp[i] -1 || dp[…

Doris配置外表以及多个Hive外表的配置

1.场景分析 以Clickhouse、Doris、Starrocks等为代表的mpp分析数据库正在快速的兴起&#xff0c;以其高效查询、跨库整合能力收到广大技术人员的喜爱。本文主要浅显介绍下作者在使用Doris时&#xff0c;通过建立catlog进行跨库查询。 废话不多少&#xff0c;直接上代码 2.相关…

力扣211. 添加与搜索单词 - 数据结构设计

字典树 思路&#xff1a; 设计一棵字典树&#xff0c;每个节点存放单词的一个字符&#xff0c;节点放一个标记位&#xff0c;如果是单词结束则标记&#xff1b;字典树插入&#xff1a; 字典树默认有 26 个 slot 槽代表 a - z&#xff1b;遍历单词&#xff0c;如果字符对应槽存…

Python自动化实战之接口请求的实现

在前文说过&#xff0c;如果想要更好的做接口测试&#xff0c;我们要利用自己的代码基础与代码优势&#xff0c;所以该章节不会再介绍商业化的、通用的接口测试工具&#xff0c;重点介绍如何通过 python 编码来实现我们的接口测试以及通过 Pycharm 的实际应用编写一个简单接口测…

『Open3D』1.10 Tensor数据处理

open3d中实现了自身的数据类型,用于open3d中内部算法的数值计算,但基础使用上与numpy类似。 目录 1、tensor创建 2、tensor数据属性 3、 Tensor数据在CPU与GPU上的转换

Linux/Traceback

Enumeration nmap 使用nmap初步扫描发现只开放了22和80端口&#xff0c;端口详细扫描情况如下 先看看web是什么样子的&#xff0c;打开网站发现有一条留言&#xff0c;显示该站点已经被黑了&#xff0c; 并且留下了后门 查看源代码&#xff0c;可以看到下面的注释 <!--So…

Docker中创建并配置MySQL、nginx、redis等容器

Docker中安装并配置MySQL、nginx、redis等 文章目录 Docker中安装并配置MySQL、nginx、redis等一、创建nginx容器①&#xff1a;拉取镜像②&#xff1a;运行nginx镜像③&#xff1a;从nginx容器中映射nginx配置文件到本地④&#xff1a;重启nginx并重新配置nginx的挂载 二、创建…

LabVIEW精确测量产品中按键力和行程

项目背景 传统的按键测试方法涉及手工操作&#xff0c;导致不一致和效率低下。在汽车行业中&#xff0c;带有实体按键的控制面板非常常见&#xff0c;确保一致的按键质量至关重要。制造商经常在这些组件的大规模、准确测试中遇到困难。显然&#xff0c;需要一个更自动化、精确…

Kubernetes (十四) 调度策略

一. 调度策略 二. 调度方法 nodeName 创建pod配置文件 vim nodename.yaml apiVersion: v1 kind: Pod metadata: name: nginx labels…

23 SEMC外扩SDRAM

文章目录 23.1 SDRAM 控制原理23.2 SEMC 简介 23.1 SDRAM 控制原理 RT1052 系列芯片扩展内存时可以选择 SRAM 和 SDRAM 由于 SDRAM 的“容量/价格”比较高&#xff0c;即使用 SDRAM 要比 SRAM 要划算得多。 给 RT1052 芯片扩展内存与给 PC 扩展内存的原理是一样的 PC 上一般…

【计算机网络】HTTP协议以及简单的HTTP服务器实现

文章目录 一、HTTP协议1.认识URL2.urlencode和urldecode3.HTTP协议格式4.HTTP的方法5.HTTP的状态码6.HTTP常见Header7.重定向8.长连接9.会话保持10.基本工具 二、简单的HTTP服务器实现1.err.hpp2.log.hpp3.procotol.hpp4.Sock.hpp5.Util.hpp6.httpServer.hpp7.httpServer.cc8.总…

网络编辑day4

思维导图 广播模型发送端-->类似于UDP客户端 #include<head.h> int main(int argc, const char *argv[]) {//1、创建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error ");return -1;}//2、将套接字设置成允许广播int broadcast1…

2023年山东省职业院校技能大赛高职组信息安全管理与评估 模块二(正式赛)

2023年山东省职业院校技能大赛高职组信息安全管理与评估 模块二 模块二竞赛项目试题 根据信息安全管理与评估技术文件要求&#xff0c;模块二为网络安全事件响应、数字取证调查和 应用程序安全。本文件为信息安全管理与评估项目竞赛-模块二试题。 介绍 竞赛有固定的开始和结…

0.96寸OLED-单独驱动和U8g2驱动-硬件软件IIC

0.96寸OLED-单独驱动和U8g2驱动-硬件软件IIC 博主平时DIY经常使用OLED&#xff0c;其中以4脚的I2C屏最多&#xff0c;就想着总结一下子&#xff0c;让广大DIY朋友更容易找到资源。 驱动采用的时SSD1306 同学们拿到代码后&#xff0c;可以直接用&#xff0c;其中博主给的代码默认…

学习响应式编程中遇到的奇奇怪怪的问题

spring项目无法启动 Description: Web application could not be started as there was no org.springframework.boot.web.reactive.server.ReactiveWebServerFactory bean defined in the context. Action: Check your application’s dependencies for a supported react…

【GitHub项目推荐--AI杀入斗地主领域】【转载】

AlphaGo&#xff1a;第一个战胜围棋世界冠军的人工智能机器人。 我不会玩围棋&#xff0c;没办法和 AlphaGO 对局。但是我喜欢玩斗地主&#xff0c;有斗地主人工智能机器人吗&#xff1f; 有&#xff0c;而且还开源了。DouZero&#xff1a;快手团队开发的斗地主AI。别的不说&…

文件共享服务(一)——DAS、NAS、SAN存储类型

一、存储类型 存储类型主要有三种 1. DAS直连式存储 通常由数据线直连电脑就可以用&#xff0c;比如一块新硬盘&#xff0c;只需要利用磁盘模拟器分区&#xff0c;创建文件系统&#xff0c;挂载就可以使用了。 PC中的硬盘或只有一个外部SCSI接口的JBOD存储设备&#xff08;即…

[java数据结构] ArrayList和LinkedList介绍与使用

目录 (一) 线性表 (二) ArrayList 1. ArrayList的介绍 2. ArrayList的常见方法和使用 3. ArrayList的遍历 4. ArrayList的模拟实现 5. ArrayList的优缺点 (三) LinkedList 1. LinkedList的介绍 2. LinkedList的常见方法和使用 3. LinkedList的遍历 4. LinkedList的…