当前位置: 首页 > 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...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

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

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

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...