干翻Mybatis源码系列之第十篇:Mybatis Plugins基本概念与拦截概述

news2024/9/24 1:24:52

给自己的每日一句

不从恶人的计谋,不站罪人的道路,不坐亵慢人的座位,惟喜爱耶和华的律法,昼夜思想,这人便为有福!他要像一棵树栽在溪水旁,按时候结果子,叶子也不枯干。凡他所做的尽都顺利

本文内容整理自《孙哥说Mybatis系列视频课程》,老师实力十分雄厚,B站搜孙帅可以找到本人

前言

插件不属于Mybatis源码的体系,属于Mybatis应用的体系,这就是Mybatis的拦截器,也称为Mybatis plugins 这里需要注意需要与Mybatis Plug的深度封装进行区分。

Mybatis Plugins拦截器的作用 粗略版

作为Mybatis来讲,对于整个数据库访问和操作进行深度的封装。
1:应用开发更加的快速
2:相对来讲,灵活性要比JDBC差一点。
所有的封装,都是为了少编码,代码规范,可以快速开发。但是因为封装的很厉害,进行一些定制操作的时候,基于封装进行操作的时候,基于Mybatis如果不理解到位的话,那么就不太好搞了

Mybatis Plugins就是可以让我们深度的去定制Mybatis的开发。

一:获取Mybatis开发过程中的SQL语句?

一些方案:
这里指的是在我们编程过程中,通过我们的代码获取我们的SQL语句。
1:日志这个方案就不太行了,因为日志必须输出到控制台。
2:IO读文件去拿文件中的SQL。但是这样是没有参数的。
3:使用MappedStatement对象当中对SQL封装的对象(BoundSQL)这样也不能动态获取当前要执行的SQL

JDBC当中是没有这个问题的,因为JDBC在执行我们对应的SQL过程当中,我们是直接把SQL暴露在我们代码当中的。针对于现在的需求来讲,Mybatis现有的体系就无法解决了,这样就遇到了Mybatis Plugins来解决了。

二:Mybatis Plugins拦截器的作用

servlet当中的filter是过滤器 ,过滤器本质上也可以看做一种拦截器。客户端发请求到达Servlet之前和Servlet处理请求之后,都进行一个拦截处理的操作,这就是拦截器的概念或者作用。

在这里插入图片描述
Mybatis中的拦截器和filter的作用是非常相似的,只不过这个拦截器拦截的不是servlet,而是Dao当中开发的各种各样的方法。

UserDao userDao = sqlSession.getMapper(UserDao.class);
userDao.save();

拦截器就是我们真正执行userDao.save()方法前,进行拦截然后处理一些功能,处理完毕之后再执行目标save()方法然后将结果返回给调用者。
在这里插入图片描述
拦截器就是拦截用户对Dao中方法的调用,假如一些通用的功能,这就是拦截器的一个核心的作用。如果后续还有一个其他的方法,那么这个拦截器会不会起作用呢?这是一定的,拦截器一定会拦截所有Dao的方法,从这个体系来看,如果我们Spring完的比较好的话,这已经等同于Spring当中的Aop编程了。

三:Mybatis Plugins拦截器的作用 细致版

我们刚才说到,拦截器的作用是拦截Mybatis当中Dao当中的方法的,但是这样的说法是不太准确的。User.save,update,delete,他们的底层无用例外都是sqlSession.select,update,delete,insert也就是sqlSession当中提供的方法。拦截这些Dao的方法,都变成了拦截SqlSession当中的方法,而SQLSession当中的方法,又是由Executor、StatementHandler、ParameterHandler、ResultSetHandler,这些组件帮忙做的,所以所谓的拦截器核心拦截的是这些组件。

我们在往下分,拦截拦截的不是组件对象,一定是对象中的方法。拦截器真正拦截的目标是上边这些组件对象当中的方法。

在这里插入图片描述

原则上这里边的任何一个方法都可以被拦截器拦截到。
但是实际上作为拦截器,这里边都可以被拦截,但是有些是常用的,有些是不常用的,我们实际开发过程中,常用如下:
在这里插入图片描述
我们知道,真正负责数据库操作的是StatementHandler就是Exexutor也得交给StatementHandler来进行数据库操作。
所以,我们认为StatementHandler当中的方法是最常用的,原因如下:
在这里插入图片描述
StatementHandler才是真正Mybatis当中与数据库进行通讯的,Executor当中的query方法和update方法也是交个StatementHanler进行操作。所以,我们来拦截Executor意义不大,拦截StatementHandler才是最正确的方式。

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

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

相关文章

vue jointjs 拓扑图 自定义shape 按需引入

只展示部分核心代码,完整代码见文章尾部连接 import jointjs/dist/joint.core.css;// 类库 包含: Paper Graph Cell CellView Element Link 等等 import { dia } from jointjs/src/core.mjs; // 样式库 包含多个分组(basic standard custom ...) import * as standa…

基于Hexo和Butterfly创建个人技术博客,(11) 使用插件增强博客站点能力

Butterfly官方网站,请 点击进入 本章目标: 掌握常用的plugin插件的用法,本文中是butterfly主题内置集成的第三方插件(部分插件需要再次安装); 一、建议开启的三方插件 KaTeX-数学公式 katex:enable: true# true 表示每一页都加载…

C# NX二次开发:通过UFUN函数获取刀具描述,目录号,库号等信息

今天要将的是,在NX中对CAM模块进行二次开发的时候,往往需要获取一些关于刀具使用的信息,这些信息用NXOPEN的的方法录制也可以录制出来,但是录制出来的代码,往往都是一种刀具类型会出现一个Builder。这样在你不知道有多…

淘宝买家订单API

目录 下载安装与运行 支持的订单读取方式 请求数据格式一 请求头示例 数据格式说明 数据格式示例 返回数据格式一 返回头示例 数据格式说明 数据格式示例 请求数据格式二(根据订单编号) 请求头示例 返回数据格式二(根据订单编号…

【随笔记】如何获得铁粉(仅供参考)

文章目录 一、前言二、秘籍2.1 良好的个人简介2.2 统一的文章格式2.3 详细的专栏划分2.4 有序的博客排版2.4.1 目录部分2.4.2 正文部分2.4.2.1 标题分级2.4.2.2 正文分段2.4.2.3 善用多级列表2.4.2.4 章节分割 三、总结 一、前言 在这篇随笔记的开始,我想声明一下&a…

ChatGPT将改变教育,而不是摧毁它

01 学校和大学的反应迅速而果断 就在 OpenAI 于 2022 年 11月下旬发布ChatGPT 的几天后,该聊天机器人被广泛谴责为一种免费的论文写作、应试工具,它很容易在作业中作弊。 美国第二大学区洛杉矶联合大学立即阻止了OpenAI网站从其学校网络访问。其他人很…

【Java】Java核心要点总结 67

文章目录 1. 浮点数运运算会有精度损失2. 构造方法特点 & 不能被重写3. 接口和抽象类的异同4. Object 类的常见方法5. hashCode() 有什么用 为什么要有 hashCode() 1. 浮点数运运算会有精度损失 这个和计算机保存浮点数的机制有很大关系。我们知道计算机是二进制的&#x…

面试时一定要确认该岗位的直属领导是否在场,如果不在,千万不要接offer,有坑!...

对于有心人来说,面试时可以看出许多隐形信息,比如下面这位网友的提醒: 面试时一定要确认这个岗位的直接汇报领导是否参与了面试,如果没有参与,千万不要接offer! 该职位的直接领导不参与面试,只能…

NLP——Topic Modelling

文章目录 A Brief History of Topic ModelsLatent Dirichlet Allocation (LDA)潜在狄利克雷分布核心思想LDA inputLDA output LDA 如何学习Sampling-based mothods 基于采样的方法Infer Topics For New Documents超参数 Variational methods 变分方法 Ev…

java协同过滤算法的校园二手图书网站springboot vue

用户:(商品推荐算法) 1)首页主要由导航栏、图书展示页、分页所组成。访客能浏览网站上的待出售图书的信息,但是若要购买,收藏图书,查看卖家信息则会自动跳转到登录界面,已经登录的用户则可以浏…

WPS AI最全申请与使用手册;AIGC制作游戏音乐;便宜快捷使用完整版SD;人人都能看懂的ChatGPT原理课 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 面向虚拟世界的生成式AI市场全景图 作者在这篇文章中探讨了生成式AI在虚拟世界的应用,并绘制了 Market Map V3.0 (市场全景…

C++ 有用的资源||19道必须掌握的C++面试题

C 有用的资源 C 有用的资源 以下资源包含了 C 有关的网站、书籍和文章。请使用它们来进一步学习 C 的知识。 C 有用的网站 C Programming Language Tutorials − C 编程语言教程。C Programming − 这本书涵盖了 C 语言编程、软件交互设计、C 语言的现实生活应用。C FAQ −…

chatgpt赋能python:Python中的遍历方法详解

Python中的遍历方法详解 在Python中,遍历是处理数据的常见操作。Python提供了多种遍历方法,本文将逐一介绍这些方法的特点、适用场景及使用方法。 for循环 for循环是Python中最常用的遍历方法之一,可以遍历任何可迭代对象。 # 遍历列表 f…

栈的运用——中缀表达式[Java实现]

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹 ⭐所属专栏:数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现,有时候有C/C代码。 ⭐如果觉得文章写的…

C++【位图/布隆过滤器—海量数据处理】

文章目录 一、位图(1)位图概念介绍(2)简单模拟实现(3)位图应用 二、布隆过滤器(1)关于布隆过滤器概念及介绍(2)布隆过滤器的使用场景(3&#xff0…

干翻Mybatis源码系列之第十一篇:Mybatis拦截器获取被拦截对象的方法和参数

给自己的每日一句 不从恶人的计谋,不站罪人的道路,不坐亵慢人的座位,惟喜爱耶和华的律法,昼夜思想,这人便为有福!他要像一棵树栽在溪水旁,按时候结果子,叶子也不枯干。凡他所做的尽…

DJ4-1 网络层概述

目录 一、网络层提供的功能 二、路由和转发 三、数据平面和控制平面 四、网络层的服务模型 一、网络层提供的功能 网络层实现主机与主机之间的通信 从发送方主机传输报文段到接收方主机: 发送方主机封装报文段 (segments) 为数据报 (datagrams)接收方主机递交…

Linux常用命令——gcov命令

在线Linux命令查询工具 gcov 测试程序的代码覆盖率的工具 补充说明 gcov命令是一款测试程序的代码覆盖率的工具。 语法 gcov(选项)(参数)选项 -h:显示帮助信息; -v:显示版本信息; -a:输出所有的基本块的执行计数…

SpringMVC 中的常用注解和用法

观前提示:本篇博客演示使用的 IDEA 版本为2021.3.3版本,使用的是Java8(又名jdk1.8) 电脑使用的操作系统版本为 Windows 10 目录 前言 Spring Boot Spring MVC 1. MVC 1.1 MVC 和 Spring MVC 之间的关系 2. 创建 Spring MVC 项目 创建一个 SpringMVC 项目 1. new projec…

PyQt学习笔记-使用通用数据库接口QtSql操作SQLite数据库

使用通用的数据库接口的好处是当数据库发生改变时,只需要修改初始化的配置即可,而不用修改对应的更多的代码。 一、QtSql类 QtSql类时的数据库操作接口类,包含如下类: QSql QSqlError QSqlQueryModel QSqlRelationalTableMo…