spring boot中使用hibernate 拦截sql语句 (StatementInspector)

google上没有找到详细教程,自己折腾完后记录一下使用过程。
场景:在hibernate执行sql之前拦截并检查sql是否有指定参数。


环境:
jdk : jdk 8
framework : spring-boot , spring-data-jpa
要实现这个功能可以使用 hibernate 的拦截器(EmptyInterceptor)或监听器 。
这里使用StatementInspector接口实现 (算是拦截器中的接口)

一、StatementInspector 接口 org.hibernate.resource.jdbc.spi.StatementInspector

这个接口是拦截器中抽取的来的,org.hibernate.Interceptor 接口中的onPrepareStatement(String sql) 方法弃用后抽取出来的

    /**
     * Called when sql string is being prepared. 
     * @param sql sql to be prepared
     * @return original or modified sql
     *
     * @deprecated Supply a {@link org.hibernate.resource.jdbc.spi.StatementInspector} instead, if you wish
     * to inspect and alter SQL statements.
     */
    @Deprecated
    String onPrepareStatement(String sql);
spring boot中使用hibernate 拦截sql语句 (StatementInspector)_第1张图片
image.png
二、实现StatementInspector
package com.demo.inspector;

import org.hibernate.resource.jdbc.spi.StatementInspector;

public class SqlStatementInspector implements StatementInspector {
    @Override
    public String inspect(String sql) {
        // 这里可以拦截到sql , 这里的sql格式会有占位符?  如:select u.name from user u where u.id = ?
        return sql;
    }
}
三、配置application.yml 启用
spring:
  jpa:
    properties:
      hibernate:
        session_factory:
          statement_inspector: com.demo.inspector.SqlStatementInspector 
  • spring boot中使用hibernate 拦截sql语句 (StatementInspector)_第2张图片
    image.png
使用总结:
  1. 实现StatementInspector
  2. 配置启用

参考:

  • Interceptors and events - 官方文档
  • Hibernate的回调与拦截

你可能感兴趣的:(spring boot中使用hibernate 拦截sql语句 (StatementInspector))