【Java】Mybatis工作流程和插件开发

深入探究 Java 领域 MyBatis 的核心原理 MyBatis整体架构设计SQL映射机制实现原理缓存系统工作原理插件扩展机制动态SQL生成过程本文将从MyBatis的基础概念入手,逐步深入到核心实现原理,最后通过实际案例展示如何应用这些原理解决实际问题。文章包含大量源码分析和架构图解,帮助读者建立完整的知识体系。ORM:对象关系映射(Object-Relational Mapping),将数据库表与Java对象建立映射关系SqlSession:MyBatis的核心接口,提供了执行SQL命令、获取映射器和管理事务的方法Mapper。 阅读详情

在了解插件开发之前,我们先总体的来梳理一下Mybatis的大致执行流程:

1.new SqlSessionFactoryBuilder().build(inputStream) 

先根据配置文件(包含了全局配置文件和映射配置文件)初始化一个对象Configuration(这里对象里包含了所有配置文件里的标签信息,这里包含的每个MappedStatement对象就代表一个增删改查的标签),然后在将这个对象传入buile方法build(configuration),返回一个DefaultSqlSessionFactory对象实例(它是接口SqlSessionFactory的实现类)。

2.sqlSessionFactory.openSession()

实际上是DefaultSqlSessionFactory对象实例调用openSessionFromDataSource,根据session(执行器类型)和全局变量的设置。

创建一个Executor(它是执行sql查询语句的):

最后返回对象DefaultSqlSession(configuration(所有配置信息),executor(执行sql的执行器), autoCommit); 

3.DefaultSqlSession.getMapper()

获取到对应的Mapper接口的代理对象,MapperProxy(代理对象),这个代理对象里包含有Mapper接口里的所有方法以及和数据库之间的会话DefaultSqlSession对象,而这个对象又包含:对象DefaultSqlSession(configuration(所有配置信息), executor(执行sql的执行器), autoCommit);

4.userMapper.selectByPrimaryKey(1)

执行增删改查方法

这里将接口方法转换为MapperMethod,然后调用executor对象执行增删改查的操作

②执行增删改查的过程中Executor会创建StatementHandler对象和ParameterHandler、ResultSetHandler对象

③调用StatementHandler执行sql语句,调用ParameterHandler通过typeHandler设置sql语句中的参数,调用ResultSetHandler通过typeHandler封装sql语句查询出来的结果集

在Mybatis执行流程中涉及四个关键的对象Executor,StatementHandler,ParameterHandler,ResultSetHandler,了解一个与插件开发有关的重要的信息:这四个对象在创建完成返回之前,都会被一个方法过滤一遍的代码:intercepterChain.pluginAll(xxxxHandler/Executor);

上述的方法源码

 /** 
  * 每一个拦截器对目标类都进行一次代理 
  * @paramtarget 
  * @return 层层代理后的对象 
  */  
 public Object  pluginAll(Object target) {  
     for(Interceptor interceptor : interceptors) {  
         target= interceptor.plugin(target);  
     }  
     return target;  
} 

很明显,四大对象在创建返回之前,被一组过滤器逐一的拦截过滤了一遍,这个拦截器类型的接口Interceptor就是插件要实现的接口。所以说,我们开发插件的本质其实就是(AOP面向切面编程思想的一个切面),在四大对象返回之前,我们可以对它拦截后创建一个代理对象,对原对象进行封装,加工,增加我们想要的各种功能,然后用代理对象替换掉原对象。这就是Mybatis插件的本质。 

 

 

深入探索MyBatis中的插件开发 在前文中,我已经提到了 MyBatis 插件,它是 MyBatis 框架的一个重要特性,可以实现 MyBatis 的功能扩展。Executor 接口插件: 对 MyBatis 执行器进行拦截、修改 SQL 和执行结果的扩展点;ParameterHandler 插件: 对 SQL 参数处理过程进行拦截并对参数进行加工处理;ResultHandler 插件: 对 SQL 执行结果进行拦截并对其进行加工处理;StatementHandler 插件: 对 MyBatis 操作数据库相关语句的拦截; 阅读详情

相关推荐

Java 领域的 MyBatis 插件开发指南

MyBatis 是一款优秀的持久层框架,它简化了数据库操作,但在某些特定场景下,可能无法满足开发者的个性化需求。MyBatis 插件开发的目的就是为了扩展 MyBatis 的功能,允许开发者在 SQL 执行的不同阶段插入自定义逻辑。本指南的范围涵盖了 MyBatis 插件开发的基础知识、核心原理、开发步骤、实际应用场景以及相关资源推荐,旨在帮助开发者全面掌握 MyBatis 插件开发的技能。本文将按照以下结构进行组织:首先介绍 MyBatis 插件开发的背景知识,包括目的、读者对象和文档结构。

AI开发架构师 923

mybatis插件的执行顺序

原理 mybatis插件类型 plugins MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括: Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) ParameterHandler (getParameterObject, setParameters) ResultSetHandler (ha

dark 2550

MyBatis框架深入解析与实战指导

本文还有配套的精品资源,点击获取 简介:MyBatis是一个流行的Java持久层框架,简化了数据库交互,并提供SQL映射和对象关系映射功能。本文将探讨MyBatis的基本概念、核心组件和数据操作的使用方法。从MyBatis简介、核心组件、工作流程到主要特性,再到工具使用和实战操作,本文内容详尽,旨在帮助开发者深入理解和应用MyBatis。 1. MyBatis框架...

weixin_33173126的博客 421

Mybatis工作流程和插件开发

获取到对应的Mapper接口的代理对象,MapperProxy(代理对象),这个代理对象里包含有Mapper接口里的所有方法以及和数据库之间的会话DefaultSqlSession对象,而这个对象又包含:对象DefaultSqlSession(configuration(所有配置信息), executor(执行sql的执行器), autoCommit);:先根据配置文件(包含了全局配置文件和映射配置文件)初始化一个对象Configuration(这里对象里包含了所有配置文件里的标签信息,这里包含的每个。

只恨天高的博客 915

高效开发的IDEA MyBatis插件使用教程

本文还有配套的精品资源,点击获取 简介:IntelliJ IDEA中的free-idea-mybatis-2 . *. .*插件针对MyBatis框架优化了开发者体验,通过快速跳转和自动提示等功能提高开发效率。本文详细介绍了插件的使用方法及其在大型项目中的应用优势。 1. IntelliJ IDEA与MyBatis集成概述 1...

weixin_31185473的博客 2725

用LT1166+MOS管打造实验室级恒流源:闭环反馈与推挽驱动的深度调优

本文详细介绍了基于LT1166电流模式控制器与MOS管推挽架构的实验室级恒流源设计方法。通过闭环反馈调优和动态响应优化,实现带宽达100kHz、纹波低于0.1%的高性能恒流输出,适用于精密仪器校准和半导体测试等场景。重点解析了系统架构设计、MOS管选型策略以及频率响应测试等关键技术要点。

weixin_29290379的博客 208

Mybatis操作数据库执行流程的先后顺序是怎样的?

SqlSession 内部通过执行器Executor 操作数据库,执行器将待处理的SQL.信息封装到MappelStatement对象中,MappedlStatement对象中存储了要映射的SQL.语句的id、参数等。对于MyBatis的工作原理和操作流程的理解,我们先来看下面的工作流程图。会话对象本身不能直接操作数据库,MyBanis底层定义了一个Executor接口用于操作数据库,执行器会根据SqlSessinn传递的参数动态的生成需要执行的SQL.语句,同时负责查询缓存地维护。(6)封装SQL信息。

CZ-001的博客 1053

Arduino Uno R3开发板系列学习教程(番外篇:USB驱动安装与疑难排解)

本文详细介绍了Arduino Uno R3开发板USB驱动安装与疑难排解的完整指南,特别针对国产克隆版常见的CH340驱动问题提供解决方案。从识别开发板类型到Windows/Mac系统驱动安装步骤,再到常见问题排查与高级排错技巧,帮助开发者快速解决连接问题,确保程序烧录顺利进行。

weixin_29182481的博客 587

mybatis多个plugins的执行顺序

一、前言    在mybatis官网中,有插件一说  mybatis plugins . 如果同时有多个插件,那么他们的执行顺序是怎样的?   二、准备工作、代码准备 1、 项目结构 2、TestDAO public interface TestDAO { Test selectById(Integer id); default void testDefau...

子衿_青青的博客 9802

智能网联汽车云控系统核心解析:车云数据交互协议设计与实践

本文深入解析了智能网联汽车云控系统的核心——车云数据交互协议的设计与实践。文章围绕“说什么”、“怎么说”及异常处理三大核心问题,详细阐述了二进制与结构体数据类型定义、TCP/UDP双通道传输机制、通用报文格式以及典型交互流程(如GLOSA车速引导),并分享了时间同步、坐标系定义等关键实战经验与避坑指南,为构建高效、可靠、安全的车云“神经系统”提供专业指导。

alice7model的博客 122

​开源大模型实战:GLM-4.1V-Thinking本地部署教程(附API调用代码)

​在AI应用从“能用”向“好用”进阶的当下,​的需求愈发强烈:企业需保障数据安全(如医疗影像、金融报告不外传),开发者追求定制化能力(如微调模型适配垂直场景),科研团队则依赖离线环境处理敏感数据。智谱AI开源的​(10B级参数,支持图像、视频、文档多模态推理)凭借的优势,成为本地部署的热门选择。不过,对于“不想折腾技术”的普通用户或快速验证需求的团队而言,​,无需安装配置,打开即用,堪称“零门槛”体验的捷径。本文将分为两部分:先手把手教你​(适合有技术背景的用户),再对比介绍。

gogoMark的博客 1341

Mybatis总体执行流程

梳理mybatis的总体流程

qiuxinfa123的博客 2266

Amesim管路仿真进阶:如何用阻力管实现不规则管路的高精度模拟

本文深入探讨了在Amesim仿真中,如何利用阻力管(Orifice with Table)元件,特别是TFORT0子模型,实现对不规则管路的高精度模拟。通过直接输入基于测试或CFD的流量-压降数据,该方法能有效弥补标准管路模型在复杂流道、内部结构复杂等场景下的不足,为液压、热管理等系统仿真提供精准可靠的部件模型。

cicd6pipeline的博客 671

idea 好用的插件_java开发者必备idea酷炫插件第二弹

IDEA已经成为了绝大多数java开发者的首选开发工具,丰富好用的插件能大大提升我们的工作效率。前文每一个Javaer都应该知道的Idea插件已经为我们介绍了一批好用的插件。今天我们继续为大家介绍一批新的酷炫好用的插件1.Grep console自定义日志显示样式2.Free Mybatis plugin让你可以像编辑java代码一样编辑mybatis的xml文件,并且提供更好的展示效果,帮助你...

weixin_39635567的博客 194

Temporal Noise Reduction(TNR)时序去噪技术解析:原理、平台实践与工程调优路径

随着高画质夜景拍照和高清视频拍摄需求的持续增长,图像传感器在低照度环境下输出信号的噪声问题日益突出。相比空间域降噪(SNR),时序去噪(Temporal Noise Reduction, TNR)利用帧间信息进行融合处理,具备更高的信噪比提升效率及更强的边缘保护能力,已成为移动影像ISP链路中的核心环节。本文系统剖析TNR的算法原理、平台实现机制与工程调试路径,并基于实际开发案例分析其在不同场景下的效果差异及调优方法,为工程师提供从理论到实操的完整路径参考。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3206

Cesium 实战 19 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型

Cesium 实战 - 使用 gltf-vscode 查看、预览以及编辑 glTF 和 GLB 模型。

非科班Java出身GISer的博客 6436

【MyBatis 六】类型处理器&对象工厂&数据库提供商配置&插件

一、类型处理器 我们先来看一段JDBC的程序,下面是一个通过用户名获取User对象的方法。 首先进行sql语句的预编译,然后利用PrepareStatement对象填充了占位符(setString方法) 执行sql语句得到结果集ResultSet对象,利用该对象获取Java类型的变量值,并将变量值封装进User对象中返回。 public static User getUserByName(String name) { Connection conn = null; Resul

风继续吹 402

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MyBatis的工作流程是怎样的?

MyBatis的工作流程是怎样的?

java1234的博客 1302

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

MyBatis 插件开发实战

MyBatis插件开发实战

774

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

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

Java面试-MyBatis 插件机制与拦截器开发

我想知道每条 SQL 执行了多久,MyBatis 能告诉我吗?当然能!MyBatis 提供了强大的插件机制(Plugin),让你可以在不修改源码的情况下,拦截并增强MyBatis 的核心流程。这就像给你的 SQL 装上了“监控摄像头”和“滤镜”,想看就看,想改就改。今天,我们就来深入 MyBatis 插件的“黑科技”,看看如何开发自己的拦截器。准备好了吗?我们出发!🔧🔍一种AOP(面向切面编程)机制允许你在 MyBatis 执行流程的关键节点插入自定义逻辑基于JDK 动态代理实现组件。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Mybatis学习(三):Mybatis注解开发、缓存使用和插件使用的深度分析

Mybatis学习(三):Mybatis注解开发、缓存使用和插件使用的深度分析讲解前言一、Mybatis传统XML配置开发1.1 一对一查询1.2 一对多查询1.3 多对多查询二、Mybatis注解开发2.1 Mybatis注解2.2 Mybatis的CRUD之注解开发2.3 一对一查询之注解开发2.4 一对多查询之注解开发2.5 多对多查询之注解开发三、Mybatis缓存3.1 一级缓存3.2 二级缓存四、Mybatis插件4.1 Mybatis插件简介4.2 Mybatis插件原理4.3 自定义Myba

RabbitInTheGrass的博客 3096

Java 框架 Mybatis 中Plugins(插件)开发指南

mybatis.的 plugins

tumu6889的博客 1941

MyBatis 插件开发的完整详细例子

MyBatis 插件开发的完整详细例子

爱的叹息的专栏 1126

MyBatis的扩展和插件开发示例

1.背景介绍 MyBatis是一款非常流行的Java持久化框架,它可以简化数据库操作,提高开发效率。在实际项目中,我们经常需要对MyBatis进行扩展和定制,以满足特定的需求。这篇文章将介绍MyBatis的扩展和插件开发示例,帮助读者更好地理解和应用这些技术。 1. 背景介绍 MyBatis是一款基于Java的持久化框架,它可以简化数据库操作,提高开发效率。MyBatis的核心功能包括:SQ...

AI天才研究院 961

MyBatis 教程 - MyBatis插件(Plugins)开发

MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括: Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) ParameterHandler (getParameterObject, setP

Ricky 3万+
上一篇: Mybatis和Spring、SpringMVC的整合
下一篇: 35.编写一个简单的Mybatis插件
synchronizeOn
博客等级 码龄3年 1193粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值