文章目录
- 第三个是参数拦截器
- 第四个是结果集拦截器
- mybatis拦截器-笔试题
- 1.笔试题
- JDBC的执行流程
- 3.执行sql语句,返回执行结果
mybatis的四种拦截器
第一个是执行拦截器:
- Executor(执行器拦截器):
- 用途:拦截MyBatis执行器方法的执行。
第二个是语句拦截器
- StatementHandler(语句拦截器):
– 用途:拦截SQL语句的执行。
- 使用:可以在SQL语句执行之前修改或增强它们。例如,可以向WHERE子句添加额外的条件或记录执行的语句。分页等
第三个是参数拦截器
- 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();
}
}
实现的是参数的拦截器去实现思路