1.简介
MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
这些类中方法的细节可以通过查看每个方法的签名来发现,或者直接查看 MyBatis 的发行包中的源代码。 假设你想做的不仅仅是监控方法的调用,那么你应该很好的了解正在重写的方法的行为。 因为如果在试图修改或重写已有方法的行为的时候,你很可能在破坏 MyBatis 的核心模块。 这些都是更低层的类和方法,所以使用插件的时候要特别当心。
1.1实现
1)实现 Interceptor 接口,通过@Intercepts指定拦截位置
@Intercepts({@Signature( type= Executor.class, method = "update", args = {MappedStatement.class,Object.class})}) public class ExamplePlugin implements Interceptor { public Object intercept(Invocation invocation) throws Throwable { return invocation.proceed(); } public Object plugin(Object target) { return Plugin.wrap(target, this); } public void setProperties(Properties properties) { } }
2)配置mybatis-config.xml
<plugins> <plugin interceptor="org.mybatis.example.ExamplePlugin"> <property name="someProperty" value="100"/> </plugin> </plugins>
2.实例
对StatementHandler.query方法进行拦截,记录慢SQL
package com.siyuan.dao.mybatis; import java.sql.Statement; import java.util.Properties; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.plugin.Interceptor; import org.apache.ibatis.plugin.Intercepts; import org.apache.ibatis.plugin.Invocation; import org.apache.ibatis.plugin.Plugin; import org.apache.ibatis.plugin.Signature; import org.apache.ibatis.session.ResultHandler; import org.apache.log4j.Logger; @Intercepts(@Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class })) public class SqlStatisticInterceptor implements Interceptor { private static final Logger LOGGER = Logger.getLogger(SqlStatisticInterceptor.class); // 慢SQL阀值 private int slowSQLThreshold = 3000; @Override public Object intercept(Invocation invocation) throws Throwable { long start = System.currentTimeMillis(); Object result = invocation.proceed(); long timeSpent = System.currentTimeMillis() - start; StatementHandler handler = (StatementHandler) invocation.getTarget(); String sql = handler.getBoundSql().getSql().trim(); LOGGER.debug("spent [" + timeSpent + "]ms for :\n" + sql); if (timeSpent >= slowSQLThreshold) { LOGGER.warn("slow sql which costs [" + timeSpent + "]ms has been found:\n" + sql); } return result; } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { if (properties.get("slowSQLThreshold") == null) { return; } this.slowSQLThreshold = Integer.parseInt((String) properties.get("slowSQLThreshold")); } }
2) mybatis-config.xml
<plugin interceptor="com.qfang.dao.mybatis.SqlStatisticInterceptor"> <property name="slowSQLThreshold" value="1000"/> </plugin>
3.原理
1)Interceptor.plugin方法将在创建Executor,ParameterHandler,ResultSetHandler,StatementHandler实例时被调用替代mybatis框架默认创建的实例
2)Plugin实现InvocationHandler,wrap方法通过Proxy创建Executor,ParameterHandler,ResultSetHandler,StatementHandler实例的代理类
public static Object wrap(Object target, Interceptor interceptor) { Map<Class<?>, Set<Method>> signatureMap = getSignatureMap(interceptor); Class<?> type = target.getClass(); Class<?>[] interfaces = getAllInterfaces(type, signatureMap); if (interfaces.length > 0) { return Proxy.newProxyInstance( type.getClassLoader(), interfaces, new Plugin(target, interceptor, signatureMap)); } return target; }
4.参考资料
http://www.mybatis.org/mybatis-3/zh/configuration.html#plugins
相关推荐
《IDEA中的MyBatis插件安装与使用详解——针对MAC系统》 IDEA作为一款强大的Java开发集成环境,深受广大开发者喜爱。为了让开发者在使用MyBatis框架时能更加高效便捷,JetBrains公司推出了专门的MyBatis插件。本文...
标题中的"Idea插件(Mybatis插件)"指的是在IntelliJ IDEA这个流行的Java集成开发环境中使用的Mybatis增强插件。这个插件是为了提高开发者在使用Mybatis框架时的效率和便利性而设计的。Mybatis是一款轻量级的持久层...
【标题】"idea 15 mybatis插件" 指的是在IntelliJ IDEA 15这个版本中使用的MyBatis集成插件。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,极大地简化了Java开发中的数据库操作。 ...
而"Idea MyBatis插件"则是针对IntelliJ IDEA这个强大的Java集成开发环境设计的一款增强工具,它可以提供更高效、便捷的MyBatis开发体验。 该插件的直接可用性意味着用户无需复杂设置,只需按照指定路径将其放置在...
eclipse中mybatis插件mybatipse离线安装包。在线安装总会中断,使用此离线安装包,解压放于eclipse的dropins目录下,重启eclipse即可! 功能: 1:要查找某一个方法 在dao接口中某一个方法中 按住 Ctrl键 鼠标指到...
Sonar7.8版本mybatis插件
Idea mybatis 插件 ,xml 各种提示 ,dao 层可以直接在 xml 文件生成方法,也可直接跳转到 xml
本篇文章将详细介绍两个针对MyBatis框架的IntelliJ IDEA插件——MyBatisCodeHelper-Pro和MybatisX,它们都是为了提升MyBatis开发体验而设计的。 首先,我们来看MyBatisCodeHelper-Pro。这款插件是专为MyBatis开发者...
标题 "Eclipse集成mybatis插件" 涉及到的是在Java开发环境中,如何将MyBatis这一流行的数据持久层框架与Eclipse IDE整合,以便于提高开发效率和代码质量。MyBatis是一个轻量级的框架,它允许开发者通过SQL映射文件将...
在提到的"MyBatis插件"中,我们可能是在讨论MyBatis的拦截器插件。这些插件允许开发者对MyBatis的执行过程进行拦截和增强,例如日志记录、性能分析、动态SQL等。MyBatis提供了Interceptor接口,开发人员可以通过实现...
本篇文章将详细介绍MyBatis插件在IntelliJ IDEA中的使用,以及如何与SSM(Spring、Spring MVC、MyBatis)框架集成。 标题提及的"Mybatis插件"通常是指针对IntelliJ IDEA开发的辅助工具,它可以提供智能提示、代码...
总结,Spring插件的使用极大地提升了开发效率,而Mybatis插件的融入让数据库操作更为简洁。Spring的IOC和AOP特性使得代码更加灵活,Mybatis则专注于SQL,两者结合提供了高效且易于维护的数据访问解决方案。了解并...
【标题】"Mybatis系列教程Mybatis插件共8页.pdf.z" 提供的信息表明,这是一个关于Mybatis框架的教程,特别关注Mybatis插件的使用。Mybatis是一款流行的Java持久层框架,它允许开发者直接编写SQL语句,提供灵活的数据...
在开发过程中,理解并优化SQL查询是提升应用程序性能的关键步骤,而MybatisLog与Free-Mybatis插件正是为此目的而设计的。 MybatisLog插件能够详细记录Mybatis执行的SQL语句,包括插入、更新、删除和查询等操作,...
本文将详细介绍Idea的Mybatis插件及其如何帮助我们从DAO层直接进入Mapper文件,从而实现更便捷的Mybatis相关DAO到Mapper的开发。 MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis...
### 编写一个Mybatis插件:Mybatis脱敏插件 #### 1. 前言 在软件开发过程中,对于涉及用户隐私的数据(如身份证号、手机号、银行卡号等)进行脱敏处理是非常重要的一步。不当的处理可能会导致隐私泄露,进而带来一...
对于MyBatis插件,可能需要去官方网站或者社区找到对应的链接。 3. 添加完成后,选择列出的插件,确保勾选MyBatis相关的选项,然后点击"Next",接受协议并继续安装。 4. 安装过程中可能需要重启Eclipse,安装完成后...
free-idea-mybatis是一个提高mybatis编码的插件。实现了dao代码跳转到mapper,mapper跳转回dao,mapper文件、statement查询自动生成功能。这里提供两个版本free-idea-mybatis-2019.12.18 和free-idea-mybatis-2018....
今天我们将探讨如何在IntelliJ IDEA中集成Mybatis插件,以及如何利用这个插件进行便捷的SQL操作,如insert、update、query的生成,以及主键查询生成XXXById的方法。 Mybatis是一款优秀的持久层框架,它支持定制化...
《IDEA的Mybatis插件详解与应用》 在现代软件开发中,集成开发环境(IDE)扮演着至关重要的角色,而IntelliJ IDEA(简称IDEA)作为Java开发的主流IDE之一,提供了丰富的功能和扩展插件,极大地提升了开发效率。其中...