小工具-mybatis日志sql占位符参数自动转换

查看日志的时候,常常需要一个字段一个字段去对照哪个参数是哪个占位符,非常不明了,故写了个工具,将打印到日志中带占位符的sql自动转换成可以运行的sql。

package com.yangyt.sql.replace;

import com.alibaba.druid.sql.SQLUtils;

import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.util.Scanner;

/**
 * 根据占位符,替换sql,并生成最终的sql
 *
 * @author yangyongtao
 * @Date 2023/12/21 13:46
 **/
public class MybatisSqlReplace {

    public static final String RESET = "\u001B[0m";
    public static final String RED = "\u001B[31m";

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            
            // 带占位符的sql
            String sqlWithPlaceholder = scanner.nextLine();
            String parameter = scanner.nextLine();

            // 替换占位符
            String replacedSql = updateSqlReplace(sqlWithPlaceholder, parameter);

            // 格式化
            replacedSql = SQLUtils.formatMySql(replacedSql).replaceAll(",", ",\t\n");

            // 将文本复制到剪贴板
            Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
            StringSelection selection = new StringSelection(replacedSql);
            clipboard.setContents(selection, null);

            System.out.println(RED + "已自动将转换后的sql拷贝至剪贴板!!!" + RESET);

        }
        scanner.close();
    }

    private static String updateSqlReplace(String sqlWithPlaceholder, String parameter) {
        parameter = parameter.replaceAll(" ", "");
        String[] split = parameter.split(",");
        for (String s : split) {
            if (s.contains("(")) {
                String[] split1 = s.split("\\(");
                String[] split2 = split1[1].split("\\)");
                if ("String".equals(split2[0])) {
                    sqlWithPlaceholder = sqlWithPlaceholder.replaceFirst("\\?", "'" + split1[0] + "'");
                } else {
                    sqlWithPlaceholder = sqlWithPlaceholder.replaceFirst("\\?", split1[0]);
                }
            } else {
                sqlWithPlaceholder = sqlWithPlaceholder.replaceFirst("\\?", "null");
            }
        }
        return sqlWithPlaceholder;
    }
}

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值