您的位置:首页 > 数据库

利用log4j显示hibernate打印sql中的参数

2016-05-19 16:27 453 查看
利用log4j显示hibernate打印sql中的参数

大家都知道在 hibernate.cfg.xml 配置文件中添加以下三条配置,就可以在控制台显示执行的sql:

[html] view
plain copy

 





<!-- 是否显示sql   -->  

<property name="show_sql">true</property>  

<!-- 是否格式化sql -->  

<property name="format_sql">true</property>  

<!-- 是否使用注释  -->  

<property name="use_sql_comments">true</property>  

肯定遇到过这种情况:

[html] view
plain copy

 





/* insert cn.javasd.hibernate.ZlpUser  

       */ insert   

       into  

           ZlpUser  

           (name, password, createTime, expireTime, id)   

       values  

           (?, ?, ?, ?, ?)  

?的地方的值并不知道,当然可以跟踪程序断点获得,但是为了方便监控,可以使用log4j的配置来给这些占位符进行参数绑定(bind)

 

具体配置如下(单在hibernate环境下,未整合spring):

文件名:log4j.properties (根目录下)

[html] view
plain copy

 





### direct log messages to stdout ###    

        log4j.appender.stdout=org.apache.log4j.ConsoleAppender    

        log4j.appender.stdout.Target=System.out    

        log4j.appender.stdout.layout=org.apache.log4j.PatternLayout    

        log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n    

            

        log4j.logger.org.hibernate=debug  

        log4j.logger.org.hibernate.hql.ast.AST=debug   

          

        #下面的两条配置非常重要,设置为trace后,将可以看到打印出sql中 ? 占位符的实际内容  

        #this is the most important config for showing parames like ?  

        log4j.logger.org.hibernate.SQL=trace   

        log4j.logger.org.hibernate.type=trace  

        #above two configs   

        log4j.logger.org.hibernate.tool.hbm2ddl=debug   

        log4j.logger.org.hibernate.hql=debug   

        log4j.logger.org.hibernate.cache=debug  

  

  

        log4j.logger.org.hibernate.transaction=debug   

        log4j.logger.org.hibernate.jdbc=debug   

        log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace  

  

            

        log4j.rootLogger=warn, stdout    

        log4j.logger.org.hibernate.type.descriptor.sql.BasicBinder=TRACE  

[html] view
plain copy

 





打印后的结果如下:  

  

   

  

Hibernate:   

    /* insert cn.javasd.hibernate.ZlpUser  

        */ insert   

        into  

            ZlpUser  

            (name, password, createTime, expireTime, id)   

        values  

            (?, ?, ?, ?, ?)  

16:09:06,280 TRACE StringType:151 - binding '张路平2212' to parameter: 1  

  16:09:06,284 TRACE StringType:151 - binding '3839729' to parameter: 2  

  16:09:06,287 TRACE TimestampType:151 - binding '2013-01-16 16:09:06' to parameter: 3  

  16:09:06,294 TRACE TimestampType:151 - binding '2013-01-16 16:09:06' to parameter: 4  

  16:09:06,295 TRACE StringType:151 - binding '402881e13c426784013c426785cf0001' to parameter: 5  

当然,输出的结果中有很多对于自己不必要的信息,可以通过调整log4j的内容来控制输出,那几个debug的信息都可以注掉,其实 log4j.logger.org.hibernate.SQL=trace  这条也可以注掉,不然会打印出两遍sql

 

最后要说一下配置log4j需要注意的一些地方,特别是引入jar包的时候:

1、因为Hibernate 3用的是slf4j,因此要想使用log4j配置文件来全面配置Hibernate日志,

     还需要添加slf4j-log4j12-XX.jar。注意,如果添加了此jar包,需要移除slf4j-nop-XX.jar,

     否则控制台会有“Multiple bindings were found on the class path ”错误。

2、需要添加log4j-x.x.xx.jar

3、添加slf4j-api-x.x.x.jar

 

最后,附件是一个使用了这个配置的小例子

 

 也可以使用 p6spy 来配置,有兴趣的可以试一下,其实就是对jdbc做了代理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息