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);
二、实现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
使用总结:
- 实现StatementInspector
- 配置启用