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

参考:

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,773评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,114评论 6 342
  • 1、谈谈你对Struts的理解。 答: 1.struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的...
    慕容小伟阅读 7,870评论 0 13
  • 从出生到死亡,唯一时时刻刻的陪伴关怀你的,只有你自己。不要定位有谁当你的好朋友,或者爱人,首先定位自己好好爱自己一...
    十木林森阅读 1,540评论 0 0
  • 没有一丝承重 明媚的天地 如此清晰 可人,仿佛过去的岁月 才从襁褓中崭露头角 看似苍老的面容 去掉目的前行 这首胜...
    郭安安阅读 3,952评论 30 56