mybatis 拦截器 执行流程

Mybatis拦截器执行过程解析 上一篇文章 Mybatis拦截器之数据加密解密 介绍了 Mybatis 拦截器的简单使用,这篇文章将透彻的分析 Mybatis 是怎样发现拦截器以及调用拦截器的 intercept 方法的 小伙伴先按照文章内容细致但不入微的了解整个拦截器执行过程,在纸上勾勒出各个点,再细致入微的读源码,将这些点用线串起来,这样站在上帝视角后,理解的更加深刻 发现拦截器 按照官网说明,我们通过实现 org.a... 阅读详情

在 MyBatis 中,当执行一个 SQL 语句时,会涉及到一系列的组件和接口来协同完成这个任务。你提到的 Executor、ParameterHandler、ResultSetHandler 和 StatementHandler 是这些组件中的核心部分。以下是这些组件在 MyBatis 中如何协同工作来执行 SQL 语句的简要概述:

1. Executor

Executor 是 MyBatis 的核心执行器,它负责调度和管理 StatementHandler、ParameterHandler 和 ResultSetHandler。当你通过 MyBatis 的 API(如 SqlSession 的 selectOne、selectList、update、insert 等方法)来执行 SQL 时,实际上是调用了 Executor 的相应方法。

  • update: 执行更新(INSERT、UPDATE、DELETE)操作。
  • query: 执行查询操作。
  • flushStatements: 清除缓存中的语句。
  • commit 和 rollback: 提交或回滚事务。
  • getTransaction: 获取当前事务。
  • close: 关闭执行器。
  • isClosed: 检查执行器是否已关闭。

2. StatementHandler

StatementHandler 负责处理 SQL 语句的生成、参数设置、执行和结果集处理。它封装了 JDBC 的 Statement 对象。

  • prepare: 准备 SQL 语句(可能包括动态 SQL 的解析和生成)。
  • parameterize: 设置 SQL 语句的参数。
  • batch: 添加 SQL 语句到批量操作中。
  • update 和 query: 执行更新或查询操作。

3. ParameterHandler

ParameterHandler 负责处理 SQL 语句的参数。当调用 StatementHandler 的 parameterize 方法时,会由 ParameterHandler 来设置参数。

  • getParameterObject: 获取要设置的参数对象。
  • setParameters: 将参数对象设置到 SQL 语句中。

4. ResultSetHandler

ResultSetHandler 负责处理查询结果集。当执行查询操作时,ResultSetHandler 会处理 JDBC 的 ResultSet 对象,将其转化为 Java 对象(如 List、Map 或自定义的 JavaBean)。

  • handleResultSets: 处理结果集,将其转化为 Java 对象。
  • handleOutputParameters: 处理存储过程的输出参数(如果有的话)。

执行流程

  1. 调用 MyBatis API(如 SqlSession 的方法)来执行 SQL 语句。
  2. Executor 接收到请求后,根据请求类型(更新或查询)来创建或获取一个 StatementHandler。
  3. StatementHandler 准备 SQL 语句(可能包括动态 SQL 的解析和生成),并创建或获取一个 ParameterHandler 来处理参数。
  4. ParameterHandler 设置 SQL 语句的参数。
  5. StatementHandler 执行 SQL 语句。
  6. 对于查询操作,StatementHandler 创建或获取一个 ResultSetHandler 来处理结果集。
  7. ResultSetHandler 将结果集转化为 Java 对象并返回给调用者。

这个流程是一个简化的概述,MyBatis 的实际执行过程可能会更复杂,并涉及到更多的细节和组件。但上述流程应该能帮助你理解 MyBatis 如何协同工作来执行 SQL 语句。

《软件工程——实践者的研究方法》重难点复习笔记(第八章——理解需求) 8项需求工程任务 inception 开始 8.1.1 identify stakeholders 定义:从软件开发中收益 例如:市场人员、销售经理、顾客、顾问、维护团队等(P139) 8.1.2 这个阶段的问题是context-free的。有三套(P140) 8.1.3 提到NFR(nonfunctional requirement)和QFD(quality 阅读详情

相关推荐

AI搜索优化(GEO)实战指南:抢占智能对话流量入口

AI SEO,是针对生成式AI平台(如DeepSeek、豆包、Kimi等)的优化策略,旨在通过适配AI算法对内容的理解和引用逻辑,提升品牌在AI生成答案中的可见性与权威性,从而在对话式搜索场景中抢占流量入口。:强化内容经验性(Experience)、专业性(Expertise)、权威性(Authoritativeness)、可信度(Trustworthiness)内容需避免夸大描述,提供可验证的细节(如数据、用户评价)。

Baixue5209的博客 6774

mybatis拦截器执行过程

原来以为拦截器只是简单的使用下动态代理,看了mybatis的拦截器发现,一个经得起捶打的功能是不可能那么简单的,里面用到了动态代理解决mapper的实现问题,适配器模式用来解决结果对象,参数对象的映射,而且在我看来configuration类做了太多的工作,很多初始化的数据都能在里面找到,只要持有configuration对象,很多数据都可以直接拿到,避免现拿现查的麻烦。

东山下的博客 420

用angr找到strcpy的栈溢出漏洞

这篇文章其实是分析angr文档里给出的一个挖漏洞的小例子。 原文链接在此:https://docs.angr.io/examples#beginner-vulnerability-discovery-example-strcpy_find 这是第一个用angr在二进制里找可利用条件的教程。第一个例子是一个非常简单的程序。这个angr脚本会从程序的entry到strcpy找到一条路径。(只有我们能够控制strcpy的参数的时候) 为了找到正确的路径,angr需要去算一个密码参数,算这个密码,angr只要2s

^_^ 1220

MyBatis 四种类型拦截器、MyBatis拦截器执行流程

用途:拦截MyBatis执行器方法的执行。- 使用:允许拦截和自定义MyBatis执行器的行为。例如,可以添加缓存、日志记录或审计功能到执行器中。这些拦截器可以在MyBatis执行的不同阶段扩展或修改其行为。您可以通过实现MyBatis提供的相应接口并在MyBatis配置文件中进行配置来实现这些拦截器。-- 用途:拦截SQL语句的执行。- 使用:可以在SQL语句执行之前修改或增强它们。例如,可以向WHERE子句添加额外的条件或记录执行的语句。分页等- 用途:拦截SQL语句的参数设置。

m0_74356429的博客 3409

基于SOCKET的***网络软件的设计与实现

二、基于SOCKET的网络软件的需求。2、概要设计:画出软件系统结构图。3、详细设计:软件的详细设计,如类图、序列图、重要的算法流程图或伪代码,等等。4、实现:软件基本功能相关的截图和关键代码。

Recursions的博客 1371

C语言试题三之计算并输出 s=1+(1+2^(0.5))+(1+2^(0.5)+3^(0.5))+…+(1+2^(0.5)+3^(0.5)+…+n^(0.5))

1 、题目 计算并输出 s=1+(1+2^(0.5))+(1+2^(0.5)+3^(0.5))+…+(1+2^(0.5)+3^(0.5)+…+n^(0.5)) 2、部分函数说明 C 库函数 double pow(double x, double y) 返回 x 的 y 次幂。 3、源代码实现 #include <stdio.h> #include <...

码莎拉蒂 4608

MyBatis拦截器(JDBC的执行流程、MyBatis执行流程、Mybatis拦截器)

JBDC的底层主要是三个接口对象,Connection、Statement、ResultSet。Connection用于建立与数据库的连接,Statement用于向数据库发送sql语句,ResultSet用于封装sql查询语句的结果。使用 Class.forName() 方法加载数据库驱动程序类。JDBC的底层其实是使用Socket进行连接数据库的。打开Connection .

qq_63242968的博客 1189

基于深度学习的活体人脸检测系统:YOLOv5、YOLOv6、YOLOv7、YOLOv8实现与UI界面设计

本博客详细介绍了如何基于YOLOv5、YOLOv6、YOLOv7、YOLOv8模型实现一个完整的活体人脸检测系统。系统包括数据集准备、模型训练、UI界面设计以及实时检测功能的实现。通过YOLO系列模型的应用,我们能够高效、准确地进行人脸检测和活体验证。未来,随着YOLOv9和其他新一代目标检测模型的出现,我们可以进一步提高检测精度和速度。此外,集成更多的传感器数据(如深度传感器、红外线传感器)可以使活体检测系统更加安全和稳定。

YOLO 540

MyBatis拦截器四种类型和自定义拦截器的使用流程

MyBatis拦截器四种类型和自定义拦截器的使用流程

相关项目可以查看https://gitee.com/fan-pl或https://github.com/fpl1116 6667

华为OD机试真题2026双机位C卷 Java&Go 实现【用户入网定期复评】

用户开立支付账户,在开户完成后立即对用户进行一次风险模型评级,输出一个评分风险,评分范围1-100,等区间的分为5个等级,1-19为等级1,20-39为等级2,40-59为等级3,60-79为等级4,80-100为等级5,系统每天会任务对全量入网用户进行计算复评时间,输出评分给出新的风险等级。复评规则如下:

MISAYAONE的博客 146

Prism 入门02,区域介绍

什么是区域(Region)?区域,在Prism 框架中,区域是模块化的核心的功能之一,其主要作用是降低应用程序和模块之间的耦合度。使用方式:在应用程序的界面中,划分出某块区域,并为这个区域定义一个唯一的区域名称。那么通过这个区域名称,应用程序就可以找到指定的区域。并为这个区域动态放置一些容器或控件,从而呈现在界面中。

build2024 1125

MyBatis拦截器使用方法

MyBatis可以做的工作:SQL修改分页操作数据过滤,SQL执行时间性能监控等。1.1. 核心对象从MyBatis代码实现的角度来看,MyBatis的主要的核心部件有以下几个::初始化基础配置,比如MyBatis的别名等,一些重要的类型对象,如插件,映射器,和对象,MyBatis所有的配置信息都维持在对象之中。SqlSession工厂。SqlSession:作为MyBatis工作的主要顶层API。

代码蒋的博客 1107

从 on_event 到 lifespan:FastAPI 生命周期管理的旧方法与新方法对比与迁移

从 on_event 到 lifespan:FastAPI 生命周期管理的旧方法与新方法对比与迁移

XiaoqiangClub的博客 1021

MyBatis执行流程,JDBC的执行流程,MyBatis拦截器,lastupdateby设置token里的花名

JBDC的底层主要是三个接口对象,Connection、Statement、ResultSet。Connection用于建立与数据库的连接,Statement用于向数据库发送sql语句,ResultSet用于封装sql查询语句的结果。

m0_74356429的博客 1046

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

面试题 --- jdbc执行流程、MyBatis执行流程、MyBatis拦截器配置流程

1. 注册驱动2. 创建数据库操作对象3. 执行sql语句4 .处理操作结果5 .关闭连接释放资源。

jyx_boy的博客 481

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

mybatis0120-mybatis拦截器执行流程-拦截器代理的实现

mybatis的拦截是通过jdk的动态代理实现的,代理了Executor对象,下面先捋一下Executor代理的流程。 1. Executor对象初始化 private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit)...

登峰小蚁 2580

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

mybatis0121-mybatis拦截器执行流程-代理对象的执行

1. MapperProxy的invoke(Object proxy, Method method, Object[] args)方法,也是jdk动态代理实现的,从mapper接口到sqlSession的跳跃 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { ...

登峰小蚁 2754

MyBatis拦截器

JBDC的底层主要是三个接口对象,Connection、Statement、ResultSet。Connection用于建立与数据库的连接,Statement用于向数据库发送sql语句,ResultSet用于封装sql查询语句的结果。

zhzjn的博客 1178

mybatis的拦截器的执行流程(以StatementHandler类型的拦截器为例)

1. 获取到dao层的动态代理对象org.apache.ibatis.binding.MapperProxy,并执行其invoke方法,该方法是入口 2. 执行org.apache.ibatis.binding.MapperMethod.execute() 3. 执行org.mybatis.spring.SqlSessionTemplate.selectList() 4. 通过动态代理的方式执行...

yf.z的专栏 3037

MyBatis拦截器执行流程!!!

2、在自定义拦截器上使用@Interceptors注解,在该注解中使用@Signature指定拦截的接口类型,方法名与参数类型。1、创建自定义拦截器,实现Interceptor接口,重写interceptor()方法。前提:将自定义的拦截器注入IOC容器。

qq_64847107的博客 645

MyBatis拦截器面试题

拦截的执行顺序是Executor执行器->StatementHandler语句->ParameterHandler参数->ResultHandler结果。(我的猜测:1执行器通过工厂执行Mapper类,,2.语句映射器处理mappe文件成对象,3把前端传过来的参数映射到对象里,4输出结果映射)

weixin_52449894的博客 460

Mybatis——执行流程及关键代码走读

由于做数据脱敏时,其中一个方案为使用Mybatis Interceptor,因此本篇介绍下Mybatis的执行流程,看下有哪些核心的类和方法,以及拦截器是如何切入SQL的执行流程的;

娜娜米的博客 2103

自定义 Mybatis 拦截器实现权限功能

将信息存储到 TreadLocalhost 中,方便后续修改sql的时候可以读取到需要修改的字段。- method:对应接口中的哪类方法(因为可能存在重载方法);Signature来指定咱们需要拦截那个类对象的哪个方法。- type:上述四种类型中的一种;- args:对应哪一个方法的入参;切面(AuthAspect)在所在接口上添加注解。

m0_63208096的博客 911

spring中mybatis的mapper注册和执行流程分析

MyBatis Mapper扫描与执行流程解析:Mapper扫描通过MapperScan或AutoConfiguredMapperScannerRegistrar启动,最终为每个Mapper接口注册MapperFactoryBean。实际调用时,MapperFactoryBean.getObject()触发动态代理流程,通过MapperProxy生成代理对象。SQL执行时,SqlSessionTemplate代理获取线程不安全的DefaultSqlSession,经过拦截器包装的Executor执行具体操作

偶是一只小小鸟~ 974

Mybatis源码(3)-查询执行流程

上文介绍了mapper的创建过程,mybatis通过动态代理的方式生成了代理,MapperProxy实现了InvocationHandler类。下文以查询流程为例,分析sql的执行过程。 MapperProxy: @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { try { if (Object.class.equals(method.g

闪电大王 1376

MyBatis的SQL执行流程:从SqlSession到Executor的调用链与缓存机制

MyBatis SQL执行流程与缓存机制解析 摘要:本文深入剖析MyBatis的SQL执行流程,从SqlSession.getMapper()到Executor的完整调用链。关键环节包括:MapperProxy动态代理拦截方法调用,MapperMethod封装SQL语句,Executor执行SQL并处理缓存。重点解析一级缓存(SqlSession级别)和二级缓存(Mapper级别)的实现机制与失效条件,并通过PageHelper分页插件示例展示拦截器修改SQL的原理。本文适合需要解决缓存失效、插件拦截等问题

huahua8088的博客 1001
上一篇: Kafka 顺序写,随机写,原理对比
vmaps
博客等级 码龄17年 424粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值