[Hibernate] Cấu hình hiển thị hibernate sql parameter - P6Spy

Câu hỏi đặt ra
Có nhiều developer đặt ra câu hỏi về giá trị Hibernate SQL parameter. Làm thế nào để hiển thị giá trị của Hibernate SQL parameter được truyền vào database? Hibernate chỉ hiển thị giá trị tham số dưới dạng dấu hỏi (?). Với property show_sql, Hibernate sẽ hiển thị tất cả các câu SQL được tạo ra, nhưng không hiển thị các giá trị SQL parameter.

Lấy ví dụ
Code:
Hibernate: insert into mkyong.stock_transaction (CHANGE, CLOSE, DATE, OPEN, STOCK_ID, VOLUME)
values (?, ?, ?, ?, ?, ?)
Vậy có cách nào để log hoặc hiển thị giá trị SQL paramerter của Hibernate không?


Giải pháp – P6Spy
Vâng, nếu có câu hỏi, có 1 câu trả lời ~

P6Spy là thư viện để ghi log các câu SQL và parameter trước khi truyền vào database. P6Spy là miễn phí, nó sử dụng để chặn và ghi log các câu SQL tại database vào 1 file log và có thể sử dụng nó cho bất kỳ ứng dụng nào sử dụng JDBC driver.


1. Download P6Spy
Để lấy “p6spy-install.jar“, có thể download tại

  1. P6Spy official website.
  2. P6Spy at Sourceforge.net

2. Giải nén file
Giải nén file p6spy-install.jar file, sẽ nhìn thấy p6spy.jarspy.properties


3. Thêm thư viện vào dependency
Thêm p6spy.jar vào project classpath


4. Chỉnh sửa file cấu hình hibernate
Chỉnh sửa file cấu hình database. Cần thay thế JDBC driver hiện tại bằng P6Spy JDBC driver - ”com.p6spy.engine.spy.P6SpyDriver

Code nguyên thủy sử dụng MySQL JDBC driver – “com.mysql.jdbc.Driver”
XML:
<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.password">password</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="show_sql">true</property>
</session-factory>

Thay đổi thành P6Spy JDBC driver – “com.p6spy.engine.spy.P6SpyDriver”
XML:
<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.password">password</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="show_sql">true</property>
</session-factory>

5. Chỉnh sửa file properties P6Spy
Chỉnh sửa file properties P6Spy – “spy.properties

Thay thế “real driver” bằng MySQL JDBC driver sẵn có

Code:
realdriver=com.mysql.jdbc.Driver

#specifies another driver to use
realdriver2=
#specifies a third driver to use
realdriver3=
Thay đổi vị trí lưu file log
Thay đổi vị trí lưu file log trong property logfile, tất cả các câu SQL sẽ được ghi vào đây.

Windows
Code:
logfile     = c:/spy.log
*nix
Code:
logfile     = /srv/log/spy.log

6. Copy “spy.properties” vào project classpath
Copy “spy.properties” vào project classpath, hãy chắc chắn rằng project có thể xác định vị trí của file “spy.properties”, nếu không, sẽ xảy ra lỗi “spy.properties” file not found exception.


7. Hoàn thành

Chạy project và thực hiện một số thao tác với database, bạn sẽ thấy tất cả các câu SQL được gửi từ app đến database sẽ được ghi vào file đã chỉ định trong “spy.properties”.

Ví dụ file log như sau.
Code:
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)

Kết luận
Thành thật mà nói, P6Spy thực sự hữu ích trong việc giảm thời gian fix bug của developer. Miễn là project đang sử dụng JDBC driver để kết nối database, P6Sqp có thể kết nối với nó và ghi log tất cả các câu SQL và parameter.


Dành cho người sử dụng Maven
Có thể dùng Maven để download P6Spy dependency trong file pom.xml

XML:
<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>1.3</version>
</dependency>
Tuy nhiên, file “spy.properties” không có trong pakage, phải tự tạo nó. Có thể download file mẫu tại - spy.properties.zip


Cám ơn các bạn đã theo dõi. Hẹn gặp lại các bạn trong các bài viết sau :D

Bài viết tham khảo tại: https://mkyong.com/hibernate/how-to-display-hibernate-sql-parameter-values-solution/
 

Bình luận