Skip to content

MyBatis篇

一些不注意的标签

如何避免SQL注入

映射处理

Mybatis都有哪些Executor执行器?它们之间的区别是什么?

Mybatis是否可以映射Enum枚举类?

用的时候了解一下就行

mybatis和数据库交互的原理?【重点】

MyBatis分页原理

mybatis 中#{}、${}的区别?

Mybatis的一级缓存

Mybatis的二级缓存

MyBatis的paramtertype为什么可以写简称?

Mybatis自带连接池都有什么?

mybatis 使用的时候 mapper 为什么也是接口形式的?

MyBatis的插件能够在哪些地方进行拦截?

MyBatis的插件(Interceptor)可以在MyBatis执行的各个阶段进行拦截和干预,常见的拦截点包括:

  1. Executor:拦截Executor的执行过程,包括update、query、flushStatements等方法的执行。
  2. StatementHandler:拦截StatementHandler的SQL语句生成过程,包括prepare、parameterize、batch等方法的执行。
  3. ParameterHandler:拦截ParameterHandler的参数处理过程,包括getParameterObject、setParameter等方法的执行。
  4. ResultSetHandler:拦截ResultSetHandler的结果集处理过程,包括handleResultSets、handleOutputParameters等方法的执行。

插件可以在上述阶段进行拦截并自定义处理逻辑,例如:

  • 在SQL执行之前或之后记录日志;
  • 在SQL执行之前动态修改SQL语句或参数;
  • 在SQL执行之后对结果进行特殊处理;
  • 在异常发生时进行处理等。

通过实现Interceptor接口并在MyBatis的配置文件中注册插件,可以方便地扩展MyBatis的功能,满足各种特定需求。插件的使用使得MyBatis具有了更强大的灵活性和扩展性。

如何编写一个MyBatis插件?

要编写一个自定义的MyBatis插件,您需要遵循以下步骤:

  1. 创建插件类:首先创建一个类,实现MyBatis的Interceptor接口。这个接口定义了插件的拦截方法,您需要在这些方法中编写您的自定义逻辑。

    java
    import org.apache.ibatis.executor.Executor; 
    import org.apache.ibatis.mapping.MappedStatement;
    import org.apache.ibatis.plugin.*; 
    import java.util.Properties;
    @Intercepts({   
        @Signature(type = Executor.class, method = "update", 
                   args = {MappedStatement.class, Object.class}) }) 
    public class MyPlugin implements Interceptor { 
        @Override   
        public Object intercept(Invocation invocation) throws Throwable {
            // 在这里编写您的自定义拦截逻辑 
            return invocation.proceed(); // 继续执行原方法 
        }    
        
        @Override    
        public Object plugin(Object target) { 
            return Plugin.wrap(target, this); // 包装目标对象并返回 
        }     
        
        @Override   
        public void setProperties(Properties properties) {
            // 设置插件的属性,如果有的话 
        } 
    }
  2. 配置插件:在MyBatis的配置文件(如mybatis-config.xml)中,配置您的插件。

    xml
     <plugins>    
         <plugin interceptor="com.example.MyPlugin">       
         </plugin>
     </plugins>
  3. 注册插件:如果您使用Spring或其他依赖注入框架,您也可以通过Java代码注册插件。

    java
     import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    @Configuration 
    public class MyBatisConfig {  
        @Bean  
        public MyPlugin myPlugin() {  
            return new MyPlugin();  
        } 
    }

在插件类的intercept方法中,您可以编写自定义的拦截逻辑,例如记录日志、性能监控、权限控制等。在插件类的plugin方法中,将目标对象包装成代理对象,并返回,以实现拦截功能。通过这种方式,您可以方便地扩展MyBatis的功能,满足特定的需求。

简述 Mybatis 的插件运行原理

MyBatis的插件运行原理主要基于动态代理和责任链模式,以下是其简要描述:

  1. 动态代理:MyBatis使用JDK动态代理或者CGLIB动态代理为被拦截的对象生成代理对象。这个代理对象实现了被拦截接口或者继承了被拦截类,并且在方法调用时会调用插件的拦截逻辑
  2. 责任链模式:MyBatis的插件实际上是一个责任链,每个插件都可以在目标方法执行之前、之后或者替换目标方法执行前后添加自定义逻辑。这些插件按照配置的顺序形成一条执行链,在方法调用时按照顺序依次执行

具体来说,插件的运行原理如下:

  • 当MyBatis执行一个方法时,首先会调用代理对象的方法,而不是被拦截对象的方法。
  • 代理对象的方法会根据配置的插件执行链依次调用每个插件的intercept方法
  • 在intercept方法中,插件可以自定义拦截逻辑,并且可以决定是否调用Invocation对象的proceed方法继续执行下一个插件或者目标方法。
  • 如果一个插件决定不调用proceed方法,则整个链条的执行将在此中断,不会继续执行后续的插件或者目标方法
  • 最后,整个插件链条的执行结果将返回给调用者。

总的来说,MyBatis的插件运行原理基于动态代理和责任链模式,通过在代理对象的方法中依次调用插件的intercept方法,实现了对目标方法的拦截和增强。这种机制使得MyBatis的功能可以被灵活地扩展和定制。

技术漫游

本站访客数 人次 本站总访问量