修改mybatis.jar源码实现—mybatis用log4j打印SQL,并且“?”替换成实际数值,打印查询结果集

1、首先打印SQL需要mybatis的jar包,我引入的是mybatis-3.4.4.jar

2、mybatis.xml配置

   <settings>
           <setting name="logImpl" value="STDOUT_LOGGING" />

   </settin>

1)、指定 MyBatis所用日志的具体实现,STDOUT_LOGGING是标准输出

2)、value的可用值:SLF4J、LOG4J、LOG4J2、JDK_LOGGING、COMMONS_LOGGING、                                     STDOUT_LOGGING、NO_LOGGING ;默认值:Not set 

3、log4j.properties正常配置即可

 上面3步即可正常打印SQL

4、打印显示如下
==>  Preparing: select u.id as id ,u.name as name , u.pwd as pwd from user u where u.pwd = ? and u.id = ?; 
==> Parameters: 123(String), 1(String)
<==      Total: 0
5、但是上面的采用的是占位符“?”的形式打印,“?”和值分离了,想打印成如下格式

   ==> Preparing: select u.id as id ,u.name as name , u.pwd as pwd from user u

       where u.pwd = 123 and u.id = 1;

6、想实现上面的打印,需要修改mybatis-3.4.4.jar包

1)、项目/maven dependencies/mybatis-3.4.4.jar/org.apache.ibatis.logging.jdbc.BaseJdbcLogger.class,

       然后通过反编译软件编译成BaseJdbcLogger.java,

2)、随便找一个项目在src/main/java下新建包org.apache.ibatis.logging.jdbc,然后把BaseJdbcLogger.java复制到         此包下

3)、修改BaseJdbcLogger.java

       修改前 debug()

  1. protected void debug(String text, boolean input) {
            if (statementLog.isDebugEnabled()) {
                    statementLog.debug(prefix(input) + text);
            }
    }

       
  2. 修改为
  3. 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:")) {
    			String temp = text.substring(text.indexOf(":") + 1);
    			String[] split = temp.split(",");
    			if (split != null & split.length > 0) {
    				for (String string2 : split) {
    					String s = string2.trim();
    					sql = sql.replaceFirst("\\?", s.substring(0, s.indexOf("(")));
    				}
    			}
    			text = "Preparing:" + sql;
    			sql = "";
    		}
    		statementLog.debug(prefix(input) + text);
    	}
    }

4)、自动编译位.class,BaseJdbcLogger.java和BaseJdbcLogger.class按下图替换



5)、修改替换中eclipse需要关闭,因为项目会用mybatis-3.4.4.jar包,然后打开eclipse,更新一下项目。

7、在控制台打印查询语句结果集

配置log4j2.xml

实现用Log4j2来打印MybatisSQL很简单,先配置一个nameconsolePrint的附加器,指定输出格式 
然后在loggers下配置一个logger,name指向项目持久层接口的package,也就是和Mybatis配置文件对应的接口包,再定义输出方式就可以了

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO" monitorInterval="1800">
    <appenders>
        <Console name="consolePrint" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
    </appenders>

    <loggers>
        <!-- level="TRACE"是打印查询结果集;level="DEBUG"是不打印 -->
        <logger name="DAO层包的路经" level="TRACE" additivity="false">
            <appender-ref ref="consolePrint"/>
        </logger>

        <root level="info">
            <appender-ref ref="consolePrint" />
        </root>
    </loggers>
</Configuration>

   完

猜你喜欢

转载自blog.csdn.net/weixin_39805338/article/details/80855060