以com.springsource.com.ibatis-2.3.4.726.jar进行说明
pom.xml
<dependency> <groupId>org.apache.ibatis</groupId> <artifactId>com.springsource.com.ibatis</artifactId> <version>2.3.4.726</version> </dependency>打印SQL的java代码
/* * Copyright 2004 Clinton Begin * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.ibatis.common.jdbc.logging;
import com.ibatis.common.beans.ClassInfo; import com.ibatis.common.logging.Log; import com.ibatis.common.logging.LogFactory;
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet;
/** * PreparedStatement proxy to add logging */ public class PreparedStatementLogProxy extends BaseLogProxy implements InvocationHandler {
private static final Log log = LogFactory.getLog(PreparedStatement.class);
private PreparedStatement statement; private String sql;
private PreparedStatementLogProxy(PreparedStatement stmt, String sql) { this.statement = stmt; this.sql = sql; }
public Object invoke(Object proxy, Method method, Object[] params) throws Throwable { try { if (EXECUTE_METHODS.contains(method.getName())) { if (log.isDebugEnabled()) { log.debug("{pstm-" + id + "} Executing Statement: " + removeBreakingWhitespace(sql)); log.debug("{pstm-" + id + "} Parameters: " + getValueString()); log.debug("{pstm-" + id + "} Types: " + getTypeString()); } clearColumnInfo(); if ("executeQuery".equals(method.getName())) { ResultSet rs = (ResultSet) method.invoke(statement, params); if ( rs != null ) { return ResultSetLogProxy.newInstance(rs); } else { return null; } } else { return method.invoke(statement, params); } } else if (SET_METHODS.contains(method.getName())) { if ("setNull".equals(method.getName())) { setColumn(params[0], null); } else { setColumn(params[0], params[1]); } return method.invoke(statement, params); } else if ("getResultSet".equals(method.getName())) { ResultSet rs = (ResultSet) method.invoke(statement, params); if ( rs != null ) { return ResultSetLogProxy.newInstance(rs); } else { return null; } } else if ("equals".equals(method.getName())) { Object ps = params[0]; if (ps instanceof Proxy) { return new Boolean(proxy == ps); } return new Boolean(false); } else if ("hashCode".equals(method.getName())) { return new Integer(proxy.hashCode()); } else { return method.invoke(statement, params); } } catch (Throwable t) { throw ClassInfo.unwrapThrowable(t); } }
/** * Creates a logging version of a PreparedStatement * @param stmt - the statement * @param sql - the sql statement * @return - the proxy */ public static PreparedStatement newInstance(PreparedStatement stmt, String sql) { InvocationHandler handler = new PreparedStatementLogProxy(stmt, sql); ClassLoader cl = PreparedStatement.class.getClassLoader(); return (PreparedStatement) Proxy.newProxyInstance(cl, new Class[]{PreparedStatement.class, CallableStatement.class}, handler); } /** * Return the wrapped prepared statement * @return the PreparedStatement */ public PreparedStatement getPreparedStatement() { return statement; }
}
如果使用log4j进行打印,配置如下:
log4j.rootLogger=DEBUG
log4j.logger.com.ibatis=DEBUG log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG