`
derek_z
  • 浏览: 16755 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Mybatis 打印完整sql

 
阅读更多
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;
	}
}

 

分享到:
评论

相关推荐

    ideal mybatis打印sql插件

    把 mybatis 输出的sql日志还原成完整的sql语句。 将日志输出的sql语句中的问号 ? 替换成真正的参数值。 通过 "Tools -&gt; MyBatis Log Plugin" 菜单或快捷键 "Ctrl+Shift+Alt+O" 启用。 点击窗口左边的 "Filter" ...

    mybatis打印出sql

    配置MyBatis打印SQL的关键在于正确配置Log4j以及MyBatis的SqlSessionFactory。首先,我们需要使用提供的`log4j.properties`文件进行配置。这个文件是Log4j的日志配置文件,通过它可以设定不同级别的日志输出,例如...

    mybatis慢SQL插件

    拦截器监控慢SQL并将完整的可执行的SQL语句打印在日志文件中,复制该SQL语句即可在数据库工具中执行。 使用方法: 找到你springboot项目中的配置文件,增加如下配置即可 application.yml 配置如下: sql: slow...

    idea mybatislog 日志打印 打印完整sql

    如果你的项目中没有明确指定日志框架,MyBatis将无法打印SQL。因此,确保项目中包含一个有效的日志实现库是第一步。 1. **配置日志框架**: - **Log4j**: 在项目中添加log4j的依赖,并在`log4j.properties`或`log4...

    idea插件-mybatis-打印sql

    本文将深入探讨如何在IntelliJ IDEA中安装并使用"MyBatis Log Plugin"插件,以实现MyBatis SQL打印功能,帮助开发者更便捷地进行数据库调试。 首先,我们需要了解"MyBatis Log Plugin"插件的作用。MyBatis是一个...

    mybatis Sql打印两种方式

    MyBatis提供了一种更灵活的方式来打印SQL,即使用拦截器(Interceptor)。拦截器可以拦截并处理MyBatis执行过程中的各种事件,例如SQL的准备、执行等。要实现SQL打印,我们可以自定义一个拦截器类,继承`org.apache...

    mybatis 插件: 打印 sql 及其执行时间实现方法

    MyBatis 插件:打印 SQL 及其执行时间实现方法 MyBatis 提供了插件机制,允许开发者在特定的点拦截已经映射语句的执行。默认情况下,MyBatis 允许使用插件来拦截方法调用,例如 Executor、ParameterHandler、...

    mybatisx,一款打印项目sql在日志中的插件

    - 在开发环境中使用,避免在生产环境中大量打印SQL日志,以免对性能造成影响。 总的来说,MybatisX作为一款强大的Mybatis插件,为开发人员提供了方便、高效的SQL调试工具,有助于提升项目的质量和开发效率。通过对...

    Mybatis Log(自动填充sql参数打印到控制台)

    在执行`getUserByUsernameAndStatus`方法时,Mybatis会自动填充SQL参数,并将完整的SQL语句(包括参数值)打印到控制台。例如,如果传入的参数是`username='test'`和`status='active'`,控制台将输出如下内容: ```...

    eclipse开发java使用mybatis打印不带问号的可执行sql

    本人开发人员,平常也是在CSDN下载资料,现在不需要积分的少了,所以我也得赚点积分,绝对提高你的开发效率。eclipse开发java使用mybatis打印不带问号的可执行sql

    mybatis+spring 框架中配置日志中显示sql语句

    为了打印SQL,我们需要将`logger`的级别设为`DEBUG`,并包含MyBatis的包名。以下是一个基本的`logback.xml`示例: ```xml &lt;pattern&gt;%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n ...

    原样输出mybatis的sql执行语句(mysql和oracle都可用).zip

    我们可以创建一个自定义的AOP切面,拦截MyBatis的SqlSession操作,记录并打印SQL语句。首先,定义一个切入点表达式,例如: ```java @Pointcut("execution(* org.apache.ibatis.session.defaults....

    Mybatis拦截器实现统计sql执行时间及打印完整sql语句

    在本例中,我们关注的是如何使用拦截器来实现 SQL 执行时间的统计以及打印完整的 SQL 语句。这在调试和性能优化时非常有用,因为它能帮助我们了解哪些 SQL 查询可能成为性能瓶颈。 首先,我们需要创建一个实现了 ...

    Mybatis日志中的SQL解析工具(网页版).html

    Mybatis日志中的SQL解析工具(网页版) 说明:复制日志时,必须注意,日志必须包含Preparing:和Parameters:全部内容,而且日志换行格式要保留,不要复制成纯文本,直接ctrl+c即可。

    idea插件mybaits log 打印sql语句

    标题 "idea插件mybaits log 打印sql语句" 涉及的是一个针对IntelliJ IDEA的MyBatis日志插件,它的主要功能是帮助开发者在开发过程中实时查看并打印出MyBatis执行的SQL语句。这个功能对于调试和优化数据库查询非常...

    mybatis打印日志实例

    运行测试程序(位于`test`包下)时,MyBatis将会按照配置打印出SQL语句及其执行信息,这对于我们理解和优化SQL性能非常有帮助。例如,你可以看到每个SQL语句的执行时间,以及动态SQL生成的实际SQL语句。 在实际应用...

    mybatis打印SQL的log4j

    要让MyBatis使用Log4j打印SQL,我们需要进行以下步骤: 1. **引入Log4j依赖**:在项目中添加Log4j的依赖库,通常是在Maven或Gradle的构建文件中指定。如果使用的是JAR包,需要将其放入项目的类路径中。 2. **配置...

    mybatis查询入门(log4j控制台sql语句日记输出的)

    【标题】"mybatis查询入门(log4j控制台sql语句日记输出的)"涉及的知识点主要集中在MyBatis框架的基础使用以及如何通过Log4j在控制台输出SQL语句,以便于调试和优化数据库操作。MyBatis是一个轻量级的Java持久层框架...

    mybatis-plus配置控制台打印完整带参数SQL语句的实现

    在Java开发中,MyBatis-Plus是一个基于MyBatis的增强工具,它简化了许多常见的数据库操作。在开发过程中,为了方便...在实际项目中,根据项目的日志管理需求,可以选择适合的日志框架,并正确配置以满足打印SQL的需求。

    mybatis SQL日志解析

    mybatis SQL日志解析;查看日志时mybatis打印的日志查询条件以及参数不是拼接好的,想复制对应sql在本地执行时比较麻烦,通过前端编写页面进行日志解析,拼接sql中的问号以及参数变课轻松实现

Global site tag (gtag.js) - Google Analytics