干翻Mybatis源码系列之第十篇:Mybatis Plugins基本概念与拦截概述

简介: 干翻Mybatis源码系列之第十篇:Mybatis Plugins基本概念与拦截概述


前言

插件不属于Mybatis源码的体系,属于Mybatis应用的体系,这就是Mybatis的拦截器,也称为Mybatis plugins 这里需要注意需要与Mybatis Plug的深度封装进行区分。

Mybatis Plugins拦截器的作用 粗略版

作为Mybatis来讲,对于整个数据库访问和操作进行深度的封装。

1:应用开发更加的快速

2:相对来讲,灵活性要比JDBC差一点。

所有的封装,都是为了少编码,代码规范,可以快速开发。但是因为封装的很厉害,进行一些定制操作的时候,基于封装进行操作的时候,基于Mybatis如果不理解到位的话,那么就不太好搞了

Mybatis Plugins就是可以让我们深度的去定制Mybatis的开发。

一:获取Mybatis开发过程中的SQL语句?

一些方案:

这里指的是在我们编程过程中,通过我们的代码获取我们的SQL语句。

1:日志这个方案就不太行了,因为日志必须输出到控制台。

2:IO读文件去拿文件中的SQL。但是这样是没有参数的。

3:使用MappedStatement对象当中对SQL封装的对象(BoundSQL)这样也不能动态获取当前要执行的SQL

JDBC当中是没有这个问题的,因为JDBC在执行我们对应的SQL过程当中,我们是直接把SQL暴露在我们代码当中的。针对于现在的需求来讲,Mybatis现有的体系就无法解决了,这样就遇到了Mybatis Plugins来解决了。

二:Mybatis Plugins拦截器的作用

servlet当中的filter是过滤器 ,过滤器本质上也可以看做一种拦截器。客户端发请求到达Servlet之前和Servlet处理请求之后,都进行一个拦截处理的操作,这就是拦截器的概念或者作用。

Mybatis中的拦截器和filter的作用是非常相似的,只不过这个拦截器拦截的不是servlet,而是Dao当中开发的各种各样的方法。

UserDao userDao = sqlSession.getMapper(UserDao.class);
userDao.save();

拦截器就是我们真正执行userDao.save()方法前,进行拦截然后处理一些功能,处理完毕之后再执行目标save()方法然后将结果返回给调用者。

拦截器就是拦截用户对Dao中方法的调用,假如一些通用的功能,这就是拦截器的一个核心的作用。如果后续还有一个其他的方法,那么这个拦截器会不会起作用呢?这是一定的,拦截器一定会拦截所有Dao的方法,从这个体系来看,如果我们Spring完的比较好的话,这已经等同于Spring当中的Aop编程了。

三:Mybatis Plugins拦截器的作用 细致版

我们刚才说到,拦截器的作用是拦截Mybatis当中Dao当中的方法的,但是这样的说法是不太准确的。User.save,update,delete,他们的底层无用例外都是sqlSession.select,update,delete,insert也就是sqlSession当中提供的方法。拦截这些Dao的方法,都变成了拦截SqlSession当中的方法,而SQLSession当中的方法,又是由Executor、StatementHandler、ParameterHandler、ResultSetHandler,这些组件帮忙做的,所以所谓的拦截器核心拦截的是这些组件。

我们在往下分,拦截拦截的不是组件对象,一定是对象中的方法。拦截器真正拦截的目标是上边这些组件对象当中的方法。

原则上这里边的任何一个方法都可以被拦截器拦截到。

但是实际上作为拦截器,这里边都可以被拦截,但是有些是常用的,有些是不常用的,我们实际开发过程中,常用如下:

我们知道,真正负责数据库操作的是StatementHandler就是Exexutor也得交给StatementHandler来进行数据库操作。

所以,我们认为StatementHandler当中的方法是最常用的,原因如下:

StatementHandler才是真正Mybatis当中与数据库进行通讯的,Executor当中的query方法和update方法也是交个StatementHanler进行操作。所以,我们来拦截Executor意义不大,拦截StatementHandler才是最正确的方式。

相关文章
|
6天前
|
安全 Java 应用服务中间件
阿里技术官架构使用总结:Spring+MyBatis源码+Tomcat架构解析等
分享Java技术文以及学习经验也有一段时间了,实际上作为程序员,我们都清楚学习的重要性,毕竟时代在发展,互联网之下,稍有一些落后可能就会被淘汰掉,因此我们需要不断去审视自己,通过学习来让自己得到相应的提升。
|
6天前
|
Java 数据库连接 mybatis
mybatis简单案例源码详细【注释全面】——实体层(User.java)
mybatis简单案例源码详细【注释全面】——实体层(User.java)
14 0
|
6天前
|
SQL Java 数据库连接
一文细说Mybatis八大核心源码
以上 是V哥给大家整理的8大核心组件的全部内容,为什么说选择 Java 就是选择未来,真正爱 Java 的人,一定喜欢深入研究,学习源码只是第一步,要有一杆子捅到操作系统才够刺激。
|
6天前
|
SQL Java 数据库连接
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射
|
6天前
|
SQL 缓存 Java
|
6天前
|
XML Java 数据库连接
探秘MyBatis:手写Mapper代理的源码解析与实现
探秘MyBatis:手写Mapper代理的源码解析与实现
21 1
|
6天前
|
SQL Java 数据库连接
深入源码:解密MyBatis数据源设计的精妙机制
深入源码:解密MyBatis数据源设计的精妙机制
34 1
深入源码:解密MyBatis数据源设计的精妙机制
|
6天前
|
Java 数据库连接 mybatis
mybatis简单案例源码详细【注释全面】——Utils层(MybatisUtils.java)
mybatis简单案例源码详细【注释全面】——Utils层(MybatisUtils.java)
14 0
|
6天前
|
Java 数据库连接 mybatis
mybatis简单案例源码详细【注释全面】——测试层(UserMapperTest.java)
mybatis简单案例源码详细【注释全面】——测试层(UserMapperTest.java)
10 0
|
6天前
|
Java 数据库连接 mybatis
mybatis简单案例源码详细【注释全面】——Dao层映射文件(UserMapper.xml)【重要】
mybatis简单案例源码详细【注释全面】——Dao层映射文件(UserMapper.xml)【重要】
11 0