打印hibernate的SQL語句的幾種辦法


摘要

使用hibernate時,咱們經常須要查看hibernate實際提交到數據庫的SQL及相關參數。這裏提供幾種方案,供你們在開發中使用。html

使用hibernate-configuration

這也許是最簡單的一種配置。咱們只須要爲hibernate配置一個參數,就能夠在console中打印出SQL語句。spring

須要增長的僅僅是這個參數(其它參數略去):sql

<hibernate-configuration>數據庫

    <session-factory>session

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

    </session-factory>框架

</hibernate-configuration>ide

與打印SQL語句相關的配置,還有兩個:format_sql和use_sql_comments。顧名思義,他們配置的是打印SQL時是否進行格式化、以及是否打印出相關的註釋。字體

可是,hibernate本身的配置中,彷佛不能將參數綁定到SQL上,SQL語句中只有問號佔位符。spa


 

使用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: 1
13:33:07,253 DEBUG FloatType:133 - binding '1.1' to parameter: 2
13:33:07,253 DEBUG DateType:133 - binding '30 December 2009' to parameter: 3
13:33:07,269 DEBUG FloatType:133 - binding '1.2' to parameter: 4
13:33:07,269 DEBUG IntegerType:133 - binding '11' to parameter: 5
13:33:07,269 DEBUG LongType:133 - binding '1000000' to parameter: 6

 

可是,儘管這種方式可以把SQL和參數都打印出來,可是兩者倒是分開打印的。若是一段時間內執行的SQL很是多,那麼這部分日誌會比較的雜亂,對於開發來講幫助並不大。


 

使用p6spy

P6Spy是一個能夠用來在應用程序中攔截和修改數據操做語句的開源框架。 經過P6Spy咱們能夠對SQL語句進行攔截,至關於一個SQL語句的記錄器。使用P6spy,咱們須要的配置比較複雜,清單以下。

絕對不要把這些配置提交到上線代碼中!


首先,咱們須要引入相關jar包。

pom.xml

<!-- https://mvnrepository.com/artifact/p6spy/p6spy -->

<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 companyacc0_.id 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 companyacc0_.id 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'

 


 

參考

使用hibernate的show_sql方式配置:http://www.mkyong.com/hibernate/hibernate-display-generated-sql-to-console-show_sql-format_sql-and-use_sql_comments/

使用Log4j配置:http://www.mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-log4j/

使用P6spy配置:http://www.mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-solution/

P6spy官方配置說明:http://p6spy.readthedocs.io/en/latest/configandusage.html

相關文章
相關標籤/搜索