mybatis拦截器使用
mybatis拦截器入门
mybatis 拦截器接口Interceptor
Interceptor接口,我们通过这个接口可以自定义我们自己的拦截器,从而实现在拦截的时候写上我们自己的一些逻辑。该接口提供了三个方法,

接口介绍:
intercept方法:
intercept方法是在进行拦截的时候要执行的方法。
plugin方法:
该方法是拦截器用于封装目标对象的,通过该方法我们可以返回目标对象本身,也可以返回一个它的代理。
setProperties方法:
mybatis配置文件中configuration中的配置的指定属性值。
spring boot + mybatis整合
工程创建过程省略,不会的自行谷歌。
这里贴出主要的pom.xml文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>application.yml</exclude>
<exclude>application-dev.yml</exclude>
<exclude>application-uat.yml</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application.yml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
application.yml 文件配置
mybatis:
mapper-locations: classpath*:/mapper/*.xml
config-location: classpath:/mybatis-config.xml
type-aliases-package: com.cl.domain
spring:
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/cloud_afwk?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: cloudafwk
password: handhand
mybatis-config.xml文件配置,注意:当自己重新写了一个mybatis 的拦截器需要配置
在plugin里面可以定义一些参数的值,这些怎么获取,下面会讲到。自己写的拦截器还需要加上@Intercepts注解,下面会讲这个注解的作用
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!-- DTO驼峰命名与表字段下划线命名自动转换 -->
<setting name="mapUnderscoreToCamelCase" value="true" />
<!--<setting name="logImpl" value="STDOUT_LOGGING"/>-->
</settings>
<plugins>
<plugin interceptor="com.cl.util.MyInterceptor">
<property name="databaseType" value="mySql"/>
</plugin>
</plugins>
</configuration>
注意: 上述的package路径写自己搭建项目的路径,不可全盘copy
创建自己的拦截器MyInterceptor
创建自己的拦截器,并实现Interceptor接口,在自己的拦截器中分别实现intercept(),plugin(),setProperties()三个方法。首先我们先在三个方法中分别加入打印信息,看看先后自行的顺序。首先启动自己的程序,发现启动日志中已经有我们在拦截器里面的打印信息:

由此发现,setProperties()方法中可以在Configuration出事化当前的Interceptor时执行。
@Intercepts注解
阅读该注解的源码,发现里面就一个参数值Signature 类型的数组,可见在Interceptor中可以写多个值。

再深入一层去看Signature这个信号通知是什么?里面有三个值type,method,args,@Signature则表明要拦截的接口、方法以及对应的参数类型

下面通过注解里面具体的值来演示下该拦截器的执行过程:
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})

可见拦截器先是进plugin这个方法,看Plugin类:
该Plugin类中的静态方法wrap方法中根据注解Interceptor中定义的哪些接口需要拦截,如果有需要拦截的接口则返回一个代理对象,没有则返回目标对象本身。一个Plugin就是一个代理对象InvocationHandler,然后通过invoke方法封装成一个Invocation对象给intercept。

通过拦截器,可以自己定义分页查询的功能,将查询出来的语句重新封装sql语句,并返回对象,从而达到拦截器的作用,当有切换不同的数据库时,可以通过mybatis的配置属性值,在拦截器中获取不同的属性值,来重新封装sql语句,从而达到动态切换的目的
本文章只是介绍mybatis的拦截器的一些概念,具体分页查询,当然还可以自己定义一些其它的判断逻辑,比如我们项目中mybatis插件自动做租户隔离,也是运用类似的方法。总之,方法概念有了,具体实现就看个人了。嘻嘻嘻。。。
mybatis拦截器使用的更多相关文章
- Mybatis拦截器
Mybatis拦截器
- Mybatis拦截器 mysql load data local 内存流处理
Mybatis 拦截器不做解释了,用过的基本都知道,这里用load data local主要是应对大批量数据的处理,提高性能,也支持事务回滚,且不影响其他的DML操作,当然这个操作不要涉及到当前所lo ...
- MyBatis拦截器原理探究
MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis 允 ...
- Mybatis拦截器介绍
拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法.Mybatis拦截器设计的一个初 ...
- Mybatis拦截器实现分页
本文介绍使用Mybatis拦截器,实现分页:并且在dao层,直接返回自定义的分页对象. 最终dao层结果: public interface ModelMapper { Page<Model&g ...
- 数据权限管理中心 - 基于mybatis拦截器实现
数据权限管理中心 由于公司大部分项目都是使用mybatis,也是使用mybatis的拦截器进行分页处理,所以技术上也直接选择从拦截器入手 需求场景 第一种场景:行级数据处理 原sql: select ...
- 基于Spring和Mybatis拦截器实现数据库操作读写分离
首先需要配置好数据库的主从同步: 上一篇文章中有写到:https://www.cnblogs.com/xuyiqing/p/10647133.html 为什么要进行读写分离呢? 通常的Web应用大多数 ...
- 通过spring抽象路由数据源+MyBatis拦截器实现数据库自动读写分离
前言 之前使用的读写分离的方案是在mybatis中配置两个数据源,然后生成两个不同的SqlSessionTemplate然后手动去识别执行sql语句是操作主库还是从库.如下图所示: 好处是,你可以人为 ...
- 【Mybatis】1、Mybatis拦截器学习资料汇总
MyBatis拦截器原理探究 http://www.cnblogs.com/fangjian0423/p/mybatis-interceptor.html [myBatis]Mybatis中的拦截器 ...
- spring boot 实现mybatis拦截器
spring boot 实现mybatis拦截器 项目是个报表系统,服务端是简单的Java web架构,直接在请求参数里面加了个query id参数,就是mybatis mapper的query id ...
随机推荐
- nginx下配置多个web服务
参考 nginx配置详解 nginx反向代理与负载均衡详解 一.nginx简介: Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能 ...
- ChakraCore ,Net托管编程
前言 有些有着复杂业务逻辑的应用程序,需要为用户提供高度自定化的功能.比如像Word中的宏,当然可以自己设计一套简易的脚本解析引擎,但考虑通用性,成熟度,其实选择一款JS脚本引擎,直接嵌入到应用系统中 ...
- pgAdmin4 重置布局
pgAdmin4 是网页版客户端,而且在其网页上可以通过拖拽改变布局.当布局混乱时可以通过 菜单File--Reset Layout功能来重置. 如果这篇随笔只是为了说以上这句话就没必要了,而且你根据 ...
- [LuoguP3668][USACO17OPEN]现代艺术2
[LuoguP3668][USACO17OPEN]Modern Art2(Link) 现在你有一块长为\(N\)的画布,每次可以选择一段连续的区间进行颜色填涂,新颜色会覆盖旧颜色.每一次填涂都要耗费一 ...
- TensorFlow简要教程及线性回归算法示例
TensorFlow是谷歌推出的深度学习平台,目前在各大深度学习平台中使用的最广泛. 一.安装命令 pip3 install -U tensorflow --default-timeout=1800 ...
- oracle中的某一个用户名修改
1若修改某一个用户密码,修改用户口令格式为:alter user 用户名 identified by 新密码: 2以system 为例,想把密码修改为123456. 可输入alter user sys ...
- Read a large file with python
python读取大文件 较pythonic的方法,使用with结构 文件可以自动关闭 异常可以在with块内处理 with open(filename, 'rb') as f: for line in ...
- 基于 pyMongo 和 wxPython 实现的 MongoDB Schema Analyser
MongoDB 作为文档型 NoSql 数据库,它的集合表结构往往不像关系型数据库那么固定和统一,同一个集合下的文档(document)的字段变化和差异可能很大,特别是在数据模型缺乏良好规划和规范的数 ...
- thinkphp3.2+cropper上传多张图片剪切图片
实现效果截图 点加号可以继续上传第二张图片 代码部<--引入cropper相关文件--> <link rel="stylesheet" href="/h ...
- PHP递归无限分类,数组和直接输出。
去年在一家公司做项目开发,用到商城三级分类,看了之前的程序员写的分类也是头大,三级分类,循环套循环三次( foreach(){ foreach(){ foreach(){ } } } ),然后写了一个 ...