mybatis的拦截器


mybatis的四种拦截器

第一个是执行拦截器:

  1. Executor(执行器拦截器):
  • 用途:拦截MyBatis执行器方法的执行。

第二个是语句拦截器

  1. StatementHandler(语句拦截器):

– 用途:拦截SQL语句的执行。

  • 使用:可以在SQL语句执行之前修改或增强它们。例如,可以向WHERE子句添加额外的条件或记录执行的语句。分页等

第三个是参数拦截器

  1. ParameterHandler(参数拦截器):
  • 用途:拦截SQL语句的参数设置。

  • 使用:允许在将参数设置到SQL语句之前修改或验证它们。例如,可以对作为参数传递的敏感信息进行加密或解密。

可以进行数据库某个字段的监控,可以进行mybatis拦截器的使用,进行数据库的字段追踪

第四个是结果集拦截器

  • 用途:拦截从SQL语句返回的结果集的处理。

  • 使用:可以在将结果集返回给应用程序之前修改或分析它们。例如,可以对结果集数据进行转换或执行额外的计算。

mybatis拦截器-笔试题

1.笔试题

在这里插入图片描述

实现
进入解析器

只要有人更改,那么要告诉

可以指定表中的字段进行监控

有price或者敏感字段,那么就要对字段进行
有人修改的时候,那么就要发邮件或者报警,让人知道这件事情

这个需求

JDBC的执行流程

在这里插入图片描述
1.注册驱动

首先使用反射

注册驱动 jar包里面有什么就加载什么

获取连接对象

jdbc底层使用socket进行连接数据库的
,打开connection

3.执行sql语句,返回执行结果

通过执行startement实例执行sql语句

处理执行结果

resultSet

使用stament拦截器

实现思路

首先
实现mybatis的 Interceptor 接口

然后实现里面的方法

然后

    ParameterHandler parameterHandler = (ParameterHandler) invocation.getTarget();
    Object parameterObject = parameterHandler.getParameterObject();

package com.beiyou.mybatis;

import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.ReflectUtil;
import com.beiyou.entity.BaseEntity;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.springframework.stereotype.Component;

import java.beans.Statement;
import java.lang.reflect.Field;
import java.lang.reflect.Parameter;
import java.sql.PreparedStatement;

/**

  • @author healer

  • @Description MyParameterHandler

  • @data 2024-07-11 14:50
    */
    @Component
    @Intercepts({@Signature(type = ParameterHandler.class, method = “setParameters”, args = {PreparedStatement.class})})
    public class MyParameterHandler implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
    ParameterHandler parameterHandler = (ParameterHandler) invocation.getTarget();
    Object parameterObject = parameterHandler.getParameterObject();

     ThreadLocal threadLocal = new ThreadLocal();
     threadLocal.set("测试");
     Object localUser = threadLocal.get();
    

//threadLocal.get()
// Field lastUpdateBy = ReflectUtil.getField(parameterObject.getClass(), “lastUpdateBy”);
//
// if (lastUpdateBy != null) {
// ReflectUtil.setFieldValue(parameterObject, lastUpdateBy, threadLocal.get());
// }
//
if (parameterObject instanceof BaseEntity && localUser != null) {
BaseEntity entity = (BaseEntity) parameterObject;
entity.setLastUpdateBy(localUser.toString());
}
return invocation.proceed();
}
}

实现的是参数的拦截器去实现思路

  • 10
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值