控制台打印Hibernate的SQL语句显示绑定参数值

时间:2021-06-09 07:23:14

问题?

使用Hibernate提供的show_sql内置属性true只能输出类似于下面的SQL语句:
Hibernate:   
insert into user(name,password) values (?, ?)

这样不利于程序的调试,怎么可以显示具体参数的值?

解决方法:

一、使用第三方jar包p6spy:

下面介绍一下p6spy的使用步骤:
1 http://pan.baidu.com/s/1ksn7G 下载p6spy包。
2 解压出p6spy.jar 和spy.properties两个文件
3 pp6spy.jar 放入应用程序的WEB-INF/lib目录,将spy.properties放入src目录下
4 修改spy.properties的realdriver = com.mysql.jdbc.Driver
5 修改hibernate.cfg.xml,修改connection.driver_class的值为com.p6spy.engine.spy.P6SpyDriver

<property name="connection.driver_class">
	com.p6spy.engine.spy.P6SpyDriver
</property>

6.修改spy.properties文件里的deregisterdrivers=false改为deregisterdrivers=true

spy.properties介绍
1.excludecategories这个是定义你不喜欢的输出信息,也就是说他的值将不会被输出到log或打印在控制台.值有: error, info, batch, debug, statement,commit, rollback, result, resultset.这里的resultset是请通过修改源码,官方是不支持屏蔽到这个属性的.
2.appender,这个是定义你的输出指向,是输出到log4j,还是控制台,还是文件.
3.logfile,这个属性是定义你的log日志文件的存放位置.自己任意即可,如果你没选择输出到配置文件,其值默认即可.
4.append,这个属性是定义当你指定输出到文件的时候,是每次都追加到文件末尾还是每次覆盖,一般的都是追加吧 true即可.

配置这些之后打印出来的sql的参数就可以看到具体的值了,不过使用p6spy生成的语句没有格式化,不方便阅读。所有可以使用第二种方法。

二、使用log4j显示hibernate sql语句的值

log4j.properties的配置

log4j.logger.org.hibernate.type属性的值为debug或者trace

log4j.rootLogger=INFO,stdout
# Log everything. Good for troubleshooting
log4j.logger.org.hibernate=INFO
# Log all JDBC parameters
log4j.logger.org.hibernate.type=ALL

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 %5p %c{1}:%L - %m%n

 运行结果:可以显示具体的参数信息

Hibernate: insert into user (password, username) values (?, ?)
2013-12-17 23:43:04,236 TRACE StringType:151 - binding '参数1内容' to parameter: 1
2013-12-17 23:43:04,236 TRACE StringType:151 - binding '参数2内容' to parameter: 2

源码