当前位置: 首页 > news >正文

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/>

相关文章:

2024-01-15(SpringMVCMybatis)

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

Node+Express编写接口---前端

前端页面 vue_node_admin: 第一个以node后端,vue为前端的后台管理项目https://gitee.com/ah-ah-bao/vue_node_admin.git...

防火墙技术

防火墙&#xff08;英语&#xff1a;Firewall&#xff09;技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备&#xff0c;帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障&#xff0c;以保护用户资料与信息安全性的一种技术。 防火墙技术的功能主要在于及…...

图灵日记之java奇妙历险记--String类

目录 String常用方法字符串构造String对象的比较字符串查找char charAt(int index)int indexOf(int ch)int indexOf(int ch, int fromIndex)int indexOf(String str)int indexOf(String str, int fromIndex)int lastIndexOf(String str)int lastIndexOf(String str, int fromIn…...

代码随想录算法训练营第六天| 242 有效的字母异位词 349 两个数组的交集 202 快乐数 1 两数之和

目录 242 有效的字母异位词 349 两个数组的交集 202 快乐数 1 两数之和 242 有效的字母异位词 排序 class Solution { public:bool isAnagram(string s, string t) {sort(s.begin(),s.end());sort(t.begin(),t.end());return t s;} }; 时间复杂度O(nlogn) 空间复杂度O(l…...

数学建模--比赛

内容来自数学建模BOOM&#xff1a;【快速入门】北海&#xff1a;数模建模基础MATLAB入门论文写作数学模型与算法(推荐数模美赛国赛小白零基础必看教程)_哔哩哔哩_bilibili 目录 1.学习内容 2.参赛须知 1&#xff09;参赛作品的组成 2)参赛作品的提交 3.软件安装 4.注意…...

JVM工作原理与实战(十六):运行时数据区-Java虚拟机栈

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、运行时数据区 二、Java虚拟机栈 1.栈帧的组成 2.局部变量表 3.操作数栈 4.帧数据 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和执行字节码&#xff0c;管理…...

DC-4靶机刷题记录

靶机下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1YbPuSw_xLdkta10O9e2zGw?pwdn6nx 提取码&#xff1a;n6nx 参考&#xff1a; 【【基础向】超详解vulnhub靶场DC-4-爆破反弹shell信息收集】 https://www.bilibili.com/video/BV1Le4y1o7Sx/?share_sourc…...

【前端学习笔记1】css基础

css可以使页面更漂亮&#xff0c;即美化网页 css&#xff1a;层叠样式表 标签选择器&#xff1a; 类选择器&#xff1a; id只能单次调用&#xff0c;类似人的身份证 css里只要是word里面有的功能&#xff0c;他们都有对应的&#xff0c;不会的时候查一下就行 实现垂直居中:h…...

CVE-2023-46226 Apache iotdb远程代码执行漏洞

项目介绍 Apache IoTDB 是针对时间序列数据收集、存储与分析一体化的数据管理引擎。它具有体量轻、性能高、易使用的特点&#xff0c;完美对接 Hadoop 与 Spark 生态&#xff0c;适用于工业物联网应用中海量时间序列数据高速写入和复杂分析查询的需求。 项目地址 https://io…...

Redis实战之-分布式锁

一、基本原理和实现方式对比 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&#xff0c;让程序串行…...

Cookie同源策略

同源策略&#xff08;Same-Origin Policy&#xff09;是浏览器安全机制的一部分&#xff0c;用于限制一个源&#xff08;域名、协议和端口的组合&#xff09;的文档或脚本如何与来自另一个源的资源进行交互。这个策略帮助防止潜在的恶意网站在用户浏览器中执行恶意操作。 关于C…...

6、Numpy形状操纵

目录 1. 使用 reshape 改变形状 2. 使用 resize 改变大小和形状 3. 使用 ravel 或 flatten 展平数组 4. 使用 -1 推断尺寸 5. 使用 newaxis 增加维度 6. 使用 squeeze 移除单维度条目 1. 使用 reshape 改变形状 对于任何 NumPy 数组&#xff0c;你可以使用 reshape 方法来…...

C++初阶类与对象(二):详解构造函数和析构函数

上次为类与对象开了一个头&#xff1a;C初阶类与对象&#xff08;一&#xff09;&#xff1a;学习类与对象、访问限定符、封装、this指针 今天就来更进一步 文章目录 1.类的6个默认成员函数2.构造函数2.1引入和概念2.2构造函数特性2.2.1特性1~42.2.2注意2.2.3特性5~72.2.4注意 …...

【Vue3】3-3 : 组件之间是如何进行互相通信的

本书目录&#xff1a;点击进入 一、组件之间为什么要做通信 二、组件之间通信方式 2.1、父传子&#xff1a;由传递属性实现 stage 1&#xff1a;申明 &#xff08;即定义&#xff09; stage 2&#xff1a;注册 stage 3&#xff1a;使用 【示例】&#xff1a;父组件将 tit…...

网络端口映射和端口转发的区别和联系

目 录 一、端口映射技术 1.1 原理 1.2 应用场景 1、远程访问 2、游戏主机 3、文件共享 4、监控视频共享 二、端口转发技术 2.1 原理 2.2 应用场景 1、网络负载均衡 2、网络安全 3、网络代理 三、端口映射和转发的实现方法 3.1 路由器配置 3.2 网络防火墙 …...

VLSI超大规模集成电路设计复习

目录 VLSI超大规模集成电路设计复习引论MOS原理延时组合逻辑时序电路SRAM 总结&#xff08;一张纸&#xff09;参考资料 VLSI超大规模集成电路设计复习 复习可参照官网PPT上的知识点&#xff0c;然后根据知识点对应的去看书上的讲解。 引论 摩尔定律 尺寸缩小定律 N、P型半…...

GCC 内联汇编

LINUX下的汇编入门 AT&T风格 汇编 和GCC风格汇编 汇编代码的调试 前面写了三篇,是自我摸索三篇,摸着石头过河,有些或许是错误的细节,不必在意! 今天我们直接用GCC编译C语言代码,且在C语言里面内嵌AT&T风格的汇编! 前三篇大家了解即可,我们重点放在内嵌汇编里,简单快…...

springboot整合websocket后启动报错:javax.websocket.server.ServerContainer not available

一、场景 Springboot使用ServerEndpoint来建立websocket链接。引入依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>配置Websocket Confi…...

Vue面试之生命周期(上篇)

Vue面试之生命周期(上篇) 创建阶段beforeCreatecreated挂载阶段beforeMountmounted更新阶段beforeUpdateupdated销毁阶段beforeDestroydestroyed补充说明activated...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...