Mybatis 的 Interceptor(拦截器) 与 JSqlparser 结合解析SQL 使SpringBoot项目多数据库兼容的尝试

Mybaits插件简单描述

插件简介和具体作用

Mybatis官方提供了插件机制为用户开辟了一道可以自定义的拦截扩展功能,在 系统最终执行SQL 之前,分别有四个部位可以做扩展,允许用户在不修改Mybatis核心代码的情况下,添加自己的逻辑处理,去完成各种各样的业务场景

官方简介:mybatis – MyBatis 3 | 配置 

典型案例:

1.MyBatis 分页插件 PageHelper 

2.分页插件 | MyBatis-Plus (baomidou.com)

业务场景示例

  1. 性能监控:记录SQL执行时间,统计慢查询,帮助开发者发现并优化性能瓶颈
  2. 访问控制:根据用户的权限,动态修改SQL语句,实现数据行级或列级的权限控制。
  3. 动态SQL注入:根据不同的业务需求,动态拼接或修改SQL语句。
  4. 数据脱敏:在查询结果返回给客户端之前,对敏感信息进行脱敏处理。
  5. 缓存控制:对查询结果进行缓存,减少数据库访问次数,提高系统性能。
  6. 自定义分页:用户也可以像pageHelper、mybatis-plus的分页那样自定义自己的分页
  7. 加密解密:利用这个机制,对数据库中敏感字段的对称加密,诸如密码、卡号、身份信息之类的
  8. 自定义日志输出:拦截SQL执行,实现自定义的日志输出格式,便于问题追踪和调试。
  9. 动态数据源切换:在拦截器中根据业务规则,动态选择不同的数据源。
  10. 参数校验:在执行SQL语句前,对参数进行校验,确保数据的完整性和一致性。

四个核心组件简介

这四个部位其实就是Mybatis的四大核心组件:

  1. Executor (执行器):负责增删改查和事务,它调度(另外三个)StatementHandlerParameterHandlerResultSetHandler等来执行对应的SQL
  2. StatementHandler(语句预处理) : 封装JDBC,构建SQL语法,负责和数据库进行交互执行sql语句,(后期下手操作和修改SQL也主要是以它为主)
  3. ParameterHandler (参数处理): 负责将参数真正加入到SQL语句中的部分
  4. ResultSetHandler (结果处理) :负责将JDBC查询结果映射到java对象

以下是流程图:

拦截方法划分

精细划分的目的是为了允许在数据库操作的不同阶段进行精确的干预和拦截

Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
@Intercepts({
        @Signature(type = Executor.class, method = "update", args = {MappedStatement.class,
                Object.class}),
        @Signature(type = Executor.class, method = "query", args = {MappedStatement.class,
                Object.class,
                RowBounds.class,
                ResultHandler.class})})
@Component
public class MyApplicationInterceptor implements Interceptor {
       // 具体实现内容...
}

可拦截的方法:

  • update:负责执行 insert、update、delete 三种类型的 SQL 语句。
  • query:负责执行 select 类型的 SQL 语句。
  • queryCursor:负责执行 select 类型的 SQL 语句,返回 Cursor 对象。
  • flushStatements:提交批处理语句,返回批处理结果。
  • commit:事务提交。
  • rollback:事务回滚。
  • getTransaction:获取事务对象。
  • close:关闭 executor,同时根据参数决定是否强制回滚未提交的事务。
  • isClosed:检查 executor 是否已经关闭。
  • clearLocalCache:清除本地缓存。
ParameterHandler (getParameterObject, setParameters)
@Component
@Intercepts({
        @Signature(type = ParameterHandler.class, method = "setParameters", args = PreparedStatement.class),
})
@Slf4j
public class ParameterPluginInterceptor implements Interceptor {}
  • ​​​

    可拦截的方法:

  • getParamete
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值