Cách xem các câu lệnh SQL được sinh ra bởi JPA/Hibernate trong Spring Boot

Spring JDBC và JPA cung cấp các API cho phép chúng ta làm việc với các API của JDBC mà không cần thông qua các câu lệnh SQL thuần tuý. Điều này rất tiện lợi khi các API này đảm nhận nhiệm vụ sinh ra các câu SQL thuần tuý tương ứng với từng database. Do vậy chúng ta chỉ cần triển khai các câu lệnh SQL 1 lần duy nhất thông qua các API của JPA và Spring JDBC.

Tiện lợi là vậy, nhưng đôi lúc những câu truy vấn hoạt động không như chúng ta mong muốn, và nhu cầu chúng ta cần phải xem các câu lệnh SQL thuần tuý bên dưới được sinh ra như thế này để có thể dễ dàng debug, hoạt có thể kiểm thử với những câu lệnh sql này.

Trong bài viết này, mình sẽ cung cấp một số cách để có thể xem những câu lệnh SQL thuần tuý được sinh ra trông như thế nào, vì mặc định chúng sẽ bị ẩn bởi Spring Boot.

Logging JPA Query

Cách đơn giản nhất để có thể xem các câu truy vấn xuất ra các thiết bị output như màn hình console v.v là thêm một thuộc tính vào file application.properties.

spring.jpa.show-sql=true

Để câu truy vấn xuất ra màn hình có định dạng rõ ràng và dễ nhìn hơn chúng ta thêm

spring.jpa.properties.hibernate.format_sql=true

Mặc dù cách này cực kỳ đơn giản, nhưng nó không được khuyến khích vì nó xuất trực tiếp các câu truy vấn ra các thiết bị output mà không có bất kỳ một sự tối ưu nào từ các logging framework.

Ngoài ra, đối với cách này thì các tham số đầu vào cho các câu truy vấn cũng không được xuất ra.

Bây giờ, hãy xem cách chúng ta có thể ghi các câu lệnh SQL bằng cách định cấu hình trìnhl oggers trong file cấu hình application.properties.

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

Dòng đầu tiên ghi các truy vấn SQL và câu lệnh thứ hai ghi các tham số câu lệnh đã chuẩn bị.

Thuộc tính 

spring.jpa.properties.hibernate.format_sql=true

Cũng sẽ hoạt động cho các cấu hình này. Bằng cách thiết lập các thuộc tính này, các thông tin về câu truy vấn sẽ được gửi đến các thư viện logger mà dự án đang sử dụng. Mặc định Spring Boot sử dụng logback là thư viện logger mặc định.

Logging JdbcTemplate query

Để cấu hình ghi lại các câu lệnh SQL khi sử dụng JdbcTemplate, chúng ta cần các thuộc tính sau:

logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG
logging.level.org.springframework.jdbc.core.StatementCreatorUtils=TRACE

Tương tự như cấu hình trong JPA, dòng đầu tiên dành cho các câu lệnh ghi log và dòng thứ hai là ghi các tham số của các câu lệnh đã chuẩn bị.

Cách hoạt động của Logging

Các Spring/Hibernate class sinh ra các câu lệnh SQL cùng với các tham số đầu vào đã có triển khai log cho chúng. Tuy nhiên level-log của chúng là DEBUG và TRACE thấp hơn log-level mặc định của Spring Boot là INFO.

Bằng các cấu hình trên, chúng ta sẽ chuyển log-level xuống thấp hơn tương ứng với log-level mà Hibernate sử dụng, lúc này chúng ta có thể thấy được các câu truy vấn được sinh ra.

Kết bài

Qua bài viết ngắn này chúng ta đã biết cách cấu hình để có thể xem được các câu truy vấn được sinh ra bởi JPA. Điều này rất cần thiết trong quá trình phát triển ứng dụng, các developer sẽ có thể dễ dàng tìm ra được các lỗ hỏng và sửa một cách nhanh chóng bằng cách phân tích các câu truy vấn này.

Nguồn tham khảo

https://www.baeldung.com/sql-logging-spring-boot

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x