mybatis插件原理及使用

mybatis插件原理及使用

一、简介

这里介绍mybatis中插件的原理及使用。将结合源码及示例进行说明。

二、插件应用场景

插件是mybatis的扩展方式,可用于添加默认值、日志记录、黑白名单等。

三、插件编写方式

mybatis插件是通过拦截器实现的,编写插件需要标识拦截方法和实现拦截逻辑。

3.1 标识拦截方法

标识拦截拦截方法是通过注解org.apache.ibatis.plugin.Intercepts和注解org.apache.ibatis.plugin.Signature实现的。

3.1.1 Intercepts注解

Intercepts注解内是一个Signature注解(每个Signature注解标识了一个需要拦截的方法)列表。Intercepts注解定义如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Intercepts {
   
  Signature[] value();
}
3.1.2 Signature注解

Signature注解位于Intercepts注解内,每个Signature注解标识了一个需要拦截的方法。Signature注解定义如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({
   })
public @interface Signature {
   
  //拦截的类对象
  Class<?> type();
  //拦截的方法名
  String method();
  //拦截方法的参数定义
  Class<?>[] args();
}
3.2 可拦截方法

mybatis插件可以对Executor、ParameterHandler、ResultSetHandler和StatementHandler接口的实现类进行拦截。
mybatis对上述接口的处理流程如下:

request Executor StatementHandler ParameterHandler ResultSetHandler start dispose start pre parameter(prepare/parameterize method) dispose end pre parameter dispose start dispose start dispose end disppose dispose start dispose end disppose end disppose end disppose request Executor StatementHandler ParameterHandler ResultSetHandler 插件请求处理流程图
3.2.1 Executor接口

Executor接收请求处理,负责请求处理的全过程。

public interface Executor {
   

  ResultHandler NO_RESULT_HANDLER = null;

  int update(MappedStatement ms, Object parameter) throws SQLException;

  <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey cacheKey, BoundSql boundSql) throws SQLException;

  <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException;

  <E> Cursor<E> queryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds) throws SQLException;

  List<BatchResult> flushStatements() throws SQLException;

  void commit(boolean required) throws SQLException;

  void rollback(boolean required) throws SQLException;

  CacheKey createCacheKey(MappedStatement ms, Object parameterObject, RowBounds rowBounds, BoundSql boundSql);

  boolean isCached(MappedStatement ms, CacheKey key);

  void clearLocalCache();

  void deferLoad(MappedStatement ms, MetaObject resultObject, String property, CacheKey key, Class<?> targetType);

  Transaction getTransaction();

  void close(boolean forceRollback);

  boolean isClosed();

  void setExecutorWrapper(Executor executor);

}
3.2.2 ParameterHandler接口

ParameterHandler是参数的处理,通过插件可以对参数进行修改设置。

public interface ParameterHandler {
   

  Object getParameterObject();

  void setParameters(PreparedStatement ps)throws SQLException;
}
3.2.3 StatementHandler接口

StatementHandler是执行sql的过程,通过插件可以重写sql。

public interface StatementHandler {
   

  Statement prepare(Connection connection, Integer transactionTimeout)
      throws SQLException;

  void parameterize(Statement statement)
      throws SQLException;

  void batch(Statement statement)
      throws</
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值