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

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 桌面提醒_使用Python获取桌面通知

开发一款可提醒您诸如警报或待办事项清单等计划的应用程序真是太好了。在本文中,我将引导您逐步编写如何使用Python获取桌面通知的程序。桌面通知应用程序如何工作?您今天将要学习开发的桌面通知应用程序的主要目的是不断提醒我们我们一天中需要完成的不…

java线程同步的实现_【Java多线程系列三】实现线程同步的方法

packagecom.concurrent.test;importjava.util.Stack;importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.BlockingQueue;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.ReentrantLock;/*** Description: 三种方法实现…

python建立py文件夹过程_Pycharm创建python文件自动添加日期作者等信息(步骤详解)...

百度AI接口的调用方法不必多介绍。官网地址 人流量统计新建AipBodyAnalysisfrom aip import AipBodyAnalysis""" 你的 APPID AK SK """APP_ID 你的 App IDAPI_KEY 你2021-02-03 14:24:01本文主要介绍了在python3.9下如何安装scrapy的方法&…

python父亲节祝福_父亲节祝福语精选简短 父亲节祝福语简短独特

1.您的坚忍不拔和铮铮硬骨是我的榜样,我从您那儿汲取到奋发的力量,走过挫折,迈向成功,爸爸,您是我永远的榜样,我爱您!祝您节日快乐!2.您的怀抱,是我的小天地;…

redis java应用_redis在JAVA的简单应用

reids是一个高性能的key-value数据库。它存储的value支持各种类型的数据,如String,List,set,hash类型。在此基础上,各种不同方式的排序。本文不具体争对redis数据库的各种命令,而是在Java实现简单的调用。1. //初始化R…

java安装 hello_安装JAVA步骤,并编写HELLOWORLD程序

安装Java步骤,并编写helloworld程序1.安装JDK(Java Development Kit)JDK是Java开发工具包(Java Development Kit)的缩写。它是一种用于构建在J Java 平台上发布的应用程序、applet和组件的开发环境。即编写Java程序必须有JDK,它提供了编译Java和运行Java…

java实现Fmeasure计算_聚类结果的评估指标及其JAVA实现

一. 前言又GET了一项技能。在做聚类算法的时候,由于要评估所提出的聚类算法的好坏,于是需要与一些已知的算法对比,或者用一些人工标注的标签来比较,于是用到了聚类结果的评估指标。我了解了以下几项。TP:是指被聚在一类的两个量被…

java随机产生坐标点_刚学JAVA不久,问一下怎么把这个程序实现随机啊,不是按照坐标...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼int i;int z0;int j,h0,k0;int AppletWidch,AppletHeight,currentImage;Image Animation[],SerialImage,OffScreen;Thread newThread;Graphics drawOffScreen;MediaTracker MT;ImageProducer Source;CropImageFilter CutImage;publ…

ubuntu安装java的rpm_ubuntu安装jdk-6u45-linux-x64-rpm.bin

1、参考网址:ZC: 网页内容保存于 “百度云 CodeSkill33 --> 全部文件 >来自网页 > Linux > ubuntu > ubuntu安装jdk-6u45-linux-x64-rpm.bin__Work_20160115_0851.rar”2、(1)、我是将jdk-6u45-linux-x64.bin放在 "/home"下的(2)、命令&qu…

java窗体容器坐标_Java的屏幕坐标是以像素为单位的,容器的左下角被确定为坐标的起点。...

屏单位的的左定为的起点Despite ________ difficulties, they did not find the life in London unpleasant.幕坐As soon as I was ____________, I began to have second thoughts about leaving.标被确The girl was uncertain what to do, or what tone of voice to_________…

mysql 相同字段相减_mysql datetime 类型字段相减

背景:今天测试一个mariadb中datatime类型的字段相减问题,直接用2个字段相减得到的数值并不是秒,很坑。后面百度了一些方法,说是使用 DateDiff 函数,这个函数文档还说有3个参数,但是3个参数运行是报错的。要…

java类 连接时机_java类的加载时机

类加载它直接表现出来的代码应该是 ClassLoader.getSystemClassLoader().loadClass("com.my.test.AbcClass")。所以具 体完成类的加载工作的,是常被提到的类加载器ClassLoader,它就是专门干这件事的。“类的加载”具体而言就是指将类.class文件…

Java最短路径类型_JAVA 最短路径

1.从景石出发,步行游览以下景点:①游客服务中心,②阳光草坪,③森林小剧场,④儿童科普体验区,⑤儿童戏水场,⑥湿地博物馆,⑦湿地商业街。建立数学模型,找出从景石出发,到达…

java 外螺旋矩阵_螺旋矩阵的java实现

今天参加了腾讯实习生的在线笔试,螺旋矩阵的问题,算是ACM的入门题吧想到了有两种实现递归和非递归输入:3输出:1 2 3 8 9 4 7 6 5输入:5输出:1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 8…

1445.32php,nginx实现mysql的负载均衡

1.下载module模块$ tar -xzvf nginx-1.2.1.tar.gz$ cd nginx-1.2.1/$ patch -p1 < /path/to/nginx_tcp_proxy_module/tcp.patch /path是指nginx_tcp_proxy_module路径$ ./configure --add-module/usr/local/ngx_cache_purge-1.4--prefix/usr/local/nginx --with-http_stub…

php date 有warning,php提示PHP Warning: date(): It is not safe to rely on the......错误的解决办法...

在写php程序中有时会出现这样的警告&#xff1a;PHP Warning: date(): It is not safe to rely on the systems timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those method…

php不用于输出的函数,PHP常用函数和常见疑难问题解答

首先介绍下比较简单但必不可少且实用的知识&#xff0c;可以当手册查询&#xff0c;适合像我一样的新手看。PHP常用库函数介绍一、PHP字符串操作常用函数1.确定字符串长度int strlen(string str)2.比较两个字符串a. strcmp函数对两个字符串进行二进制安全的比较&#xff0c;并区…

php指定字符编码,PHP字符编码问题

绝对一劳永逸,确保您再也不会遇到编码问题&#xff1a;在任何地方使用UTF-8&#xff01;那是(如果你使用mysql和php)&#xff1a;>例如,将数据库中的所有表格设置为整理“utf8_general_ci”.>建立数据库连接后,运行以下SQL查询&#xff1a;“SET NAMES’utf8’”>始终…

php 开启,PHP服务的开启详细步骤

安装完php,使用chkconfig命令来查看php-fpm服务是否开启&#xff0c;如果没有开启1. 在/etc/init.d/目录下创建脚本php-fpmvim/etc/init.d/php-fpm2. 编写脚本内容(将一下复制进去相应改动安装路径)#!/bin/sh## php-fpm - this script starts and stops the php-fpm daemin## c…

php ssh 管理服务器,php 利用ssh执行远程或本地liunx服务器命令

/*** 利用ssh执行 远程或本地liunx服务器命令* 虽然可以用 shee_exec来执行本地机命令 但却无法选择用哪个用户来执行 此函数可解决此类问题* $host ssh 主机名 可以为ip 或 域名* $port ssh 端口* $ssh_username ssh 登录用户名* $ssh_password ssh 登录密码* $command 要执行…