首页 > 其他分享 >MyBatis拦截器

MyBatis拦截器

时间:2024-09-30 17:55:06浏览次数:10  
标签:语句 执行器 拦截器 SQL Executor MyBatis 执行

一.JDBC的执行流程 (面试题一)

JBDC的底层主要是三个接口对象,Connection、Statement、ResultSet。

Connection用于建立与数据库的连接,Statement用于向数据库发送sql语句,ResultSet用于封装sql查询语句的结果。

原始的JDBC操作数据库主要有以下几个步骤:

1.注册驱动

使用 Class.forName() 方法加载数据库驱动程序类。

2.获取连接对象

JDBC的底层其实是使用Socket进行连接数据库的。打开Connection .

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

通过获取Statement实例执行SQL语句。

4.处理执行结果

最后返回的结果集是ResultSet。

5.释放资源

JDBC的执行流程

JBDC底层原理解析-CSDN博客

http://https://blog.csdn.net/qq_51634677/article/details/131445572

二.MyBatis执行流程(面试题二)

MyBatis的工作原理

2.1 Executor执行器

Executor 执行器则是 MyBatis 框架中的 SQL 执行工具,它负责执行 MappedStatement 中定义的 SQL 语句,并根据配置决定是否开启缓存、是否处理批量操作等。当调用 SqlSession 的 CRUD 方法时,SqlSession 会委托给它的内部 Executor 执行器去完成具体的 SQL 执行工作。

Executor 是 MyBatis 执行 SQL 的入口,它是一个策略模式的体现,有多种实现(如 SimpleExecutor、ReuseExecutor、BatchExecutor 等),分别适用于不同的场景(例如是否启用缓存、是否进行批处理等)。

当用户通过 SqlSession 执行某个数据库操作时,Executor 会根据指定的方法名和参数找到相应的 MappedStatement,并负责执行该 SQL 语句。

1.SimpleExecutor – SIMPLE 就是普通的执行器。

2.ReuseExecutor-执行器会重用预处理语句(PreparedStatements)

3.BatchExecutor --它是批处理执行器

2.2 MappedStatement 对象

MappedStatement 对象是 MyBatis 核心配置文件中每一个 <select>、<insert>、<update>、<delete> 等标签的映射,它封装了 SQL 语句以及其参数类型、结果集映射等信息。在 MyBatis 初始化阶段,会将 XML 映射文件或注解解析成一个个 MappedStatement 对象存储起来。

2.3 StatementHandler 语句处理器

StatementHandler 是 Executor 与 JDBC Statement 接口交互的桥梁,它负责对 JDBC Statement 进行进一步的封装和控制。在 Executor 执行 SQL 的过程中,它会通过 StatementHandler 去真正操作数据库,StatementHandler 会根据 MappedStatement 中的信息设置 SQL 参数、预编译 SQL 语句以及处理查询结果集的映射等细节工作。

三者之间的关系可以用以下步骤概括:

  1. 用户通过 SqlSession 调用一个方法,SqlSession 通过 Executor 找到对应的 MappedStatement。

  2. Executor 使用找到的 MappedStatement,结合请求参数,通过 StatementHandler 创建并配置 JDBC Statement。

  3. StatementHandler 根据 MappedStatement 中的 SQL 语句及参数映射信息,设置 SQL 参数并执行 SQL。

  4. 执行 SQL 后,StatementHandler 再次发挥作用,处理数据库返回的结果集,并将其按照 MappedStatement 中定义的结果映射转换为 Java 对象,最终返回给客户端。

三.Mybatis拦截器

拦截的执行顺序是Executor->StatementHandler->ParameterHandler->ResultHandler

3.1 Mybatis提供了四种类型的拦截器:

1. Executor(执行器拦截器)

- 用途:拦截MyBatis执行器方法的执行。

- 使用:允许拦截和自定义MyBatis执行器的行为。例如,可以添加缓存、日志记录或审计功能到执行器中。这些拦截器可以在MyBatis执行的不同阶段扩展或修改其行为。您可以通过实现MyBatis提供的相应接口并在MyBatis配置文件中进行配置来实现这些拦截器。

2. StatementHandler(语句拦截器):

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

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

3. ParameterHandler(参数拦截器):

- 用途:拦截SQL语句的参数设置。

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

4. ResultHandler(结果集拦截器):

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

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

配置(@Intercepts注解--拦截执行器-拦截参数)


@Component
@Intercepts({@Signature(type = ParameterHandler.class,                        method = "setParameters",                        args = {PreparedStatement.class})})
public class ParameterPlugin implements Interceptor {
        ParameterHandler  parameterHandler = (ParameterHandler) invocation.getTarget();
        Object parameterObject = parameterHandler.getParameterObject();
        //第一种,性能高
        // if(parameterObject instanceof BaseModel){
        //  BaseModel baseModel = (BaseModel) parameterObject;
        //  baseModel.setLastUpdateBy(LocalUserUtil.getLocalUser().getNickName());
        // }
        //第二种使用反射处理,扒光撕开
        Field lastUpdateBy = ReflectUtil.getField(parameterObject.getClass(), "lastUpdateBy");
        if (lastUpdateBy != null) {
            ReflectUtil.setFieldValue(parameterObject,lastUpdateBy,LocalUserUtil.getLocalUser().getNickName());
        }
        return invocation.proceed();

}

标签:语句,执行器,拦截器,SQL,Executor,MyBatis,执行
From: https://blog.csdn.net/zhzjn/article/details/142661107

相关文章

  • 五,MyBatis-Plus 当中的 “ActiveRecord模式”和“SimpleQuery工具类”(详细实操)
    五,MyBatis-Plus当中的“ActiveRecord模式”和“SimpleQuery工具类”(详细实操)文章目录五,MyBatis-Plus当中的“ActiveRecord模式”和“SimpleQuery工具类”(详细实操)1.ActiveRecord模式2.ActiveRecord介绍2.1ActiveRecord实现3.SimpleQuery工具类3.1SimpleQuer......
  • 五,MyBatis-Plus 当中的 “ActiveRecord模式”和“SimpleQuery工具类”(详细实操)
    五,MyBatis-Plus当中的“ActiveRecord模式”和“SimpleQuery工具类”(详细实操)@目录五,MyBatis-Plus当中的“ActiveRecord模式”和“SimpleQuery工具类”(详细实操)1.ActiveRecord模式2.ActiveRecord介绍2.1ActiveRecord实现3.SimpleQuery工具类3.1SimpleQuery介绍3.2list......
  • 使用Mybatis框架的主要优势
    MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集的过程,简化了数据库交互的复杂性。MyBatis是一个轻量级的框架,相对于一些重量级的ORM框架,它的开销更小,性能更高。使用MyBatis作为持......
  • 接上文实现SpringSecurity,拦截器的实现
    实现拦截器有图片可知,在上篇文章我们重写了UserDetailsManager,现在我们来进行之后的操作在UserDetailsManager中我们可以调动数据库去进行一个账号密码的校验之后我们这样设置拦截器进行一个token获取存储在usernamePasswordAuthenticationFilter这一层中,有,则存储在Secur......
  • mybatis基于注解、XML配置文件的形式来定义SQL语句
    一、mybatis基于注解定义SQL语句员工类@Data@NoArgsConstructor//无参@AllArgsConstructor//有参publicclassEmp{privateIntegerid;//idprivateStringusername;//用户名privateStringpassword;//密码privateStringname;//姓名privat......
  • Flume实战--Flume中的拦截器详解与操作
            在处理大规模数据流时,ApacheFlume是一款功能强大的数据聚合工具,它可以通过拦截器在运行时对Event进行修改或丢弃。本文将详细讲解Flume中的拦截器,包括时间戳拦截器、Host添加拦截器、静态拦截器以及如何自定义拦截器。拦截器拦截器的作用拦截器用于在事件......
  • 【Mybatis】Mybatis拦截器+注解,实现敏感数据自动加解密
    一:背景     今天,公司新要求对数据库的敏感数据进行加密,对手机号、身份证号、姓名等一些敏感数据进行加密处理,要求:    1.通过程序实现数据加密解密(快速便捷,尽量减少对原先代码的修改)    2.可以通过sql查询对数据进行解密(通过密钥直接对数据库......
  • Mybatis学习笔记
    目录Mybatis简介MyBatis历史MyBatis特性MyBatis下载和其它持久化层技术对比搭建MyBatis开发环境创建maven工程创建MyBatis的核心配置文件创建mapper接口创建MyBatis的映射文件通过junit测试功能加入log4j日志功能核心配置文件详解默认的类型别名MyBatis的增删改查MyBatis获取参数......
  • SpringBoot-MybatisPlus项目中,在控制台查看sql执行日志的方法
    SpringBoot-MybatisPlus项目中,在控制台查看sql执行日志的方法springboot、maven、mybatisplus、sql、日志、控制台、console、log背景在baomidou.com学习mybatisPlus入门的过程中,接触到表名和关键词冲突,加注解加表名引号后问题解决。不过我还想,在控制台打印一下执行......
  • 使用 MyBatis 原生功能
    我们使用MyBatis-Flex作为MyBatis的增强框架进行代码开发,并不会影响原有的MyBatis的任何功能。一.使用 @Select 等MyBatis原生注解1.创建数据库表并插入数据CREATETABLEIFNOTEXISTStb_userinfo(idINTAUTO_INCREMENTCOMMENT'用户编号'PRIMARYKE......