本博客介绍的是继承Mybatis提供的Interface接口,自定义拦截器,然后将项目中的sql拦截一下,打印到控制台。

先自定义一个拦截器

package com.muses.taoshop.common.core.database.config;import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import java.util.Properties;/*** <pre>*  Mybatis SQL拦截器* </pre>** @author nicky* @version 1.00.00* <pre>* 修改记录*    修改后版本:     修改人:  修改日期:     修改内容:* </pre>*/
@Component
@Intercepts(@Signature(type = Executor.class, method = "query",args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}))
public class MybatisSqlInterceptor implements Interceptor {Logger  LOGGER = LoggerFactory.getLogger(MybatisSqlInterceptor.class);@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 拦截sqlObject[] args = invocation.getArgs();MappedStatement statement = (MappedStatement) args[0];Object parameterObject = args[1];BoundSql boundSql = statement.getBoundSql(parameterObject);String sql = boundSql.getSql();LOGGER.info("获取到的SQL:{}"+sql);if (StringUtils.isBlank(sql)) {return invocation.proceed();}// 返回return invocation.proceed();}@Overridepublic Object plugin(Object obj) {return Plugin.wrap(obj, this);}@Overridepublic void setProperties(Properties arg0) {}}

然后在SqlSessionFactoryBean进行配置,主要代码factoryBean.setPlugins(new Interceptor[]{mybatisSqlInterceptor});
下面是我的Mybatis配置类,是基于SpringBoot做的,仅供参考

package com.muses.taoshop.common.core.database.config;import com.muses.taoshop.common.core.database.annotation.MybatisRepository;
import com.muses.taoshop.common.core.database.annotation.TypeAliasesPackageScanner;
import org.apache.ibatis.io.VFS;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.*;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;import static com.muses.taoshop.common.core.database.config.BaseConfig.*;/*** <pre>*  Mybatis配置类* </pre>** @author nicky* @version 1.00.00* <pre>* 修改记录*    修改后版本:     修改人:  修改日期:     修改内容:* </pre>*/
@MapperScan(basePackages = MAPPER_PACKAGES,annotationClass = MybatisRepository.class,sqlSessionFactoryRef = SQL_SESSION_FACTORY
)
@ComponentScan
@EnableTransactionManagement
@Configuration
public class MybatisConfig {@AutowiredMybatisSqlInterceptor mybatisSqlInterceptor;TypeAliasesPackageScanner packageScanner = new TypeAliasesPackageScanner();@Bean(name = DATA_SOURCE_NAME)@ConfigurationProperties(prefix = DATA_SOURCE_PROPERTIES)@Primarypublic DataSource dataSource(){return DataSourceBuilder.create().build();}@Primary@Bean(name = SQL_SESSION_FACTORY)public SqlSessionFactory sqlSessionFactory(@Qualifier(DATA_SOURCE_NAME)DataSource dataSource)throws Exception{//SpringBoot默认使用DefaultVFS进行扫描,但是没有扫描到jar里的实体类VFS.addImplClass(SpringBootVFS.class);SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setPlugins(new Interceptor[]{mybatisSqlInterceptor});factoryBean.setDataSource(dataSource);//factoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();try{factoryBean.setMapperLocations(resolver.getResources("classpath*:/mybatis/*Mapper.xml"));String typeAliasesPackage = packageScanner.getTypeAliasesPackages();factoryBean.setTypeAliasesPackage(typeAliasesPackage);SqlSessionFactory sqlSessionFactory = factoryBean.getObject();return sqlSessionFactory;}catch (Exception e){e.printStackTrace();throw new RuntimeException();}}@Bean(name = MYBATIS_TRANSACTION_MANAGER)public DataSourceTransactionManager transactionManager(@Qualifier(DATA_SOURCE_NAME)DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}}

转载于:https://www.cnblogs.com/mzq123/p/10130072.html

Mybatis自定义SQL拦截器相关推荐

  1. mysql拦截器实现crud_Mybatis自定义SQL拦截器

    本博客介绍的是继承Mybatis提供的Interface接口,自定义拦截器,然后将项目中的sql拦截一下,打印到控制台. 先自定义一个拦截器 package com.muses.taoshop.com ...

  2. 自定义Flume拦截器,并将收集的日志存储到Kafka中(案例)

    1.引入POM文件 如果想调用Flume,需要引入flume相关的jar包依赖,jar包依赖如下: <?xml version="1.0" encoding="UT ...

  3. springbootjpa之hibernate sql拦截器

    springbootjpa之hibernate sql拦截器 解决问题,数据查询权限问题: 原理:通过拦截sql语句,然后解析sql语句,加入自定义查询条件,做到数据权限拦截: hibernate 文 ...

  4. Dubbo自定义日志拦截器

    前言 上一篇文章 Spring aop+自定义注解统一记录用户行为日志 记录了 web层中通过自定义注解配合Spring aop自动记录用户行为日志的过程.那么按照分布式架构中Dubbo服务层的调用过 ...

  5. springboot整合shiro和session的详细过程和自定义登录拦截器

    文章目录 1.shiro依赖 2.shiro配置 shiro过滤器配置: 关联自定义的其他管理器 自定义会话工厂: 3.登陆时记录用户信息 4.shiro一些工具类的学习 5.自定义登录拦截器 shi ...

  6. 自定义日志_Dubbo自定义日志拦截器源码分析

    需求场景 在使用Dubbo搭建的分布式项目中,服务层代码调用是这样的: @GetMapping(value = "/info")2 public BaseResult userIn ...

  7. Dubbo自定义日志拦截器 1

    前言 上一篇文章 Spring aop+自定义注解统一记录用户行为日志 记录了 web层中通过自定义注解配合Spring aop自动记录用户行为日志的过程.那么按照分布式架构中Dubbo服务层的调用过 ...

  8. 自定义注解+拦截器优化项目代码

    自定义注解+拦截器的优势 类似用户权限或者接口限流的需求,但并不是所有操作或者接口需要.可以使用过滤器或者拦截器,但这样就必须在配置文件里加上所有方法或者使用通配符. 所以可以采用一种比较简单灵活的方 ...

  9. springboot 自定义注解拦截器

    springboot 自定义注解拦截器 最近在工作中,发现自定义注解拦截使用起来特别方便,现在来写出来给大家看看 环境springboot 首先写一个自定义注解 package com.study.c ...

最新文章

  1. 检查oracle安装,oracle安装前环境检查
  2. python测试开发自学教程-Web开发哪家强?看我用 Python 写一个颜值测试小工具
  3. phpstudy php日志,phpstudy开启网站Apache日志并且按照日期划分创建
  4. 一些.net命令行工具的使用
  5. python pypdf2另存为图片_用Python玩转PDF的各种骚操作
  6. oracle各版本手动升级任我行-升级矩阵
  7. keras多输出模型
  8. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1089:数字反转
  9. ​Linux下C如何调用PCI Lib函数
  10. [转载] Java 语言中的实例初始化块 ( IIB) 详解
  11. 查询:使用多表连接查询数据
  12. VS2017-Supercharger下载+安装
  13. 华为NP课程笔记25-SDN简介
  14. 智能汽车软件行业深度研究:汽车软件的星辰大海
  15. 【STM32H7的DSP教程】第22章 DSP矩阵运算-放缩,乘法和转置矩阵
  16. android 微软桌面,Mirosoft Launcher微软桌面
  17. Linux命令(13)——实时监控进程、监控网络
  18. 前端动态生成横向树形表格
  19. 2022-11-30:小红拿到了一个仅由r、e、d组成的字符串 她定义一个字符e为“好e“ : 当且仅当这个e字符和r、d相邻 例如“reeder“只有一个“好e“,前两个e都不是“好e“,只有第三个
  20. 技师职业资格等级证书报名时间是什么?考试时间是什么时候呢?

热门文章

  1. 异步通知实验(信号)
  2. pwd命令是什么的缩写_手机学编程(2)目录管理命令
  3. 机器人离线编程画圆误差解决方案_工业机器人离线编程-误差分析和解决方案...
  4. github设置仓库可见性 私人仓库设置
  5. 程序人生:什么是“对用户友好”
  6. mysql数据库设计中的14个技巧
  7. partition oracle用法,Oracle partition by 使用说明
  8. springmvc请求返回一个字符_SpringMVC系列之Web利器SpringMVC
  9. 单选按钮设置为被选中状态_为什么要设置错误的按钮状态
  10. ui边框设计图_UI设计形状和对象基础知识:填充和边框