百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

MyBatis 插件原理与实战(mybatipse插件下载)

ztj100 2025-04-30 21:20 20 浏览 0 评论

文章导读

MyBatis 插件原理与实战

什么是插件?

插件就是在具体的执行流程插一脚(触发点、拦截器)来实现具体的功能。

一般插件会对执行流程中的上下文有依赖,抽象的说,我们也可以把MyBatis看作是JDBC的插件,只是功能越来来多,越来越强大,最后我们给了他一个新名字,叫做框架

不管怎样,JDBC的那一套还是不会变的,只是做了抽象、封装、归类等。

要想知道插件的原理,首先就要对它的执行流程有一定的把控。

执行流程

前边我们讲到,MyBatis是对JDBC的抽象、封装。

我们首先来回顾一下JDBC的执行流程。

JDBC执行流程

  1. 注册驱动;
  2. 获取Connection连接;
  3. 执行预编译;
  4. 执行SQL;
  5. 封装结果集;
  6. 释放资源;

给段伪代码通透理解下:

// 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取链接
Connection con = DriverManager.getConnection(url, username, password);
// 执行预编译
Statement stmt = con.createStatement();
// 执行SQL
ResultSet rs = stmt.executeQuery("SELECT * FROM ...");
// 封装结果
while (rs.next()) {
  String name = rs.getString("name");
  String pass = rs.getString(1); // 此方法比较高效
}
// 释放资源
if (rs != null) {  // 关闭记录集

}
if (stmt != null) {  // 关闭声明

}
if (conn != null) { // 关闭连接对象

}

上边的代码是不是很熟悉,我相信每个入门写Java代码的人,都写过这段代码。

紧接着,我们继续来了解MyBatis的执行流程。

MyBatis执行流程

  1. 读取MyBatis的核心配置文件;
  2. 加载映射文件;
  3. 构造会话工厂获取SqlSessionFactory;
  4. 创建会话对象SqlSession;
  5. Executor执行器;
  6. MappedStatement对象;
  7. 输入参数映射;
  8. 封装结果集;

上边的文字可能不太好理解,我这里也画一幅执行流程图,来方便理解。

MyBatis执行流程

有没有觉得MyBatis的执行流程和JDBC的执行流程主干也差不多,只是在主干过程中,把一些配置(mybatis-config.xml)、常用的定义文件单独抽离出来(mapper.xml)和一些附带扩展性的拦截点抽离了出来。

下面着重讲一讲我们的拦截点,因为插件就是基于我们的拦截点来做的扩展。

拦截点

结合上边的MyBatis执行流程,看下图的各个拦截点:

MyBatis拦截点

文字描述,MyBatis允许使用插件来拦截的方法调用包括:

  1. Executor:拦截执行器的方法 (update, query, flushStatements, commit, rollback,getTransaction, close, isClosed),Mybatis的内部执行器,它负责调用StatementHandler操作数据库,并把结果集通过 ResultSetHandler进行自动映射,另外,他还处理了二级缓存的操作。从这里可以看出,我们也是可以通过插件来实现自定义的二级缓存的;
  2. ParameterHandler:拦截参数的处理 (getParameterObject, setParameters) ,Mybatis直接和数据库执行sql脚本的对象。另外它也实现了Mybatis的一级缓存。这里,我们可以使用插件来实现对一级缓存的操作(禁用等等);
  3. ResultSetHandler:拦截结果集的处理 (handleResultSets, handleOutputParameters) ,Mybatis实现Sql入参设置的对象。插件可以改变我们Sql的参数默认设置;
  4. StatementHandler:拦截Sql语法构建的处理 (prepare, parameterize, batch, update, query) ,Mybatis把ResultSet集合映射成POJO的接口对象。我们可以定义插件对Mybatis的结果集自动映射进行修改。

拦截器为什么能够拦截

org.apache.ibatis.session.Configuration是在MyBatis初始化配置的类。

其中的newParameterHandlernewResultSetHandlernewStatementHandlernewExecutor这几个方法在创建指定的对象(newParameterHandler创建ParameterHandler、newResultSetHandler创建ResultSetHandler、newStatementHandler创建StatementHandler、newExecutor创建Executor)对象的时候,都会调用一个统一的方法:

创建对象

这4个方法实例化了对应的对象之后,都会调用interceptorChain的pluginAll方法,那么下面我们在来看pluginAll干了什么。

包路径:org.apache.ibatis.plugin.InterceptorChain

public Object pluginAll(Object target) {
        Interceptor interceptor;
        for(Iterator var2 = this.interceptors.iterator(); var2.hasNext(); target = interceptor.plugin(target)) {
            interceptor = (Interceptor)var2.next();
        }

        return target;
    }

原来这个pluginAll方法就是遍历所有的拦截器,然后顺序执行我们插件的plugin方法,一层一层返回我们原对象(Executor/ParameterHandler/ResultSetHander/StatementHandler)的代理对象。当我们调用四大接口对象的方法时候,实际上是调用代理对象的响应方法,代理对象又会调用四大接口对象的实例。

这里我们看到所有的拦截器Interceptor,其实它和我们平常写代码一样,也是多态的利用,存在一个拦截器Interceptor接口,我们在实现插件的时候,也实现这个接口,就会被调用。

Interceptor接口

包路径:org.apache.ibatis.plugin

public interface Interceptor {
    Object intercept(Invocation var1) throws Throwable;

    default Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    default void setProperties(Properties properties) {
    }
}

这个接口只声明了三个方法:

  1. setProperties方法是在Mybatis进行配置插件的时候可以配置自定义相关属性,即:接口实现对象的参数配置;
  2. plugin方法是插件用于封装目标对象的,通过该方法我们可以返回目标对象本身,也可以返回一个它的代理,可以决定是否要进行拦截进而决定要返回一个什么样的目标对象,官方提供了示例:return Plugin.wrap(target, this);
  3. intercept方法就是要进行拦截的时候要执行的方法;

编写简单的MyBatis插件

注:MyBatis默认没有一个拦截器接口的实现类,开发者可以实现符合自己需求的拦截器

@Intercepts({@Signature(type= Executor.class, method = "update", args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
    public Object intercept(Invocation invocation) throws Throwable {
        return invocation.proceed();
    }
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }
    public void setProperties(Properties properties) {
    }
}

全局xml配置(实例化bean)

<plugins>
<plugin interceptor="org.format.mybatis.cache.interceptor.ExamplePlugin"></plugin>
</plugins>

这个拦截器拦截Executor接口的update方法(其实也就是SqlSession的新增,删除,修改操作),所有执行executor的update方法都会被该拦截器拦截到,就在里边做相对应的逻辑处理就可以了。

总结

今天这篇文章到这里结束了,讲解了什么是插件首先需要了解执行流程,然后回顾我们的JDBC流程来推导出MyBatis的执行流程,通过初始化的org.apache.ibatis.session.Configuration为切入点,跟踪到interceptorChain的pluginAll方法;最后通过一个简单的插件来实操了一波。

原文链接:
https://mp.weixin.qq.com/s/wHYwJbalxTk44_IQJyv7mw

相关推荐

30天学会Python编程:16. Python常用标准库使用教程

16.1collections模块16.1.1高级数据结构16.1.2示例...

强烈推荐!Python 这个宝藏库 re 正则匹配

Python的re模块(RegularExpression正则表达式)提供各种正则表达式的匹配操作。...

Python爬虫中正则表达式的用法,只讲如何应用,不讲原理

Python爬虫:正则的用法(非原理)。大家好,这节课给大家讲正则的实际用法,不讲原理,通俗易懂的讲如何用正则抓取内容。·导入re库,这里是需要从html这段字符串中提取出中间的那几个文字。实例一个对...

Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)

实现功能:Python数据分析实战-利用正则表达式提取文本中的URL网址和邮箱...

python爬虫教程之爬取当当网 Top 500 本五星好评书籍

我们使用requests和re来写一个爬虫作为一个爱看书的你(说的跟真的似的)怎么能发现好书呢?所以我们爬取当当网的前500本好五星评书籍怎么样?ok接下来就是学习python的正确姿...

深入理解re模块:Python中的正则表达式神器解析

在Python中,"re"是一个强大的模块,用于处理正则表达式(regularexpressions)。正则表达式是一种强大的文本模式匹配工具,用于在字符串中查找、替换或提取特定模式...

如何使用正则表达式和 Python 匹配不以模式开头的字符串

需要在Python中使用正则表达式来匹配不以给定模式开头的字符串吗?如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https开始的字符串。r"^(?!https).*&...

先Mark后用!8分钟读懂 Python 性能优化

从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...

Python“三步”即可爬取,毋庸置疑

声明:本实例仅供学习,切忌遵守robots协议,请不要使用多线程等方式频繁访问网站。#第一步导入模块importreimportrequests#第二步获取你想爬取的网页地址,发送请求,获取网页内...

简单学Python——re库(正则表达式)2(split、findall、和sub)

1、split():分割字符串,返回列表语法:re.split('分隔符','目标字符串')例如:importrere.split(',','...

Lavazza拉瓦萨再度牵手上海大师赛

阅读此文前,麻烦您点击一下“关注”,方便您进行讨论和分享。Lavazza拉瓦萨再度牵手上海大师赛标题:2024上海大师赛:网球与咖啡的浪漫邂逅在2024年的上海劳力士大师赛上,拉瓦萨咖啡再次成为官...

ArkUI-X构建Android平台AAR及使用

本教程主要讲述如何利用ArkUI-XSDK完成AndroidAAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:1.跨平台Library工程开发介绍...

Deepseek写歌详细教程(怎样用deepseek写歌功能)

以下为结合DeepSeek及相关工具实现AI写歌的详细教程,涵盖作词、作曲、演唱全流程:一、核心流程三步法1.AI生成歌词-打开DeepSeek(网页/APP/API),使用结构化提示词生成歌词:...

“AI说唱解说影视”走红,“零基础入行”靠谱吗?本报记者实测

“手里翻找冻鱼,精心的布局;老漠却不言语,脸上带笑意……”《狂飙》剧情被写成歌词,再配上“科目三”背景音乐的演唱,这段1分钟30秒的视频受到了无数网友的点赞。最近一段时间随着AI技术的发展,说唱解说影...

AI音乐制作神器揭秘!3款工具让你秒变高手

在音乐创作的领域里,每个人都有一颗想要成为大师的心。但是面对复杂的乐理知识和繁复的制作过程,许多人的热情被一点点消磨。...

取消回复欢迎 发表评论: