MyBatis篇
一些不注意的标签
如何避免SQL注入
映射处理
Mybatis都有哪些Executor执行器?它们之间的区别是什么?
Mybatis是否可以映射Enum枚举类?
用的时候了解一下就行
mybatis和数据库交互的原理?【重点】
MyBatis分页原理
mybatis 中#{}、${}的区别?
Mybatis的一级缓存
Mybatis的二级缓存
MyBatis的paramtertype为什么可以写简称?
Mybatis自带连接池都有什么?
mybatis 使用的时候 mapper 为什么也是接口形式的?
MyBatis的插件能够在哪些地方进行拦截?
MyBatis的插件(Interceptor)可以在MyBatis执行的各个阶段进行拦截和干预,常见的拦截点包括:
- Executor:拦截Executor的执行过程,包括update、query、flushStatements等方法的执行。
- StatementHandler:拦截StatementHandler的SQL语句生成过程,包括prepare、parameterize、batch等方法的执行。
- ParameterHandler:拦截ParameterHandler的参数处理过程,包括getParameterObject、setParameter等方法的执行。
- ResultSetHandler:拦截ResultSetHandler的结果集处理过程,包括handleResultSets、handleOutputParameters等方法的执行。
插件可以在上述阶段进行拦截并自定义处理逻辑,例如:
- 在SQL执行之前或之后记录日志;
- 在SQL执行之前动态修改SQL语句或参数;
- 在SQL执行之后对结果进行特殊处理;
- 在异常发生时进行处理等。
通过实现Interceptor接口并在MyBatis的配置文件中注册插件,可以方便地扩展MyBatis的功能,满足各种特定需求。插件的使用使得MyBatis具有了更强大的灵活性和扩展性。
如何编写一个MyBatis插件?
要编写一个自定义的MyBatis插件,您需要遵循以下步骤:
创建插件类:首先创建一个类,实现MyBatis的Interceptor接口。这个接口定义了插件的拦截方法,您需要在这些方法中编写您的自定义逻辑。
javaimport 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) { // 设置插件的属性,如果有的话 } }
配置插件:在MyBatis的配置文件(如mybatis-config.xml)中,配置您的插件。
xml<plugins> <plugin interceptor="com.example.MyPlugin"> </plugin> </plugins>
注册插件:如果您使用Spring或其他依赖注入框架,您也可以通过Java代码注册插件。
javaimport 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的插件运行原理主要基于动态代理和责任链模式,以下是其简要描述:
- 动态代理:MyBatis使用JDK动态代理或者CGLIB动态代理为被拦截的对象生成代理对象。这个代理对象实现了被拦截接口或者继承了被拦截类,并且在方法调用时会调用插件的拦截逻辑。
- 责任链模式:MyBatis的插件实际上是一个责任链,每个插件都可以在目标方法执行之前、之后或者替换目标方法执行前后添加自定义逻辑。这些插件按照配置的顺序形成一条执行链,在方法调用时按照顺序依次执行。
具体来说,插件的运行原理如下:
- 当MyBatis执行一个方法时,首先会调用代理对象的方法,而不是被拦截对象的方法。
- 代理对象的方法会根据配置的插件执行链依次调用每个插件的intercept方法。
- 在intercept方法中,插件可以自定义拦截逻辑,并且可以决定是否调用Invocation对象的proceed方法继续执行下一个插件或者目标方法。
- 如果一个插件决定不调用proceed方法,则整个链条的执行将在此中断,不会继续执行后续的插件或者目标方法。
- 最后,整个插件链条的执行结果将返回给调用者。
总的来说,MyBatis的插件运行原理基于动态代理和责任链模式,通过在代理对象的方法中依次调用插件的intercept方法,实现了对目标方法的拦截和增强。这种机制使得MyBatis的功能可以被灵活地扩展和定制。