Mybatis Plugins学习

1、是什么?

mybatis plugin 是一种拦截机制,它允许在特定对象的方法执行之前进行拦截处理,来实现特定的处理功能。

2、用途

  1. 性能监控和日志记录:你可以使用插件来记录SQL执行的时间,以及执行结果,这对于性能调优和问题调试都非常有帮助。MyBatis的插件API非常简单,可以轻松实现这种功能。

  2. 数据加密解密:MyBatis插件可以用来实现数据加密和解密,以保护敏感数据的安全性和完整性。通过插件,可以在数据存储、传输或使用过程中对数据进行加密和解密操作,从而实现数据的保护。

  3. 分页和字段统一赋值: 可以实现自己的分页逻辑以及特殊字段(创建时间、创建人)填充等。

3、使用

MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

  • ParameterHandler (getParameterObject, setParameters)

  • ResultSetHandler (handleResultSets, handleOutputParameters)

  • StatementHandler (prepare, parameterize, batch, update, query)

通过 MyBatis 提供的强大机制,使用插件是非常简单的,只需实现 Interceptor 接口,并指定想要拦截的方法签名即可。

// ExamplePlugin.java
@Intercepts({@Signature(
  type= Executor.class,
  method = "update",
  args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
  private Properties properties = new Properties();
  public Object intercept(Invocation invocation) throws Throwable {
    // implement pre processing if need
    Object returnObject = invocation.proceed();
    // implement post processing if need
    return returnObject;
  }
  public void setProperties(Properties properties) {
    this.properties = properties;
  }
}
<!-- mybatis-config.xml -->
<plugins>
  <plugin interceptor="org.mybatis.example.ExamplePlugin">
    <property name="someProperty" value="100"/>
  </plugin>
</plugins>

4、拦截原理

通过配置可以知道,在plugins中去配置我们的拦截器,会被解析到configarution对象中去

解析元素到configarution中去,最终保存到interceptorChain拦截链中

InterceptorChain结构

但是,保存之后如何实现对四大对象的拦截呢?

从最基础的mybatis案列开始,获取mapper

经过代理之后执行到查询selectOne()

一直调用下去到doQuery,在这里对我们的statementhandler进行代理拦截

创建RoutingStatementHandler对象的构造函数中会去创建ParameterHandler,ResultSetHandler的代理拦截

调用其父类构造,其中会创建我们的parameterHandler、resultSetHandler

找到了创建的位置后,以其中一个statementhandler为例,看看如何代理,如何拦截。

主要步骤就是循环interceptors,每一个拦截器代理会经历plugin.wrap判断是否代理

1.获取signatureMap

2.获取代理的目标类,即四大对象

3.获取目标类的接口,判断是否在interceptors中声明,如果匹配到目标接口则进行代理。

 回到我们定义的Interceptor实现,每一个@Signature代表我们要拦截的对象接口方法,比如第一个意思代表StatementHandler的query方法,参数是Statement.class、ResultHandler.class类型

调用interceptorChain.pluginAll(statementHandler) 循环嵌套代理,将代理后的类又赋值给target再次代理。

Plugins.wrap实现

获取签名集合,即定义的四个@Signature

 最终解析出StatementHandler.class的(query、update、batch)和Executor.class的(query)方法与我们定义的相同

解析完成后,还需要判断当前的target的接口是否属于其中的一个接口

获取目标类接口

判断是否在signatureMap,如果在,则将接口添加进来,根据匹配的接口数量来判断是否代理。采用JDK动态代理,Plugin为处理器

后续对StatementHandler的所有方法都会执行我们Plugin的invoke方法

从 signatureMap中获取相应对象的方法,如果不为null并且匹配当前方法,则interceptor.intercept,

将目标对象和当前方法包装为 new Invocation(target, method, args)

 最后来到了我们的拦截方法,最后如果是嵌套的代理一定要调用invocation.proceed();这样才会进入到我们的下一个Plugin的invoke()方法

补充:

Executor的代理在openSqlSession的时候

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: IDE致命错误是指在使用IDE(集成开发环境)过程中遇到的无法解决或无法继续下去的严重问题。MyBatis是一个流行的Java持久化框架,它提供了许多插件来增强其功能。 这样的问题通常由以下几个方面引起: 1. 插件版本不匹配:MyBatis框架和其插件通常有着特定的版本要求,如果使用了不兼容的插件版本,就会出现致命错误。解决这个问题的方法是查阅官方文档,确定所使用的MyBatis和插件版本之间的兼容性。 2. 依赖冲突:IDE通常会自动管理项目的依赖关系,但有时候会发生依赖冲突,即多个插件引用了同一个库的不同版本。这可能会导致编译错误或运行时异常。解决这个问题的方法是查看项目的依赖树,找到冲突的依赖项并进行调整。 3. 配置错误:插件通常需要在MyBatis的配置文件中进行相应的配置。如果配置错误或遗漏了必要的配置,就会导致致命错误。解决这个问题的方法是仔细检查配置文件,确保所有插件的配置正确无误。 4. 资源不可用:有些插件可能需要额外的资源或库来正常运行。如果这些资源或库不可用,就会导致致命错误。解决这个问题的方法是确保所需的资源或库已正确安装或配置,并且可以从项目中正常访问。 综上所述,解决IDE致命错误的问题需要仔细检查插件版本、依赖关系、配置文件和所需资源,以确认是否存在错误或缺失。在确保这些方面无误后,通常可以解决此类错误。 ### 回答2: 当在使用MyBatis插件时,经常会遇到"IDE Fatal Errors"的错误。这种错误通常发生在IDE(集成开发环境)中,而不是在MyBatis插件本身。IDE Fatal Errors指的是一些严重的错误,导致IDE崩溃或无法正常工作。 有几种可能导致IDE Fatal Errors的原因,比如使用了不兼容的插件版本、IDE配置错误、内存不足等。为了解决这个问题,我们可以尝试以下几个步骤: 1. 确保安装的MyBatis插件版本与当前使用的IDE兼容。查看插件的官方文档,了解与IDE的兼容性要求,并确保下载和安装最新版本的插件。 2. 检查IDE的配置,确保已正确配置插件。有时候,IDE的配置可能会出错或与插件冲突。重新审查插件的配置并进行必要的更改,以确保它们与IDE的其他配置相匹配。 3. 增加IDE的内存限制。IDE使用的内存可能会受到限制,导致运行MyBatis插件时出现故障。可以尝试增加IDE的可用内存限制,以提高插件的运行效果。 4. 如果以上步骤都没有解决问题,可以尝试禁用或卸载其他可能与MyBatis插件冲突的插件。有时,多个插件同时运行可能会导致冲突,从而导致IDE Fatal Errors的发生。 总之,IDE Fatal Errors在使用MyBatis插件时可能会发生,但通常是由于IDE本身的问题。通过确保插件与IDE兼容、配置插件正确、增加内存限制、禁用冲突插件等步骤,我们可以尝试解决这些问题,并使MyBatis插件在IDE中正常工作。 ### 回答3: IDE致命错误释放了MyBatis插件。 IDE(集成开发环境)是程序员用来开发、测试和调试代码的软件工具。它提供了一个集成的开发环境,使开发者能够在一个地方编写、编辑和管理代码。然而,有时IDE可能会遇到致命错误,这可能会导致程序崩溃或无法正常工作。 MyBatis是一个开源的持久化框架,它简化了数据库访问的过程,使开发者能够更容易地与数据库进行交互。MyBatis插件是在IDE中使用的一种扩展,它提供了与MyBatis框架集成的功能,以便开发者可以更方便地使用MyBatis进行数据库操作。 当IDE遇到致命错误时,它可能会释放MyBatis插件,这意味着插件将被卸载或禁用。这样做是为了确保IDE能够继续正常工作,而不受插件可能引起的问题影响。 可能的原因是,MyBatis插件可能与IDE的某些功能冲突,导致IDE出现致命错误。为了解决这个问题,释放插件可能是临时的解决方案,以使IDE能够继续运行。然而,这也意味着开发者将无法使用MyBatis插件提供的功能。 为了解决这个问题,开发者需要确定造成致命错误的具体原因,并尝试修复该问题。这可能涉及到升级IDE、更新插件或查找并解决冲突。 总之,当IDE遇到致命错误时,释放MyBatis插件可能是一种临时解决方案,以确保IDE能够继续正常工作。然而,为了恢复MyBatis插件的功能,开发者需要找出致命错误的原因,然后采取适当的措施来解决该问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值