前言
插件不属于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才是最正确的方式。