IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Java替换mybatis框架SQL日志中的预编译问号“?“ -> 正文阅读

[大数据]Java替换mybatis框架SQL日志中的预编译问号“?“

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

2022-03-07 11:45:25,959 [http-nio2-8080-exec-10] DEBUG [16466247258377172025468] c.xylink.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] c.xylink.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] c.xylink.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)";
    }

    //原始预编译SQL
    private 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 ?";
    }

}

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:34:18  更:2022-03-08 22:37:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:33:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码