MyBatis拦截器-打印出真正执行的sql语句和执行结果

这篇具有很好参考价值的文章主要介绍了MyBatis拦截器-打印出真正执行的sql语句和执行结果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

广而告之

背景

先看成品

实现步骤

第一步,实现Interceptor接口

​编辑

第二步,给拦截器指定要拦截的方法签名

第三步,实现拦截器的intercept方法。

第四步,在mybatis-config.xml里配置上这个拦截器插件

第五步,禁用mybatis打印日志


广而告之

给大家推荐一个好用的在线工具网站:

常用工具|无忧在线工具

如果我们在学习工作过程中,需要用到时间戳与日期的互转,或JSON在线编辑、格式化、校验JSON格式等功能,建议首选这个常用工具|无忧在线工具。

这个网站有极简风格的页面,它的时间戳转换器,可以智能解析多种常见的日期格式。例如“1949-10-01”或“1949/10-01”,原样复制到输入框就可以智能解析。

它下方的JSON编辑器,支持JSON格式、JSON压缩、JSON在线编辑,校验JSON格式等功能。

并且有折叠功能,非常强大。

推荐使用:常用工具|无忧在线工具

MyBatis拦截器-打印出真正执行的sql语句和执行结果

背景

MyBatis可以通过xml或注解配置sql模版,程序运行过程中我们可以把参数填充到sql模版里再执行,十分方便。

但是实际生产过程中我们通常会有两个诉求:

  1. 记录填充完参数后,真正执行的sql语句
  2. 自动记录sql执行结果

可以借助MyBatis拦截器实现这一诉求。

先看成品

效果:

MyBatis拦截器-打印出真正执行的sql语句和执行结果

拦截器代码:

package org.example.learn.filter;

import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;

import java.sql.Statement;
import java.util.Properties;

@Intercepts({
        @Signature(type = StatementHandler.class, method = "update", args = {Statement.class}),
        @Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class})
})
public class InterceptorDome implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Statement statement = (Statement) invocation.getArgs()[0];
        System.out.println("-------------------------------");
        System.out.println("sql:"+statement.toString().substring(statement.toString().indexOf(":")+1));
        Object result =invocation.proceed();
        System.out.println("-------------------------------");
        System.out.println("result:"+ JSONObject.toJSONString(result));
        return result;
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {

    }
}

插件配置: 

    <plugins>
        <plugin interceptor="org.example.learn.filter.InterceptorDome">
            <property name="test" value="test"/>
        </plugin>
    </plugins>

禁用mybatis打印日志:

springboot项目中,在application.properties文件中添加配置:

mybatis.configuration.log-impl=org.apache.ibatis.logging.nologging.NoLoggingImpl

如果不禁用mybatis打印日志,statement.toString()输出的就是:org.apache.ibatis.logging.jdbc.PreparedStatementLogger@xxx文章来源地址https://www.toymoban.com/news/detail-424796.html

实现步骤

第一步,实现Interceptor接口

MyBatis拦截器-打印出真正执行的sql语句和执行结果

Interceptor接口是mybatis用来实现插件功能的拦截器接口,他有三个方法,

先看setProperties方法,在xml中配置插件时,用<property>标签配置的参数会存储在setProperties方法的参Properties里,可以通过参数来改变拦截器的行为。

 然后看plugin方法,这个方法的参数target就是要拦截的对象,该方法的实现很简单,固定用“return Plugin.wrap(target, this)”实现即可。

最后一个方法intercept,是我们主要关注的拦截方法。后面会讲这个方法怎么实现。

第二步,给拦截器指定要拦截的方法签名

MyBatis拦截器-打印出真正执行的sql语句和执行结果

回顾java方法签名有哪几个要素:方法所在的类、方法名、方法参数的顺序和类型。

按上图中的方式,用@Intercepts注解和@Signature属性来指定好要拦截的方法签名就可以了。可以指定多个方法签名。

拦截器可以被拦截方法都在这四个接口里:StatementHandler、Executor、ResultSetHandler、ParameterHandler。

这里只讲两个方法:StatementHandler.update和StatementHandler.update

MyBatis拦截器-打印出真正执行的sql语句和执行结果

int update(Statement var1)方法会在所有的 INSERT UPDATE DELET 执行时被调用,因此如果想要拦截这类操作,可以拦截该方法。

<E> List<E> query(Statement var1, ResultHandler var2)方法会在SELECT 查询方法执行时被调用。

拦截了这两个方法就拦截了日常工作中大部分被执行的sql 。

第三步,实现拦截器的intercept方法。

MyBatis拦截器-打印出真正执行的sql语句和执行结果

 invocation.getArgs()方法可以获取被拦截方法的参数数组,由方法签名可知,我们要拦截的两个方法的第一个参数都是Statement,所以获取参数数组第一个元素后,可以直接强转为Statement类型。

此时的Statement已经将sql模版与参数组装好了,直接调用statement.toString()方法就能得到真正执行的sql。

调用invocation.proceed()方法会就会执行被拦截的方法,该方法的返回就是sql执行结果,转换为json字符串打印出来就可以了。

第四步,在mybatis-config.xml里配置上这个拦截器插件

MyBatis拦截器-打印出真正执行的sql语句和执行结果

第五步,禁用mybatis打印日志

springboot项目中,在application.properties文件中添加配置:

mybatis.configuration.log-impl=org.apache.ibatis.logging.nologging.NoLoggingImpl

我没有找到上面的配置在xml的写法吧,读者自行研究一下吧

如果不禁用mybatis打印日志,statement.toString()输出的就是:org.apache.ibatis.logging.jdbc.PreparedStatementLogger@xxx

到了这里,关于MyBatis拦截器-打印出真正执行的sql语句和执行结果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MyBatis拦截器优雅实现数据脱敏

    现代网络环境中,敏感数据的处理是至关重要的。敏感数据包括个人身份信息、银行账号、手机号码等,泄露这些数据可能导致用户隐私泄露、财产损失等严重后果。因此,对敏感数据进行脱敏处理是一种必要的安全措施。 比如页面上常见的敏感数据都是加*遮挡处理过的,

    2024年02月06日
    浏览(43)
  • 自定义注解与拦截器实现不规范sql拦截(拦截器实现篇)

    最近考虑myBatis中sql语句使用规范的问题,如果漏下条件或者写一些不规范语句会对程序性能造成很大影响。最好的方法就是利用代码进行限制,通过拦截器进行sql格式的判断在自测环节就能找到问题。写了个简单情景下的demo,并通过idea插件来将myBatis的mapper方法都打上拦截器

    2024年01月22日
    浏览(45)
  • 自定义MyBatis拦截器更改表名

    by emanjusaka from ​ https://www.emanjusaka.top/2023/10/mybatis-interceptor-update-tableName 彼岸花开可奈何 本文欢迎分享与聚合,全文转载请留下原文地址。 自定义MyBatis拦截器可以在方法执行前后插入自己的逻辑,这非常有利于扩展和定制 MyBatis 的功能。本篇文章实现自定义一个拦截器去改

    2024年02月08日
    浏览(44)
  • MyBatis Plus 拦截器实现数据权限控制

    上篇文章介绍的MyBatis Plus 插件实际上就是用拦截器实现的,MyBatis Plus拦截器对MyBatis的拦截器进行了包装处理,操作起来更加方便 2.1、InnerInterceptor MyBatis Plus提供的InnerInterceptor接口提供了如下方法,主要包括:在查询之前执行,在更新之前执行,在SQL准备之前执行 2.2、编写简

    2024年01月17日
    浏览(43)
  • Mybatis拦截器注解@Intercepts与@Signature注解属性说明

    可能有些新手使用mybatis拦截器的时候可能没太懂@Signature注解中type,method,args的用法 首先mybatis拦截器可以拦截如下4中类型 Executor sql的内部执行器 ParameterHandler 拦截参数的处理 StatementHandler 拦截sql的构建 ResultSetHandler 拦截结果的处理 type:就是指定拦截器类型(ParameterHandl

    2024年02月05日
    浏览(46)
  • 利用Mybatis拦截器实现自定义的ID增长器

    原生的Mybatis框架是没有ID自增器,但例如国产的Mybatis Plus却是支持,不过,Mybatis Plus却是缺少了自定属性的填充;例如:我们需要自定义填充一些属性,updateDate、createDate等,这时Mybatis Plus自带的ID自增器就无法满足需求;这种时候我们就需要自定义的ID增加器,可以自定义

    2024年02月19日
    浏览(46)
  • springbboot拦截器,过滤器,监听器及执行流程

    过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前 请求按照上图进入conteoller后执行完再返回 过滤器是Servlet规范中定义的一种组件,可以用于在请求进入Web应用程序之前或响应离开Web应用程序之前对请

    2024年02月13日
    浏览(43)
  • 基于Mybatis-Plus拦截器实现MySQL数据加解密

    用户的一些敏感数据,例如手机号、邮箱、身份证等信息,在数据库以明文存储时会存在数据泄露的风险,因此需要进行加密, 但存储数据再被取出时,需要进行解密,因此加密算法需要使用对称加密算法。 常用的对称加密算法有AES、DES、RC、BASE64等等,各算法的区别与优劣

    2024年02月16日
    浏览(39)
  • MybatisPlusInterceptor实现sql拦截器(超详细)

    1 . 导入pom 2 . 配置下MybatisPlus的yml 3 . 实体类 4 .  DTO 5 . MybatisPlus的config 6 . controller 7 . 测试  成功实现sql拦截并进行拼接

    2024年02月11日
    浏览(56)
  • 关于MyBatis拦截器失效问题的解决(多数据源、分页插件)

    最近做了一个备份被delete语句删除的数据的小插件,是用MyBatis的拦截器去做的。 但是发现在一个项目中会失效,没有去备份删除的数据,查看日志发现请求并没有进入到拦截器中,换句话说就是拦截器失效了。 百度了一下(哎,百度)发现说的最多的就是分页插件导致的,

    2024年02月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包