Mybatis日志输出sql语句参数填充

Mybatis日志输出sql语句是带?的,要拎出来查询的话不太方便。所以写了这个,自动替换所有的?为实际的参数。

package com.shy;

import lombok.Data;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Data
public class SqlLog {
    private String preparing;//对应带?的jdbc sql语句
    private String parameters;//对应所有的参数字符串
    private Integer updates;//对应受影响的行数
    private List<String> params;//对应所有的参数集合
    private String resultSql;//对应输出的sql

    /**
     * 解析sql
     * @param content mybatis日志sql打印部分
     * @return 输出的sql
     */
    public String parseSql(String content){
        String preParingPn = "==>  Preparing: (.*?)\n";
        Pattern r = Pattern.compile(preParingPn);
        Matcher m = r.matcher(content);
        if(m.find()){
            preparing = m.group(1);
        }
        String parametersPn = "==> Parameters: (.*?)\n";
        r = Pattern.compile(parametersPn);
        m = r.matcher(content);
        if(m.find()){
            parameters = m.group(1);
        }
        String updatesPn = "<==    Updates: (\\d+)\n";
        r = Pattern.compile(updatesPn);
        m = r.matcher(content);
        if(m.find()){
            updates = Integer.valueOf(m.group(1));
        }
        parseParameters();
        return resultSql;
    }

    /**
     * 正则匹配所有的参数
     */
    private void parseParameters(){
        parameters = parameters+ ",";
        String pattern = "([^,]*?)\\((.*?)\\),|null,";
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(parameters);
        params = new ArrayList<>();
        while(m.find()){
            String param = m.group(1);
            String type = m.group(2);
            if("String".equals(type)){
                params.add("\'"+param.trim()+"\'");
            }else if(param == null) {
                params.add("null");
            }else{
                params.add(param.trim());
            }
        }
        resultSql = preparing;
        for (String param : params) {
            resultSql = resultSql.replaceFirst("\\?", param);
        }
    }
}

测试类

package com.shy;

public class SqlUtil {
    public static void main(String[] args) {
        String content = "==>  Preparing: update AAA set A = '1', B =?, C =?, D = ?, CONFIRM_FILE = ?, E = sysdate, F = '1', G = '1' where ID = ? \n" +
                "==> Parameters: 800(Integer), 1(String), 通过(String), null, 1652(Integer)\n" +
                "<==    Updates: 1";
        SqlLog sqlLog = new SqlLog();
        String resultSql = sqlLog.parseSql(content);
        System.out.println(resultSql);
    }
}

运行结果

update AAA set A = '1', B =800, C ='1', D = '通过', CONFIRM_FILE = null, E = sysdate, F = '1', G = '1' where ID = 1652 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值