本博客介绍的是继承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;

/**

*

* Mybatis SQL拦截器

*

*

* @author nicky

* @version 1.00.00

*

* 修改记录

* 修改后版本: 修改人: 修改日期: 修改内容:

*

*/

@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);

@Override

public Object intercept(Invocation invocation) throws Throwable {

// 拦截sql

Object[] 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();

}

@Override

public Object plugin(Object obj) {

return Plugin.wrap(obj, this);

}

@Override

public 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.*;

/**

*

* Mybatis配置类

*

*

* @author nicky

* @version 1.00.00

*

* 修改记录

* 修改后版本: 修改人: 修改日期: 修改内容:

*

*/

@MapperScan(

basePackages = MAPPER_PACKAGES,

annotationClass = MybatisRepository.class,

sqlSessionFactoryRef = SQL_SESSION_FACTORY

)

@ComponentScan

@EnableTransactionManagement

@Configuration

public class MybatisConfig {

@Autowired

MybatisSqlInterceptor mybatisSqlInterceptor;

TypeAliasesPackageScanner packageScanner = new TypeAliasesPackageScanner();

@Bean(name = DATA_SOURCE_NAME)

@ConfigurationProperties(prefix = DATA_SOURCE_PROPERTIES)

@Primary

public 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);

}

}

mysql拦截器实现crud_Mybatis自定义SQL拦截器相关推荐

  1. Mybatis自定义SQL拦截器

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

  2. 自定义sql_基于Calcite自定义SQL解析器

    这本应该是<我也能写数据库>系列文章中的一篇,但是最近一直在反思这个系列标题是不是有点不亲民,所以,暂时放弃这个系列标题了. 本文会介绍如何扩展Calcite的SQL解析器使之更符合你的业 ...

  3. java中的类加载器有,Java自定义的类加载器,java自定义加载,在java中类加载器有以...

    Java自定义的类加载器,java自定义加载,在java中类加载器有以 在java中类加载器有以下几种java虚拟机自带的加载器 1)根类加载器(Bootstrap,c++实现)2)扩展类加载器(Ex ...

  4. 2021-07-31-DJ-007 Django 模型,自定义模型管理器Manager,自定义字段验证器Validdator

    一.模型 管理器 模型实例通过模型管理器获得并传递给使用者,修改默认的模型管理器,可以提前进行一些筛选步骤,比如筛掉已经注销的用户.已经取消的订单等等. 默认的模型管理器是django.db.mode ...

  5. 【WebService】CXF拦截器的设置以及自定义CXF拦截器

    欢迎关注我新搭建的博客:http://www.itcodai.com/ WebService系列文章: [WebService]带你走进webservice的世界 [WebService]自定义Web ...

  6. 如何实现一个SQL解析器

    1. 背景 随着技术的不断的发展,在大数据领域出现了越来越多的技术框架.而为了降低大数据的学习成本和难度,越来越多的大数据技术和应用开始支持SQL进行数据查询.SQL作为一个学习成本很低的语言,支持S ...

  7. java的类加载器以及如何自定义类加载器

    ClassLoader作用 类加载流程的"加载"阶段是由类加载器完成的. 类加载器结构 结构:BootstrapClassLoader(祖父)–>ExtClassLoader ...

  8. Django中--自定义模型管理器类

    BookInfo.objects.all()->objects是一个什么东西呢? 答:objects是models.Manger类的一个对象,是Django帮我自动生成的管理器对象,通过这个管理 ...

  9. mysql事件探查器_【干货】Mysql的事件探查器-之Mysql-Proxy代理实战一(安装部署与实战sql拦截与性能监控)...

    1:资料参考 https://blog.csdn.net/coldljy/article/details/3168906 https://www.cnblogs.com/jwentest/p/8552 ...

最新文章

  1. android ndk r8d,(Android) NDK
  2. android各目录大小,Android 基础篇 — 放不同drawable文件夹中图片的大小
  3. 自下而上归并排序 数组实现
  4. WPF 基础控件之 DataGrid 样式
  5. postgres复制表结构
  6. JAVA就诊叫号_基于B/S的JAVA门诊就诊系统
  7. 4.20 使用条件格式标识包含指定文本的单元格 [原创Excel教程]
  8. Eclipse主题插件之Darkest Dark Theme with DevStyle
  9. 最新爱网外链网盘V5.0版 全新界面 支持图片违规检测
  10. 总结30个Python赚钱的接单平台!兼职月入5000+,成年人的世界,钱是活下去的筹码
  11. 代码“可读性”到底有多重要?
  12. win10輸入法,繁體字,簡體字切換
  13. 背包问题变种:将数组分成两部分使得两部分的和的差最小
  14. 如何用电脑制作Excel表格
  15. MCU单片机面试题(1)
  16. 转:为什么谷歌越来越牛逼,而百度却...
  17. junit测试简单代码
  18. (一) Vue在创建的时候 入口文件 及相关的路由配置(及子路由配置)
  19. 车载毫米波雷达信号处理中的数据压缩问题
  20. 高效好用的目标管理软件,助你提升管理水平

热门文章

  1. 装完系统还要装什么_家里装了空调还要装空气净化系统吗?会不会太浪费了?...
  2. lol模型导入ue4_Houdini amp; UE4 程序化建模——石头(一)基础工作流
  3. ./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such
  4. SpringCloudGateway实现金丝雀发布_05
  5. ant压缩和解压缩工具类
  6. python模块搜索路径_Python模块搜索路径
  7. 模拟灰度传感器循迹的程序_灰度传感器的工作原理
  8. qt使用动画提示正在载中
  9. Python基础教程学习目录 - Python入门教程
  10. 包机制、阿里巴巴开发手册