乐者为王

Do one thing, and do it well.

如何显示Hibernate的SQL参数值-P6Spy

英文原文:http://www.mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-solution/

问题

有许多开发者问及Hibernate的SQL参数值问题。如何显示Hibernate传递给数据库的SQL参数值?Hibernate只会把所有的参数值显示为问号(?)。使用show_sql属性,Hibernate会显示所有生成的SQL语句,但不显示SQL参数值。

例如:

1
2
Hibernate: insert into mkyong.stock_transaction (CHANGE, CLOSE, DATE, OPEN, STOCK_ID, VOLUME)
values (?, ?, ?, ?, ?, ?)

有没有办法记录或显示确切的Hibernate的SQL参数值呢?

解决方案-P6Spy

好吧,如果有问题那么肯定就会有答案~

P6Spy是一个可以在SQL语句和参数值被发送到数据库之前把它们都记录下来的实用库。P6Spy是免费的,它拦截并记录所有数据库SQL语句到一个日志文件中,它适用于任何使用JDBC驱动的应用程序。

1. 下载P6Spy库

获取p6spy-install.jar,你可以从以下地址下载:

  1. P6Spy官方网站
  2. P6Spy在Sourceforge.net

2. 解压

解压p6spy-install.jar文件,查找p6spy.jar和spy.properties。

3. 添加库依赖

把p6spy.jar添加到项目库依赖中。

4. 修改P6Spy属性文件

修改数据库配置文件。你需要把现有的JDBC驱动替换为P6Spy的JDBC驱动——com.p6spy.engine.spy.P6SpyDriver。

原来的是MySQL的JDBC驱动——com.mysql.jdbc.Driver:

1
2
3
4
5
6
7
8
9
<session-factory>
    <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">password</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="show_sql">true</property>
</session-factory>

把它改成P6Spy的JDBC驱动——com.p6spy.engine.spy.P6SpyDriver:

1
2
3
4
5
6
7
8
9
<session-factory>
    <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
    <property name="hibernate.connection.driver_class">com.p6spy.engine.spy.P6SpyDriver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">password</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="show_sql">true</property>
</session-factory>

5. 修改P6Spy属性文件

修改P6Spy属性文件——spy.properties。

用现有的MySQL的JDBC驱动替换“real driver”:

1
2
3
4
5
6
realdriver=com.mysql.jdbc.Driver

#specifies another driver to use
realdriver2=
#specifies a third driver to use
realdriver3=

修改logfile属性中的日志文件位置,所有的SQL语句将会被记录到这个文件里。

Windows

1
logfile     = c:/spy.log

*nix

1
logfile     = /srv/log/spy.log

6. 把spy.properties复制到项目的classpath

把spy.properties复制到项目根目录,确保项目可以定位到spy.properties,否则它会提示spy.properties文件没有找到。

7. 完成

运行应用程序并做一些数据库事务,你会注意到所有从应用程序发送到数据库的SQL语句将被记录到你在spy.properties中指定的一个文件中。

示例日志文件如下:

1
2
3
4
insert into mkyong.stock_transaction (CHANGE, CLOSE, DATE, OPEN, STOCK_ID, VOLUME)
values (?, ?, ?, ?, ?, ?)|
insert into mkyong.stock_transaction (CHANGE, CLOSE, DATE, OPEN, STOCK_ID, VOLUME)
values (10.0, 1.1, '2009-12-30', 1.2, 11, 1000000)

总结

坦率地说,P6Spy在减少开发者的调试时间方面非常有用。只要你的项目是使用JDBC驱动来连接,P6Spy就能够为你记录所有的SQL语句和参数值。

对于Maven用户

你可以在pom.xml中添加以下内容来下载P6Spy依赖:

1
2
3
4
5
<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>1.3</version>
</dependency>

不过下载下来的包中并没有spy.properties文件,你必须自己创建它。或者你可以下载这里的——spy.properties模板。

参考资料

  1. P6Spy configuration

Comments