iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Mybatis拦截器打印sql问题怎么解决
  • 264
分享到

Mybatis拦截器打印sql问题怎么解决

2023-07-05 19:07:30 264人浏览 泡泡鱼
摘要

本篇内容介绍了“mybatis拦截器打印sql问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.log4j2配置修改关闭log4

本篇内容介绍了“mybatis拦截器打印sql问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    1.log4j2配置修改

    关闭log4j2打印mybatis的sql配置,如果本来就没开启,那不需要。

    Mybatis拦截器打印sql问题怎么解决

    2.配置日志开关

    SpringBoot的yml文件配置变量logging.sql.enable=true,对拦截器做开关控制。

    Mybatis拦截器打印sql问题怎么解决

    3.添加拦截器插件

    // 采用自定义拦截器打印sql日志sessionFactory.setPlugins(new Interceptor[]{this.getSqlLogInterceptor()});

    Mybatis拦截器打印sql问题怎么解决

    4.拦截器逻辑描述

    4.1 注入开关

     @Value("${logging.sql.enable:true}") private Boolean sqlEnable;

    4.2 获取sql

    Object target = invocation.getTarget();StatementHandler statementHandler = (StatementHandler) target; //获取绑定的SQL对象BoundSql boundSql = statementHandler.getBoundSql(); //得到需要执行的sql语句,并进行格式String sql = boundSql.getSql();

    4.2 获取参数

    //需要绑定的参数映射对象List<ParameterMapping> parameterMappingList = boundSql.getParameterMappings();

    4.3 sql替换参数

    public String buidSql(String sql,Object[] parameters) {        if (parameters == null || sql == null) {            return "";        }        List<Object> parametersArray = Arrays.asList(parameters);        List<Object> list = new ArrayList<Object>(parametersArray);        while (sql.indexOf("?") != -1 && list.size() > 0 && parameters.length > 0) {            Object obj = list.get(0);            if(null!=obj && obj instanceof String){                sql = sql.replaceFirst("\\?", "'"+obj.toString()+"'");            }else if(null!=obj){                sql = sql.replaceFirst("\\?", obj.toString());            }             list.remove(0);        }        return sql.replaceAll("(\r?\n(\\s*\r?\n)+)", "\r\n");    }

    4.4 打印sql

    log.debug(String.fORMat(                        "\n###########################   Sql Start  ###########################" +                                "\n StartTime  :  %s" +                                "\n ExecuteID  :  %s" +                                "\n ExecuteSQL  :  %s" +                                "\n ExecuteTime  :  %s ms" +                                "\n###########################   Sql End  ###########################\n"                         ,startTimeStr,executeID,this.buidSql(sql,args.toString().split(",")),exeTime));

    4.5打印效果

    Mybatis拦截器打印sql问题怎么解决

    拦截器完整代码

    package com.cloudpaas.plugin.mybatis.interceptor; import lombok.extern.slf4j.Slf4j;import org.apache.ibatis.executor.statement.StatementHandler;import org.apache.ibatis.mapping.BoundSql;import org.apache.ibatis.mapping.MappedStatement;import org.apache.ibatis.mapping.ParameterMapping;import org.apache.ibatis.mapping.ParameterMode;import org.apache.ibatis.plugin.*;import org.apache.ibatis.reflection.MetaObject;import org.apache.ibatis.reflection.SystemMetaObject;import org.apache.ibatis.scripting.defaults.DefaultParameterHandler;import org.apache.ibatis.session.Configuration;import org.apache.ibatis.session.ResultHandler;import org.apache.ibatis.type.TypeHandlerReGIStry;import org.springframework.beans.factory.annotation.Value; import java.lang.reflect.Field;import java.sql.Statement;import java.text.SimpleDateFormat;import java.util.*; @Intercepts({        @Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class}),        @Signature(type = StatementHandler.class, method = "update", args = {Statement.class}),        @Signature(type = StatementHandler.class, method = "batch", args = { Statement.class })})@Slf4jpublic class SqlLogInterceptor implements Interceptor {    private SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");     @Value("${logging.sql.enable:true}")    private Boolean sqlEnable;     @Override    public Object intercept(Invocation invocation) throws Throwable {        if(!sqlEnable){            return invocation.proceed();        }        Object target = invocation.getTarget();        MetaObject mObject = SystemMetaObject.forObject(invocation.getTarget());        MappedStatement mappedStatement = (MappedStatement)mObject.getValue("delegate.mappedStatement");        // 执行的mapper statement ID        String executeID = mappedStatement.getId();        //获取当前的开始时间戳        long startTime = System.currentTimeMillis();        //记录当前时间        String startTimeStr=sdf.format(new Date());        StatementHandler statementHandler = (StatementHandler) target;        try {            return invocation.proceed();        } finally {            long endTime = System.currentTimeMillis();            //sql的执行的时间            long exeTime = endTime - startTime;            try{                //获取绑定的SQL对象                BoundSql boundSql = statementHandler.getBoundSql();                //得到需要执行的sql语句,并进行格式                String sql = boundSql.getSql();                sql=formatSql(sql);                //得到默认的参数处理器                DefaultParameterHandler dph=(DefaultParameterHandler)statementHandler.getParameterHandler();                //利用反射机制,从DefaultParameterHandler获取Configuration和TypeHandlerRegistry                Field configurationField=dph.getClass().getDeclaredField("configuration");                Field typeHandlerRegistryField=dph.getClass().getDeclaredField("typeHandlerRegistry");                //设置私有属性可访问                configurationField.setAccessible(true);                //设置私有属性可访问                typeHandlerRegistryField.setAccessible(true);                Configuration configuration=(Configuration) configurationField.get(dph);                TypeHandlerRegistry typeHandlerRegistry=(TypeHandlerRegistry) typeHandlerRegistryField.get(dph);                //sql的参数对象                Object parameterObject = boundSql.getParameterObject();                //需要绑定的参数映射对象                List<ParameterMapping> parameterMappingList = boundSql.getParameterMappings();                //处理sql的参数,该部分参考的是DefaultParameterHandler中setParameters方法中的实现                StringBuffer args=new StringBuffer();                if(parameterMappingList!=null && parameterMappingList.size()>0){                    for(ParameterMapping parameterMapping:parameterMappingList){                        //如果该参数不是输出参数,则进行处理                        if (parameterMapping.getMode() != ParameterMode.OUT) {                            Object value;                            //参数的名字,属性                            String propertyName = parameterMapping.getProperty();                            //先从附加的,主要是list、array等的处理                            if (boundSql.hasAdditionalParameter(propertyName)) {                                value = boundSql.getAdditionalParameter(propertyName);                            } else if (parameterObject == null) {                                value = null;                            } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {                                //typeHandlerRegistry注册了某个类的处理                                value = parameterObject;                            } else {                                //默认的MetaObject 的处理,根据参数获取值                                MetaObject metaObject = configuration.newMetaObject(parameterObject);                                value = metaObject.getValue(propertyName);                            }                            if(value!=null){                                if(value instanceof Date){                                    //如果是日期,则格式化一下                                    value=sdf.format(value);                                }                            }                            args.append(",").append(value);                        }                    }                    //删除第一个逗号                    args.deleteCharAt(0);                }                log.debug(String.format(                        "\n###########################   Sql Start  ###########################" +                                "\n StartTime  :  %s" +                                "\n ExecuteID  :  %s" +                                "\n ExecuteSQL  :  %s" +                                "\n ExecuteTime  :  %s ms" +                                "\n###########################   Sql End  ###########################\n"                         ,startTimeStr,executeID,this.buidSql(sql,args.toString().split(",")),exeTime));            }catch(Exception e){            }        }    }     @Override    public Object plugin(Object target) {        return Plugin.wrap(target, this);    }     @Override    public void setProperties(Properties properties) {     }     private String formatSql(String sql) {        // 输入sql字符串空判断        if (sql == null || sql.length() == 0) {            return "";        }        //格式sql 将回车换行制表符等替换成空,在将连续多个空格替换成1个空格,然后在去掉左右括号两边的空格,在去掉逗号左右两个的空格        return sql.replaceAll("[\\t\\n\\x0B\\f\\r]", "").replaceAll(" +", " ")                .replaceAll(" *\\( *", "(").replaceAll(" *\\) *", ")").replaceAll(" *, *", ",");     }     public String buidSql(String sql,Object[] parameters) {        if (parameters == null || sql == null) {            return "";        }        List<Object> parametersArray = Arrays.asList(parameters);        List<Object> list = new ArrayList<Object>(parametersArray);        while (sql.indexOf("?") != -1 && list.size() > 0 && parameters.length > 0) {            Object obj = list.get(0);            if(null!=obj && obj instanceof String){                sql = sql.replaceFirst("\\?", "'"+obj.toString()+"'");            }else if(null!=obj){                sql = sql.replaceFirst("\\?", obj.toString());            }             list.remove(0);        }        return sql.replaceAll("(\r?\n(\\s*\r?\n)+)", "\r\n");    }}

    “Mybatis拦截器打印sql问题怎么解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: Mybatis拦截器打印sql问题怎么解决

    本文链接: https://www.lsjlt.com/news/354839.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Mybatis拦截器打印sql问题怎么解决
      本篇内容介绍了“Mybatis拦截器打印sql问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.log4j2配置修改关闭log4...
      99+
      2023-07-05
    • Mybatis拦截器打印sql问题
      目录1.log4j2配置修改2.配置日志开关3.添加拦截器插件4.拦截器逻辑描述4.1 注入开关4.2 获取sql4.2 获取参数4.3 sql替换参数4.4 打印sql4.5打印效...
      99+
      2023-05-13
      Mybatis拦截器打印sql Mybatis拦截器 拦截器打印sql
    • mybatis-plus的sql语句打印问题怎么解决
      本篇内容介绍了“mybatis-plus的sql语句打印问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!第一种方式:mybatis...
      99+
      2023-06-30
    • mybatis拦截器无法注入springbean的问题解决
      公司要整合rabbitmq与mybatis拦截器做一个数据同步功能。 整合过程中大部分环节都没什么问题,就是遇到了mybatis拦截器 @Intercepts(@Signature(...
      99+
      2024-04-02
    • SpringBoot怎么打印mybatis的执行sql问题
      这篇文章主要介绍了SpringBoot怎么打印mybatis的执行sql问题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么打印mybatis的执行sql问题文章都会有所收获,下面我们一起...
      99+
      2023-07-05
    • springboot拦截返回数据问题怎么解决
      在Spring Boot中,可以使用拦截器来拦截返回数据,并对返回数据进行处理。可以按照以下步骤来解决该问题:1. 创建一个实现了`...
      99+
      2023-10-12
      springboot
    • SpringBoot如何打印mybatis的执行sql问题
      目录SpringBoot打印mybatis的执行sql1、使用场景       2、具体实现      ...
      99+
      2023-05-13
      SpringBoot打印sql mybatis执行sql SpringBoot打印sql执行
    • 解决window.open()被浏览器拦截的问题
      一、问题描述 最近在做项目的时候碰到了使用window.open被浏览器拦截的情况,虽然在自己的环境可以对页面进行放行,但是对用户来说,不能要求用户都来通过拦截。何况当出现拦截时,很...
      99+
      2024-04-02
    • MyBatis自定义SQL拦截器示例详解
      目录前言定义是否开启注解注册SQL 拦截器处理逻辑如何使用总结前言 本文主要是讲通过 MyBaits 的 Interceptor 的拓展点进行对 MyBatis 执行 SQL 之前做...
      99+
      2024-04-02
    • mybatis-plus的sql语句打印问题小结
      目录第一种方式:第二种方式:mybatis-plus使用时候的小问题记录。 在使用mybatis-plus的时候需要把sql的语句打印出来,查看执行的成功与否,在以前的项目的时候使用...
      99+
      2024-04-02
    • mybatis拦截器怎么使用
      今天小编给大家分享一下mybatis拦截器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。mybatis实战之拦截器在...
      99+
      2023-07-05
    • mybatis拦截器无法注入spring bean怎么解决
      这篇文章主要介绍“mybatis拦截器无法注入spring bean怎么解决”,在日常操作中,相信很多人在mybatis拦截器无法注入spring bean怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
      99+
      2023-06-29
    • MyBatis中怎么实现自定义的SQL拦截器
      在 MyBatis 中实现自定义的 SQL 拦截器,通常可以通过实现 org.apache.ibatis.plugin.Interc...
      99+
      2024-05-08
      MyBatis SQL
    • Struts2拦截器 关于解决登录的问题
      拦截器的工作原理如图 拦截器是由每一个action请求(request)都包装在一系列的拦截器的内部,通过redirectAction再一次发送请求。拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。我们可...
      99+
      2023-05-31
      struts2 登录 拦截器
    • MyBatis特殊字符转义拦截器问题针对(_、\、%)
      目录一、问题反馈二、问题验证三、问题解决思路四、核心功能代码4.1 MyBatis 特殊字符拦截器编写4.2 通过@Configuration标签总结一、问题反馈 今天公司测试向我反...
      99+
      2023-02-07
      MyBatis拦截器 特殊字符转义拦截器 MyBatis特殊字符
    • SpringBoot拦截器返回false显示跨域问题怎么解决
      本文小编为大家详细介绍“SpringBoot拦截器返回false显示跨域问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringBoot拦截器返回false显示跨域问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢...
      99+
      2023-06-30
    • Mybatis的sql注释问题怎么解决
      这篇文章主要介绍“Mybatis的sql注释问题怎么解决”,在日常操作中,相信很多人在Mybatis的sql注释问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mybatis的sql注释问题怎么解决...
      99+
      2023-07-02
    • springboot整合mybatis分页拦截器的问题小结
      简介 又到了吹水时间,是这样的,今天开发时想将自己写好的代码拿来优化,因为不想在开发服弄,怕搞坏了到时候GIT到生产服一大堆问题,然后把它分离到我轮子(工具)项目上,最后运行后发现我...
      99+
      2024-04-02
    • mybatis拦截器及不生效如何解决
      这篇“mybatis拦截器及不生效如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mybatis拦截器及不生效如何解决...
      99+
      2023-07-05
    • SpringBoot security默认拦截静态资源问题怎么解决
      这篇文章主要讲解了“SpringBoot security默认拦截静态资源问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot security...
      99+
      2023-07-05
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作