替换过占位符的SQL日志收集,同时收集Mapper及其参数日志到指定文件

本文介绍了如何收集Mybatis的SQL日志,包括替换过占位符的SQL,以及Mapper方法和参数日志,并将其记录到指定文件。通过复写BaseJdbcLogger的debug方法和PerformanceInterceptor的intercept方法,以及配置分页插件,实现了这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 参数收集

复写Mybatis-3.4.6以来中org.apache.ibatis.logging.jdbc.BaseJdbcLogger类中的debug方法。

package org.apache.ibatis.logging.jdbc;

import java.sql.Array;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.reflection.ArrayUtil;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

/**
 * Base class for proxies to do logging
 * 
 * @author xusanyao
 */
// @Deprecated
public abstract class BaseJdbcLogger {
	public static final String PA_USERID = "X-UserId";
	protected static final Set<String> SET_METHODS = new HashSet<String>();
	protected static final Set<String> EXECUTE_METHODS = new HashSet<String>();

	private final Map<Object, Object> columnMap = new HashMap<Object, Object>();

	private final List<Object> columnNames = new ArrayList<Object>();
	private final List<Object> columnValues = new ArrayList<Object>();

	protected Log statementLog;
	protected int queryStack;

	/*
	 * Default constructor
	 */
	public BaseJdbcLogger(Log log, int queryStack) {
		this.statementLog = log;
		if (queryStack == 0) {
			this.queryStack = 1;
		} else {
			this.queryStack = queryStack;
		}
	}

	static {
		SET_METHODS.add("setString");
		SET_METHODS.add("setNString");
		SET_METHODS.add("setInt");
		SET_METHODS.add("setByte");
		SET_METHODS.add("setShort");
		SET_METHODS.add("setLong");
		SET_METHODS.add("setDouble");
		SET_METHODS.add("setFloat");
		SET_METHODS.add("setTimestamp");
		SET_METHODS.add("setDate");
		SET_METHODS.add("setTime");
		SET_METHODS.add("setArray");
		SET_METHODS.add("setBigDecimal");
		SET_METHODS.add("setAsciiStream");
		SET_METHODS.add("setBinaryStream");
		SET_METHODS.add("setBlob");
		SET_METHODS.add("setBoolean");
		SET_METHODS.add("setBytes");
		SET_METHODS.add("setCharacterStream");
		SET_METHODS.add("setNCharacterStream");
		SET_METHODS.add("setClob");
		SET_METHODS.add("setNClob");
		SET_METHODS.add("setObject");
		SET_METHODS.add("setNull");

		EXECUTE_METHODS.add("execute");
		EXECUTE_METHODS.add("executeUpdate");
		EXECUTE_METHODS.add("executeQuery");
		EXECUTE_METHODS.add("addBatch");
	}

	protected void setColumn(Object key, Object value) {
		columnMap.put(key, value);
		columnNames.add(key);
		columnValues.add(value);
	}

	protected Object getColumn(Object key) {
		return columnMap.get(key);
	}

	protected String getParameterValueString() {
		List<Object> typeList = new ArrayList<Object>(columnValues.size());
		for (Object value : columnValues) {
			if (value == null) {
				typeList.add("null");
			} else {
				typeList.add(objectValueString(value) + "(" + value.getClass().getSimpleName() + ")");
			}
		}
		final String parameters = typeList.toString();
		return parameters.substring(1, parameters.length() - 1);
	}

	protected String objectValueString(Object value) {
		if (value instanceof Array) {
			try {
				return ArrayUtil.toString(((Array) value).getArray());
			} catch (SQLException e) {
				return value.toString();
			}
		}
		return value.toString();
	}

	protected String getColumnString() {
		return columnNames.toString();
	}

	protected void clearColumnInfo() {
		columnMap.clear();
		columnNames.clear();
		columnValues.clear();
	}

	protected String removeBreakingWhitespace(String original) {
		StringTokenizer whitespaceStripper = new StringTokenizer(original);
		StringBuilder builder = new StringBuilder();
		while (whitespaceStripper.hasMoreTokens()) {
			builder.append(whitespaceStripper.nextToken());
			builder.append(" ");
		}
		return builder.toString();
	}

	protected boolean isDebugEnabled() {
		return statementLog.isDebugEnabled();
	}

	protected boolean isTraceEnabled() {
		return statementLog.isTraceEnabled();
	}

	private static String sql = "";

	protected void debug(String text, boolean input) {
		text = text.trim();
		if (statementLog.isDebugEnabled()) {
			// if (text.startsWith("Preparing:")) {
			// sql = text.substring(text.indexOf(":") + 1);
			// return;
			// }
			if (text.startsWith("Parameters:")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值