1. 程式人生 > 其它 >Spring Data Jpa:列印可執行Sql

Spring Data Jpa:列印可執行Sql

預設情況下:開啟列印 jpa 的sql,配置如下:

spring:
  jpa:
    show-sql: true # 預設false,在日誌裡顯示執行的sql語句

列印效果:

這裡打印出來的sql種引數都是問號,複製出來無法使用。

那麼在配置檔案中加上:

logging:
  level:
    org.hibernate.type.descriptor.sql.BasicBinder: trace

加上這行配置後:

儘管打印出引數,但是sql中的引數還是問號,無法直接執行。

這時候我們可以使用p6spy去列印sql:

引入依賴:

        <dependency>
            <groupId>p6spy</groupId>
            <artifactId>p6spy</artifactId>
            <version>3.8.6</version>
        </dependency>

增加p6spy的配置檔案spy.properties在resource目錄下:spy.properties

autoflush=false
dateformat=yyyy-MM-dd HH:mm:ss
reloadproperties=true
reloadpropertiesinterval=60

appender=com.p6spy.engine.spy.appender.Slf4JLogger
logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
customLogMessageFormat=%(executionTime)ms | %(sqlSingleLine)

databaseDialectDateFormat=yyyy-MM-dd HH:mm:ss
databaseDialectBooleanFormat=boolean

jmx=false

excludecategories=info,debug,result,resultset,batch,commit,rollback

修改application.yml:

spring:
  # 配置資料來源資訊
  datasource:
    #driverClassName: com.mysql.cj.jdbc.Driver
    #url: jdbc:mysql://localhost:3306/study?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
    username: root
    password: 1234
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    url: jdbc:p6spy:mysql://localhost:3306/study?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
  jpa:
    #show-sql: true # 預設false,在日誌裡顯示執行的sql語句
    database: mysql
    hibernate.ddl-auto: update #指定為update,每次啟動專案檢測表結構有變化的時候會新增欄位,表不存在時會新建,如果指定create,則每次啟動專案都會清空資料並刪除表,再新建
    properties.hibernate.dialect: org.hibernate.dialect.MySQL5Dialect # 使用JPA建立表時,預設使用的儲存引擎是MyISAM,通過指定資料庫版本,可以使用InnoDB
    database-platform: org.hibernate.dialect.MySQL5Dialect
    hibernate:
      naming:
        #指定jpa的自動錶生成策略,駝峰自動對映為下劃線格式
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
        #physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

改動的地方:已經用紅框框出

執行效果:

這時候日誌中打印出來的sql是可以直接執行的。