package org.apache.ibatis.logging.jdbc; 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; import org.apache.commons.lang.StringUtils; import org.apache.ibatis.logging.Log; import org.apache.ibatis.reflection.ExceptionUtil; import com.alibaba.druid.pool.DruidPooledPreparedStatement; public final class PreparedStatementLogger extends BaseJdbcLogger implements InvocationHandler { private PreparedStatement statement; private PreparedStatementLogger(PreparedStatement stmt, Log statementLog, int queryStack) { super(statementLog, queryStack); this.statement = stmt; } public Object invoke(Object proxy, Method method, Object[] params) throws Throwable { try { if (Object.class.equals(method.getDeclaringClass())) { return method.invoke(this, params); } if (EXECUTE_METHODS.contains(method.getName())) { if (isDebugEnabled()) { debug("Parameters: " + getParameterValueString(), true); /***********************反编译源文件修改内容 begin *********************************/ /***输出带参数的完整sql语句 zhaochongli 2015/10/21 **/ try { if(this.statement instanceof DruidPooledPreparedStatement){ DruidPooledPreparedStatement b = (DruidPooledPreparedStatement) this.statement; String sql = b.getSql(); String p = getParameterValueString(); if(StringUtils.isNotBlank(p)){ String [] pms = p.replace(" ", "").split(","); if(pms.length > 0){ for(int i=0;i<pms.length;i++){ String val [] = pms[i].split("\\("); if(val.length >1){ if(val[1].indexOf("String") != -1){ sql = sql.replaceFirst("\\?", "'"+val[0]+"'"); }else{ sql = sql.replaceFirst("\\?", val[0]); } }else{ sql = sql.replaceFirst("\\?", val[0]); } } } } debug("SQL: "+sql.replace("\n", "").replace("\t", ""),true); } } catch (Exception e) { debug("组装sql失败" + e.getMessage(),true); } /***********************反编译源文件修改内容 end *********************************/ } clearColumnInfo(); if ("executeQuery".equals(method.getName())) { ResultSet rs = (ResultSet) method.invoke(this.statement, params); return rs == null ? null : ResultSetLogger.newInstance(rs, this.statementLog, this.queryStack); } return method.invoke(this.statement, params); } if (SET_METHODS.contains(method.getName())) { if ("setNull".equals(method.getName())) setColumn(params[0], null); else { setColumn(params[0], params[1]); } return method.invoke(this.statement, params); } if ("getResultSet".equals(method.getName())) { ResultSet rs = (ResultSet) method.invoke(this.statement, params); return rs == null ? null : ResultSetLogger.newInstance(rs, this.statementLog, this.queryStack); } if ("getUpdateCount".equals(method.getName())) { int updateCount = ((Integer) method.invoke(this.statement, params)).intValue(); if (updateCount != -1) { debug(" Updates: " + updateCount, false); } return Integer.valueOf(updateCount); } return method.invoke(this.statement, params); } catch (Throwable t) { throw ExceptionUtil.unwrapThrowable(t); } } public static PreparedStatement newInstance(PreparedStatement stmt, Log statementLog, int queryStack) { InvocationHandler handler = new PreparedStatementLogger(stmt, statementLog, queryStack); ClassLoader cl = PreparedStatement.class.getClassLoader(); return (PreparedStatement) Proxy.newProxyInstance(cl, new Class[] { PreparedStatement.class, CallableStatement.class }, handler); } public PreparedStatement getPreparedStatement() { return this.statement; } }
相关推荐
把 mybatis 输出的sql日志还原成完整的sql语句。 将日志输出的sql语句中的问号 ? 替换成真正的参数值。 通过 "Tools -> MyBatis Log Plugin" 菜单或快捷键 "Ctrl+Shift+Alt+O" 启用。 点击窗口左边的 "Filter" ...
用于mybatis打印出sql语句。内含log4j-1.2.16.jar 和 配置好的log4j.properties文件
拦截器监控慢SQL并将完整的可执行的SQL语句打印在日志文件中,复制该SQL语句即可在数据库工具中执行。 使用方法: 找到你springboot项目中的配置文件,增加如下配置即可 application.yml 配置如下: sql: slow...
idea mybatislog 日志打印 打印完整sql
1.log4j配置sql打印 (sql参数?) 2.mybatis拦截器sql打印(sql参数 实参)
2021版idea安装MyBatis Log Plugin不可用解决方案,idea安装插件2021idea-mybatis_log_plugin可以打印日志mysql
Mybatis Log(自动填充sql参数打印到控制台)
下面小编就为大家带来一篇mybatis 插件: 打印 sql 及其执行时间实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本人开发人员,平常也是在CSDN下载资料,现在不需要积分的少了,所以我也得赚点积分,绝对提高你的开发效率。eclipse开发java使用mybatis打印不带问号的可执行sql
Mybatis日志中的SQL解析工具(网页版) 说明:复制日志时,必须注意,日志必须包含Preparing:和Parameters:全部内容,而且日志换行格式要保留,不要复制成纯文本,直接ctrl+c即可。
mybatis+spring 框架中配置日志中显示sql语句
mybatis打印SQL的log4j
<plugin interceptor="com.zheling.interceptor.FullSQLInterceptor"/>
mybatis打印日志,后台显示日志信息,直接运行test包下的测试程序,即可在后台查看到日志信息
mybatis SQL日志解析;查看日志时mybatis打印的日志查询条件以及参数不是拼接好的,想复制对应sql在本地执行时比较麻烦,通过前端编写页面进行日志解析,拼接sql中的问号以及参数变课轻松实现
主要介绍了mybatis-plus配置控制台打印完整带参数SQL语句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架,下面给大家介绍Mybatis控制台打印Sql语句的实现代码,非常不错,感兴趣的朋友一起看下吧
亲测可用,jar包直接拖到idea窗口即可
springboot整合mybatis和logback 动态打印sql日志 不同包下的日志不同文件输出
主要介绍了springboot+mybatis配置控制台打印sql日志的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧