springboot单独在指定地方输出sql的方法

 更新时间:2023年10月12日 09:01:11   作者:枯枫叶  
一般线上项目都是将日志进行关闭,因为mybatis日志打印,时间长了,会占用大量的内存,如果我想在我指定的地方进行打印sql情况,本文就给大家介绍了springboot单独在指定地方输出sql的方法,需要的朋友可以参考下

一般线上项目都是将日志进行关闭,因为mybatis日志打印,时间长了,会占用大量的内存,如果我想在我指定的地方进行打印sql情况,怎么玩呢!

下面这个场景:

某天线上的项目出bug了,日志打印出来是更新成功的,但是数据库的数据却没有更新,这时候我想给执行这条sql打印出来,方便查看,但是一旦开启mybatis的日志打印功能,就回去全局打印所有的日志,我只想在我想打印的地方打印sql,这时候怎么办呢!见下面的列子:

我想在下面红色箭头处打印这句sql

这时候怎么做呢,咱们可以这样,先将SqlSessionFactory对象注入进来,

如下图:

private final SqlSessionFactory sqlSessionFactory;
    @Autowired
    public LoginService(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

然后在需要打印的地方加上下面的代码即可:

// 获取执行的SQL语句并打印
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            Configuration sqlSessionConfiguration = sqlSession.getConfiguration();
            BoundSql boundSql = sqlSessionConfiguration
                    .getMappedStatement("com.green.testlocalhost.mapper.AdminUserMapper.selectOneByExample")
                    .getSqlSource()
                    .getBoundSql(userExample);
            String sql = StringUtils.getExecSql(sqlSessionConfiguration, boundSql);
            System.out.println("本次执行的sql语句::" + sql);
        }

注意:com.green.testlocalhost.mapper.AdminUserMapper.selectOneByExample 这个是StatementId,也就是你主动调用db框架的那个类或者接口的包路径(com.green.testlocalhost.mapper.AdminUserMapper),然后在路径后面拼接调用的方法(selectOneByExample )即可

用到的工具方法如下:

/**
     * 获取执行的sql语句
     * @param configuration
     * @param boundSql
     * @return
     */
    public static String getExecSql(Configuration configuration, BoundSql boundSql) {
        try {
            Object parameterObject = boundSql.getParameterObject();
            List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
            String sql = boundSql.getSql().replaceAll("[\\s]+", " ");
            if (!parameterMappings.isEmpty() && parameterObject != null) {
                TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
                if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
                    sql = sql.replaceFirst("\\?", getParameterValue(parameterObject));
                } else {
                    MetaObject metaObject = configuration.newMetaObject(parameterObject);
                    for (ParameterMapping parameterMapping : parameterMappings) {
                        String propertyName = parameterMapping.getProperty();
                        Object obj;
                        if (metaObject.hasGetter(propertyName)) {
                            obj = metaObject.getValue(propertyName);
                            sql = sql.replaceFirst("\\?", getParameterValue(obj));
                        } else if (boundSql.hasAdditionalParameter(propertyName)) {
                            obj = boundSql.getAdditionalParameter(propertyName);
                            sql = sql.replaceFirst("\\?", getParameterValue(obj));
                        }
                    }
                }
            }
            return sql;
        } catch (Exception var11) {
            return "";
        }
    }
    private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private static String getParameterValue(Object obj) {
        String value;
        if (obj instanceof String) {
            value = "'" + obj + "'";
        } else if (obj instanceof Date) {
            value = "'" + SIMPLE_DATE_FORMAT.format(obj) + "'";
        } else if (obj != null) {
            value = obj.toString();
        } else {
            value = "";
        }
        return value;
    }

这样就可以在你指定的代码地方打印sql而不是全局打印sql了

以上就是springboot单独在指定地方输出sql的方法的详细内容,更多关于springboot输出sql的资料请关注脚本之家其它相关文章!

相关文章

  • java 学习笔记(入门篇)_java程序helloWorld

    java 学习笔记(入门篇)_java程序helloWorld

    安装配置完Java的jdk,下面就开始写第一个java程序--hello World.用来在控制台输出“Hello World”,接下来详细介绍,感兴趣的朋友可以参考下
    2013-01-01
  • Java设计模式之建造者模式的示例详解

    Java设计模式之建造者模式的示例详解

    建造者模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。本文将通过示例讲解建造者模式,需要的可以参考一下
    2022-10-10
  • SpringCloud让微服务实现指定程序调用

    SpringCloud让微服务实现指定程序调用

    这篇文章主要介绍了SpringCloud让微服务实现指定程序调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Mybatis-plus apply函数使用场景分析

    Mybatis-plus apply函数使用场景分析

    Mybatis-plus 里面的 apply方法 是用于拼接自定义的条件判断,自定义时间查询,根据传进来的开始日期,查询所有该日期是数据,但是数据库中保存是时间,所以需要使用apply查询方式并格式化,这篇文章给大家介绍Mybatis-plus apply函数使用,感兴趣的朋友一起看看吧
    2024-02-02
  • Java数据结构之List的使用总结

    Java数据结构之List的使用总结

    List是Java中比较常用的集合类,指一系列存储数据的接口和类,可以解决复杂的数据存储问题,本文就来拿实际案例总结介绍一下List的使用方法,感兴趣的朋友快来看看吧
    2021-11-11
  • 浅谈java二进制、十进制、十六进制、字符串之间的相互转换

    浅谈java二进制、十进制、十六进制、字符串之间的相互转换

    下面小编就为大家带来一篇浅谈二进制、十进制、十六进制、字符串之间的相互转换。小编觉得挺不错的,现在就分享给大家,也给大家做个参考,一起跟随小编过来看看吧
    2016-06-06
  • 浅谈在Java中JSON的多种使用方式

    浅谈在Java中JSON的多种使用方式

    这篇文章主要介绍了浅谈在Java中JSON的多种使用方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Java IO流对象的序列化和反序列化实例详解

    Java IO流对象的序列化和反序列化实例详解

    这篇文章主要介绍了Java IO流对象的序列化和反序列化实例详解的相关资料,需要的朋友可以参考下
    2017-05-05
  • SpringBoot使用WebSocket的方法实例详解

    SpringBoot使用WebSocket的方法实例详解

    WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。这篇文章主要介绍了SpringBoot使用WebSocket,需要的朋友可以参考下
    2019-06-06
  • JAVA简单工厂模式(从现实生活角度理解代码原理)

    JAVA简单工厂模式(从现实生活角度理解代码原理)

    本文主要介绍了JAVA简单工厂模式(从现实生活角度理解代码原理)的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03

最新评论