• springboot单独在指定地方输出sql


    一般线上项目都是将日志进行关闭,因为mybatis日志打印,时间长了,会占用大量的内存,如果我想在我指定的地方进行打印sql情况,怎么玩呢!
    下面这个场景:
    某天线上的项目出bug了,日志打印出来是更新成功的,但是数据库的数据却没有更新,这时候我想给执行这条sql打印出来,方便查看,但是一旦开启mybatis的日志打印功能,就回去全局打印所有的日志,我只想在我想打印的地方打印sql,这时候怎么办呢!见下面的列子:
    我想在下面红色箭头处打印这句sql在这里插入图片描述
    这时候怎么做呢,咱们可以这样,先将SqlSessionFactory对象注入进来,
    如下图:

    private final SqlSessionFactory sqlSessionFactory;
    
        @Autowired
        public LoginService(SqlSessionFactory sqlSessionFactory) {
            this.sqlSessionFactory = sqlSessionFactory;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    然后在需要打印的地方加上下面的代码即可:

    // 获取执行的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);
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    注意: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;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

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

  • 相关阅读:
    工业智能网关BL110应用之三十三: 如何连接配置华为云服务器
    测试管理的知识和讨论总结
    Docker 安装运行命令解读安装Mysql
    esp-01刷固件/下载软件到内部单片机的方法
    浅析基于AI智能识别技术的明厨亮灶智能化监管方案
    鉴源论坛 · 观模丨浅谈软件测试
    【UI】element-ui的el-dialog的遮罩层在模态框的前面bug
    动态加权平衡损失:深度神经网络的类不平衡学习和置信度校准
    最小堆模拟
    centos7服务器安全策略
  • 原文地址:https://blog.csdn.net/gelinwangzi_juge/article/details/133744858