• 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了

  • 相关阅读:
    【博客474】为什么k8s控制面pod使用的ip是node ip,而非pod cidr中的ip
    ROS机器人应用(5)—— 键盘和发布话题控制小车移动
    CleanMyMacX4.11.3最新版mac电脑磁盘清理工具功能
    用了4年,终于发现了这款国产报表工具的魅力
    java学习第三天笔记-java基础概念14-扩展项目和设置39
    在浏览器地址栏键入URL按下回车之后会经历什么?
    WPF的_Expander控件
    Spring Cloud 配置中心实战教程
    python 的selenium库自动化操控浏览器最新教程
    TikTok震撼全球!用户来自何方?
  • 原文地址:https://blog.csdn.net/gelinwangzi_juge/article/details/133744858