博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
打印hibernate的SQL语句的几种办法
阅读量:6869 次
发布时间:2019-06-26

本文共 3061 字,大约阅读时间需要 10 分钟。

摘要

使用hibernate时,我们常常需要查看hibernate实际提交到数据库的SQL及相关参数。这里提供几种方案,供大家在开发中使用。

使用hibernate-configuration

这也许是最简单的一种配置。我们只需要为hibernate配置一个参数,就可以在console中打印出SQL语句。

需要增加的仅仅是这个参数(其它参数略去):

<hibernate-configuration>

    <session-factory>

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

    </session-factory>

</hibernate-configuration>

与打印SQL语句相关的配置,还有两个:format_sql和use_sql_comments。顾名思义,他们配置的是打印SQL时是否进行格式化、以及是否打印出相关的注释。

但是,hibernate自己的配置中,似乎不能将参数绑定到SQL上,SQL语句中只有问号占位符。


 

使用log4j

如果使用log4j,我们需要做的就是为hibernate相应的类配置logger和appender。appender的配置略去(开发中一般就配置为console),logger配置如下:

# log4j.properties文件的配置

log4j.logger.org.hibernate.SQL=DEBUG

log4j.logger.org.hibernate.type=TRACE

# log4j.xml文件的配置

<Logger name="org.hibernate.SQL" level="DEBUG"></Logger>

<Logger name="org.hibernate.type" level="TRACE"></Logger>

上面的配置中,org.hibernate.SQL的日志配置的效果与show_sql=true的配置果相似,都会把SQL语句打印出来。而org.hibernate.type的日志配置,则会把SQL中占位符对应的参数打印出来。两者结合起来,日志结果如下:

Hibernate: INSERT INTO mkyong.stock_transaction (CHANGE, CLOSE, DATE, OPEN, STOCK_ID, VOLUME)VALUES (?, ?, ?, ?, ?, ?)13:33:07,253 DEBUG FloatType:133 - binding '10.0' to parameter: 113:33:07,253 DEBUG FloatType:133 - binding '1.1' to parameter: 213:33:07,253 DEBUG DateType:133 - binding '30 December 2009' to parameter: 313:33:07,269 DEBUG FloatType:133 - binding '1.2' to parameter: 413:33:07,269 DEBUG IntegerType:133 - binding '11' to parameter: 513:33:07,269 DEBUG LongType:133 - binding '1000000' to parameter: 6

 

但是,尽管这种方式能够把SQL和参数都打印出来,但是二者却是分开打印的。如果一段时间内执行的SQL非常多,那么这部分日志会比较的杂乱,对于开发来说帮助并不大。


 

使用p6spy

P6Spy是一个可以用来在应用程序中拦截和修改数据操作语句的开源框架。 通过P6Spy我们可以对SQL语句进行拦截,相当于一个SQL语句的记录器。使用P6spy,我们需要的配置比较复杂,清单如下。

绝对不要把这些配置提交到上线代码中!

首先,我们需要引入相关jar包。

pom.xml

<!--  -->

<dependency>

    <groupId>p6spy</groupId>

    <artifactId>p6spy</artifactId>

    <version>3.0.0</version>

</dependency>

第二,我们需要“处理”一下数据源配置。

spring-db.xml

<bean id="dataSource" class="com.p6spy.engine.spy.P6DataSource">

    <constructor-arg>

        <bean class="com.mchange.v2.c3p0.ComboPooledDataSource"

            destroy-method="close">

            <property name="driverClass" value="org.h2.Driver" />

            <property name="jdbcUrl"

                value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;IGNORECASE=TRUE;MODE=MySQL;MVCC=true" />

            <property name="user" value="sa" />

            <property name="password" value="" />

        </bean>

    </constructor-arg>

</bean>

最后,我们需要为p6spy增加一个配置文件,放到resource路径下。其中可配置项很多,我们可以只配置一部分(例如示例中的三项)。完整配置可以查看他们的官网。

p6spy.properties

# 默认会在项目路径下创建spy.log

logfile = C:/Users/Administrator/Desktop/log/spy.log

# 默认apptend=true,会导致日志文件不断扩大

append=false

# 默认是dd-MMM-yy

databaseDialectDateFormat=yyyy-MM-dd

 

配置好之后,spy.log中应该会有这样的输出。红色字体部分就是带有参数的SQL语句。

1485070310889|0|statement|connection 10|select  as id1_24_, companyacc0_.balance as balance2_24_, companyacc0_.lastUpdateTime as lastUpda3_24_, companyacc0_.type as type4_24_ from company_accounts companyacc0_ where companyacc0_.type=?|select  as id1_24_, companyacc0_.balance as balance2_24_, companyacc0_.lastUpdateTime as lastUpda3_24_, companyacc0_.type as type4_24_ from company_accounts companyacc0_ where companyacc0_.type='MAIN'

 

本文转自 斯然在天边 51CTO博客,原文链接:http://blog.51cto.com/winters1224/1894055,如需转载请自行联系原作者

你可能感兴趣的文章
python套接字编程基础
查看>>
字符串数据结构算法题-C++
查看>>
VS2010快捷键
查看>>
nstall-Package : 无法找到程序包“MySql.Data.Entity.EF6”
查看>>
linux基础命令(基本维护)
查看>>
纯CSS,table的thead固定,tbody显示滚动条
查看>>
ios 11 12以后下拉刷新不回位的解决方法
查看>>
flask 路由规划(blueprint)
查看>>
JAVA正则表达式:Pattern、Matcher、String
查看>>
微信小程序授权保存到相册功能
查看>>
Q152 乘积最大子序列
查看>>
css常用代码含义
查看>>
【万里征程——Windows App开发】控件大集合2
查看>>
struts2学习笔记
查看>>
内核同步机制
查看>>
python 基础(格式化输出,初始编码,数据类型及其操作)
查看>>
重建二叉树
查看>>
Apache 虚拟主机 VirtualHost 配置
查看>>
asp.net mvc 小心Html.RenderAction
查看>>
Calendar类经常用法 日期间的转换 set方法有巨坑
查看>>