mysql拦截器实现crud_Mybatis自定义SQL拦截器
本博客介绍的是继承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拦截器相关推荐
- Mybatis自定义SQL拦截器
本博客介绍的是继承Mybatis提供的Interface接口,自定义拦截器,然后将项目中的sql拦截一下,打印到控制台. 先自定义一个拦截器 package com.muses.taoshop.com ...
- 自定义sql_基于Calcite自定义SQL解析器
这本应该是<我也能写数据库>系列文章中的一篇,但是最近一直在反思这个系列标题是不是有点不亲民,所以,暂时放弃这个系列标题了. 本文会介绍如何扩展Calcite的SQL解析器使之更符合你的业 ...
- java中的类加载器有,Java自定义的类加载器,java自定义加载,在java中类加载器有以...
Java自定义的类加载器,java自定义加载,在java中类加载器有以 在java中类加载器有以下几种java虚拟机自带的加载器 1)根类加载器(Bootstrap,c++实现)2)扩展类加载器(Ex ...
- 2021-07-31-DJ-007 Django 模型,自定义模型管理器Manager,自定义字段验证器Validdator
一.模型 管理器 模型实例通过模型管理器获得并传递给使用者,修改默认的模型管理器,可以提前进行一些筛选步骤,比如筛掉已经注销的用户.已经取消的订单等等. 默认的模型管理器是django.db.mode ...
- 【WebService】CXF拦截器的设置以及自定义CXF拦截器
欢迎关注我新搭建的博客:http://www.itcodai.com/ WebService系列文章: [WebService]带你走进webservice的世界 [WebService]自定义Web ...
- 如何实现一个SQL解析器
1. 背景 随着技术的不断的发展,在大数据领域出现了越来越多的技术框架.而为了降低大数据的学习成本和难度,越来越多的大数据技术和应用开始支持SQL进行数据查询.SQL作为一个学习成本很低的语言,支持S ...
- java的类加载器以及如何自定义类加载器
ClassLoader作用 类加载流程的"加载"阶段是由类加载器完成的. 类加载器结构 结构:BootstrapClassLoader(祖父)–>ExtClassLoader ...
- Django中--自定义模型管理器类
BookInfo.objects.all()->objects是一个什么东西呢? 答:objects是models.Manger类的一个对象,是Django帮我自动生成的管理器对象,通过这个管理 ...
- mysql事件探查器_【干货】Mysql的事件探查器-之Mysql-Proxy代理实战一(安装部署与实战sql拦截与性能监控)...
1:资料参考 https://blog.csdn.net/coldljy/article/details/3168906 https://www.cnblogs.com/jwentest/p/8552 ...
最新文章
- android ndk r8d,(Android) NDK
- android各目录大小,Android 基础篇 — 放不同drawable文件夹中图片的大小
- 自下而上归并排序 数组实现
- WPF 基础控件之 DataGrid 样式
- postgres复制表结构
- JAVA就诊叫号_基于B/S的JAVA门诊就诊系统
- 4.20 使用条件格式标识包含指定文本的单元格 [原创Excel教程]
- Eclipse主题插件之Darkest Dark Theme with DevStyle
- 最新爱网外链网盘V5.0版 全新界面 支持图片违规检测
- 总结30个Python赚钱的接单平台!兼职月入5000+,成年人的世界,钱是活下去的筹码
- 代码“可读性”到底有多重要?
- win10輸入法,繁體字,簡體字切換
- 背包问题变种:将数组分成两部分使得两部分的和的差最小
- 如何用电脑制作Excel表格
- MCU单片机面试题(1)
- 转:为什么谷歌越来越牛逼,而百度却...
- junit测试简单代码
- (一) Vue在创建的时候 入口文件 及相关的路由配置(及子路由配置)
- 车载毫米波雷达信号处理中的数据压缩问题
- 高效好用的目标管理软件,助你提升管理水平
热门文章
- 装完系统还要装什么_家里装了空调还要装空气净化系统吗?会不会太浪费了?...
- lol模型导入ue4_Houdini amp; UE4 程序化建模——石头(一)基础工作流
- ./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such
- SpringCloudGateway实现金丝雀发布_05
- ant压缩和解压缩工具类
- python模块搜索路径_Python模块搜索路径
- 模拟灰度传感器循迹的程序_灰度传感器的工作原理
- qt使用动画提示正在载中
- Python基础教程学习目录 - Python入门教程
- 包机制、阿里巴巴开发手册