当我们去排查问题的时候,经常需要查看SQL来判断执行逻辑,但是打开日志后,往往会发现是这样的:

2022-03-07 11:45:25,959 [http-nio2-8080-exec-10] DEBUG [16466247258377172025468] com.test.crm.product.mapper.ProductMapper.pageList:137 - ==>  Preparing: SELECT p.id, p.product_name, p.product_code, p.shelf_status, p.config, p.has_u8, p.sale_scope, p.gmt_modified, p.price_group FROM basic_product AS p WHERE p.deleted = 0 AND p.product_category_id IN ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) AND (p.product_code LIKE CONCAT('%', ?, '%') OR p.product_name LIKE CONCAT('%', ?, '%')) ORDER BY p.product_code LIMIT ?
2022-03-07 11:45:25,961 [http-nio2-8080-exec-10] DEBUG [16466247258377172025468] com.test.crm.product.mapper.ProductMapper.pageList:137 - ==> Parameters: 0(Long), 18865823302549504(Long), 18865823308840960(Long), 18865823315132416(Long), 18865823321948160(Long), 18865823328239616(Long), 18865823334531072(Long), 18865823340822528(Long), 18865823346589696(Long), 18865823352881152(Long), 18865823358124032(Long), 18865823364415488(Long), 18865823369658368(Long), 18865823375425536(Long), 18865823381192704(Long), 存储(String), 存储(String), 10(Long)
2022-03-07 11:45:25,965 [http-nio2-8080-exec-10] DEBUG [16466247258377172025468] com.test.crm.product.mapper.ProductMapper.pageList:137 - <==      Total: 5

因为预编译里面有PreparingParameters,固有很多问号,每次手动去变动问号,比较麻烦,所以写了个程序用于处理:

  • 一个方法填入预编译(带问号)的字符串
  • 一个方法填入参数字符串
  • 运行程序,便会打印替换后的
public class Main {public static void main(String[] args) {String originSql = getOriSql();String paramStr = getParamStr();originSql = originSql.trim();paramStr = paramStr.trim();originSql = originSql.replace("Preparing:", "");paramStr = paramStr.replace("Parameters:", "");String[] params = paramStr.split(",");for (String param : params) {param = adjustParam(param);originSql = originSql.replaceFirst("\\?", param);}System.out.println(originSql);}private static String adjustParam(String param) {//去掉第一个空格param = param.substring(1);int i1 = param.indexOf("(");int i2 = param.indexOf(")");String subStr = param.substring(i1, i2 + 1);//移除类型param = param.replace(subStr, "");switch (subStr) {case "(Long)":case "(Integer)":case "(Boolean)":case "(BigDecimal)":return param;case "(String)":case "(Timestamp)":return "'" + param + "'";default:}throw new RuntimeException("Not Match Param Type");}//参数填充private static String getParamStr() {return "Parameters: 0(Long), 18865823302549504(Long), 18865823308840960(Long), 18865823315132416(Long), 18865823321948160(Long), 18865823328239616(Long), 18865823334531072(Long), 18865823340822528(Long), 18865823346589696(Long), 18865823352881152(Long), 18865823358124032(Long), 18865823364415488(Long), 18865823369658368(Long), 18865823375425536(Long), 18865823381192704(Long), 存储(String), 存储(String), 10(Long)";}//原始预编译SQLprivate static String getOriSql() {return "Preparing: SELECT p.id, p.product_name, p.product_code, p.shelf_status, p.config, p.has_u8, p.sale_scope, p.gmt_modified, p.price_group FROM basic_product AS p WHERE p.deleted = 0 AND p.product_category_id IN ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) AND (p.product_code LIKE CONCAT('%', ?, '%') OR p.product_name LIKE CONCAT('%', ?, '%')) ORDER BY p.product_code LIMIT ?";}}

Java替换mybatis框架SQL日志中的预编译问号“?“相关推荐

  1. java 获取sqlsession_获取Java的MyBatis框架项目中的SqlSession的方法

    从XML中构建SqlSessionFactory从XML文件中构建SqlSessionFactory的实例非常简单.这里建议你使用类路径下的资源文件来配置. String resource = &qu ...

  2. Java SE MyBatis框架(详解)

    Java SE MyBatis框架 目录 Java SE MyBatis框架 通用框架 1.lib 2.src 2.1.mybatis.xml 2.2.DateBase.properties 2.3. ...

  3. es分页和mysql分页_用户logstash同步mysql数据到es中7.4.1版本以后输出的sql日志中没有分页信息...

    问题描述: 在使用logstash同步mysql数据库中的数据,在使用logstash7.4.1以前的版本,输出的sql日志如下: [2019-12-09T10:50:01,585][INFO ][l ...

  4. C中的预编译宏定义-转

    C中的预编译宏定义 2009-02-10 作者: infobillows 来源:网络 在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocesso ...

  5. c++/c中的预编译,文件包含伪指令,#include,包含哨卫,头文件保护

    c++/c中的预编译处理: 预编译伪指令一般以#开头,前面只能是空白字符,其本身不是c/c++语句,可以出现在程序的任何地方,只要其展开后复合语法规则并且有效即可,其位置可以是头文件,函数体,控制结构 ...

  6. C#中的预编译指令介绍

    原文:C#中的预编译指令介绍 1.#define和#undef 用法: #define DEBUG #undef DEBUG #define告诉编译器,我定义了一个DEBUG的一个符号,他类似一个变量 ...

  7. 在cshtml文件中使用预编译语法

    阅文时长 | 0.29分钟 字数统计 | 474.4字符 主要内容 | 1.引言&背景 2.解决方案示例 3.声明与参考资料 『在cshtml文件中使用预编译语法』 编写人 | SCscHer ...

  8. Java EE——Mybatis 框架学习

    文章目录 一.MyBatis 框架概述: 二. Mybatis 框架入门 三. 基于代理 Dao 实现 CRUD 操作 1.根据 ID 查询: 2.保存操作: 3.用户更新: 4.用户删除: 四.My ...

  9. mysql通用日志不打印_解决logback不打印mybatis的SQL日志的问题

    工作这么多年,今天还是因为Logback的这个问题稍微卡了一下,惭愧. 问题描述: logback配置了如下信息: ...此处省略File Appender内容 ${logbase}sql.%d{yy ...

最新文章

  1. 笑一个阿 哈哈哈。。。。
  2. python 虚拟环境就两句话整那么多没用的
  3. Linux Platform Device and Driver
  4. eclipse 3.6的VE配置 Visual Editor for eclipse3.6
  5. 几款不错的VisualStudio2010插件
  6. PhpStudy 升级 MySQL 版本到5.7
  7. xdf文件转换成pdf在线_在线PDFtodoc转换器智能转换PDF文件
  8. quartz锁表misfire的处理策略设置
  9. Objective-C基础学习笔记(八)-内存管理-autorelease使用-property创建对象的内存管理-循环引用的内管管理...
  10. 软件工程造价师好考吗?
  11. 激光雷达类型分类,知名激光雷达公司介绍,三角测距激光雷达与TOF激光雷达原理
  12. CS5216|DP转HDMI方案详解|分辨率1080P
  13. PnL Explained FAQ
  14. android如何基于父布局,如何根据父视图的尺寸调整Android视图的大小
  15. 【.net core】电商平台升级之微服务架构应用实战
  16. android源代码目录详解
  17. python程序设计是什么专业-那门用Python讲授的程序设计课程能带给学生什么?
  18. python判断数字在不在范围内_我的程序在python中完成数字并且不确定我是否应该在范围内使用(1,1000)或(2,n 1)...
  19. 如何正确修改标题,如何修改标题不会被降权?
  20. numpy之轴向统计API

热门文章

  1. linux中tr的功能多多
  2. HttpEntity的用法
  3. 网页错误代码200,300,400,500
  4. Struts(JFIS)
  5. android 百度地图拖动定位,百度地图获取定位,实现拖动marker定位,返回具体的位置名...
  6. 微型计算机的冷启动方式,冷启动和热启动指的是什么,电脑启动类型有哪些?...
  7. 贷前风控流程与常见策略规则类型
  8. 计算机二级选office还是python_全国计算机二级考试,9种科目如何选择?
  9. Microsoft Office word PPT 中删除COMSOL5.6 加载项后每次启动显示加载错误
  10. python字典操作总结