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);
1360650-f37d04934d223fc4.png
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 
  • 1360650-f613321b755c80a3.png
    image.png
使用总结:
  1. 实现StatementInspector
  2. 配置启用

参考:

1条评论

曹麦穗 says: 回复

我也在找这个,发现EmptyInterceptor 虽然 @deprecated 还是能用。

不过,始终没找到。我想要的钩子。就是正在的sql 执行完。我想统计sql执行的时间和次数。

发表评论

邮箱地址不会被公开。 必填项已用*标注

昵称 *