没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
88 | 开源实战五(中):如何利用职责链与代理模式实现MyBatis
Plugin?
2020-05-25 王争
设计模式之美
进入课程
讲述:冯永吉
时长 10:57 大小 10.04M
上节课,我们对 MyBatis 框架做了简单的背景介绍,并且通过对比各种 ORM 框架,学习
了代码的易用性、性能、灵活性之间的关系。一般来讲,框架提供的高级功能越多,那性能
损耗就会越大;框架用起来越简单,提供越简化的使用方式,那灵活性也就越低。
接下来的两节课,我们再学习一下 MyBatis 用到一些经典设计模式。其中,今天,我们主
要讲解 MyBatis Plugin。尽管名字叫 Plugin(插件),但它实际上跟之前讲到的 Servlet
Filter(过滤器)、Spring Interceptor(拦截器)类似,设计的初衷都是为了框架的扩展
性,用到的主要设计模式都是职责链模式。
下载APP
不过,相对于 Servlet Filter 和 Spring Interceptor,MyBatis Plugin 中职责链模式的代码
实现稍微有点复杂。它是借助动态代理模式来实现的职责链。今天我就带你看下,如何利用
这两个模式实现 MyBatis Plugin。
话不多说,让我们正式开始今天的学习吧!
MyBatis Plugin 功能介绍
实际上,MyBatis Plugin 跟 Servlet Filter、Spring Interceptor 的功能是类似的,都是在
不需要修改原有流程代码的情况下,拦截某些方法调用,在拦截的方法调用的前后,执行一
些额外的代码逻辑。它们的唯一区别在于拦截的位置是不同的。Servlet Filter 主要拦截
Servlet 请求,Spring Interceptor 主要拦截 Spring 管理的 Bean 方法(比如 Controller
类的方法等),而 MyBatis Plugin 主要拦截的是 MyBatis 在执行 SQL 的过程中涉及的一
些方法。
MyBatis Plugin 使用起来比较简单,我们通过一个例子来快速看下。
假设我们需要统计应用中每个 SQL 的执行耗时,如果使用 MyBatis Plugin 来实现的话,
我们只需要定义一个 SqlCostTimeInterceptor 类,让它实现 MyBatis 的 Interceptor 接
口,并且,在 MyBatis 的全局配置文件中,简单声明一下这个插件就可以了。具体的代码
和配置如下所示:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Intercepts({
@Signature(type = StatementHandler.class, method = "query", args = {Sta
@Signature(type = StatementHandler.class, method = "update", args = {St
@Signature(type = StatementHandler.class, method = "batch", args = {Sta
public class SqlCostTimeInterceptor implements Interceptor {
private static Logger logger = LoggerFactory.getLogger(SqlCostTimeIntercepto
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object target = invocation.getTarget();
long startTime = System.currentTimeMillis();
StatementHandler statementHandler = (StatementHandler) target;
try {
return invocation.proceed();
} finally {
long costTime = System.currentTimeMillis() - startTime;
BoundSql boundSql = statementHandler.getBoundSql();
String sql = boundSql.getSql();
因为待会我会详细地介绍 MyBatis Plugin 的底层实现原理,所以,这里暂时不对上面的代
码做详细地解释。现在,我们只重点看下 @Intercepts 注解这一部分。
我们知道,不管是拦截器、过滤器还是插件,都需要明确地标明拦截的目标方法。
@Intercepts 注解实际上就是起了这个作用。其中,@Intercepts 注解又可以嵌套
@Signature 注解。一个 @Signature 注解标明一个要拦截的目标方法。如果要拦截多个
方法,我们可以像例子中那样,编写多条 @Signature 注解。
@Signature 注解包含三个元素:type、method、args。其中,type 指明要拦截的类、
method 指明方法名、args 指明方法的参数列表。通过指定这三个元素,我们就能完全确
定一个要拦截的方法。
默认情况下,MyBatis Plugin 允许拦截的方法有下面这样几个:
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
logger.info("执行 SQL:[ {} ]执行耗时[ {} ms]", sql, costTime);
}
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
System.out.println("插件配置的信息:"+properties);
}
}
<!-- MyBatis全局配置文件:mybatis-config.xml -->
<plugins>
<plugin interceptor="com.xzg.cd.a88.SqlCostTimeInterceptor">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
剩余12页未读,继续阅读
地图帝
- 粉丝: 22
- 资源: 297
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- flowable-designer-5.22.0.zip
- threadmanager.cpp
- 腾讯云小程序 - 一站式开发与部署平台
- 基于JSP+Java+Servlet采用MVC模式开发的购物网站+源码(毕业设计&课程设计&项目开发)
- fastgestures安装包,模拟mac的触控板收拾,两指代表右击, 三指拖拽
- 基于组态王的升降式横移立体车库控制系统+源码(毕业设计&课程设计&项目开发)
- 基于python+Django和协同过滤算法的电影推荐系统+源码(毕业设计&课程设计&项目开发)
- 环境配置 vscode+jupyter
- 项目全部代码,还包含使用到的图片
- 项目全部代码,还包含使用到的图片
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0