成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇聊聊Mybatis插件開發

開發 前端
允許在 plugin 元素中配置所需參數,方法在插件初始化的時候就被調用了一次,然后把插件對象存入到配置中,以便后面再取出。

Mybatis的插件,主要用于在執行sql前后,對sql進行封裝加工,或者在sql執行后,對數據進行加工處理。常用于一些公共數據操作處理,例如:

  1. 分頁插件,在執行sql查詢前增加分頁參數
  2. 多租戶系統中,增加租戶ID參數。
  3. 增加更新時間、創建時間、更新人、創建人的參數信息。
  4. 數據權限中,增加參數查詢。

插件開發過程

確定需要攔截的簽名

指定需要攔截的方法,通過方法簽名來指定,方法簽名即指定哪個類的哪個方法+方法參數。這里的類不能隨便寫,只能從以下幾個類中選,也就是說,MyBatis 插件可以攔截四大對象中的任意一個。

  • Executor 是執行 SQL 的全過程,包括組裝參數,組裝結果集返回和執行 SQL 過程,都可以攔截。
  • StatementHandler 是執行 SQL 的過程,我們可以重寫執行 SQL 的過程。
  • ParameterHandler 是攔截執行 SQL 的參數組裝,我們可以重寫組裝參數規則。
  • ResultSetHandler 用于攔截執行結果的組裝,我們可以重寫組裝結果的規則。

我們來看以下mybatisplus的插件配置的簽名:

@Intercepts(
    {
        @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}),
        @Signature(type = StatementHandler.class, method = "getBoundSql", args = {}),
        @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),
        @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
        @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}),
    }
)
public class MybatisPlusInterceptor implements Interceptor {
//...
}

type指定四大類型中的任意一個,method指定攔截類型中方法,args指定方法參數。例如:

@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})

指定了攔截StatementHandler的prepare方法,方法有兩個參數,一個是Connection類型,另一個是Integer類型。

public interface StatementHandler {

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

插件接口定義

在 MyBatis 中開發插件,需要實現 Interceptor 接口。接口的定義如下:

public interface Interceptor {
 
  Object intercept(Invocation invocation) throws Throwable;
 
  Object plugin(Object target);
 
  void setProperties(Properties properties);
 
}
  • intercept 方法:它將直接覆蓋你所攔截對象原有的方法,因此它是插件的核心方法。通過 invocation 參數可以反射調度原來對象的方法。
  • plugin 方法:target 是被攔截對象,它的作用是給被攔截對象生成一個代理對象,并返回它。為了方便 MyBatis 使用 org.apache.ibatis.plugin.Plugin 中的 wrap 靜態方法提供生成代理對象。
  • setProperties 方法:允許在 plugin 元素中配置所需參數,方法在插件初始化的時候就被調用了一次,然后把插件對象存入到配置中,以便后面再取出。

實現插件

創建個類實現Interceptor接口,并且在實現類上指定方法簽名即可。

最后需要在mybatis配置文件中配置插件

<plugins>
        <plugin interceptor="com.yjw.demo.mybatis.common.page.PageInterceptor">
        </plugin>
    </plugins>

最后建議看一下MybatisPlusInterceptor的實現,里面還使用到了責任鏈設計模式。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2023-07-31 07:48:43

Java內存虛擬機

2023-08-03 07:34:34

格式化字符串參數

2022-06-02 07:11:13

JVMJava

2023-12-08 08:26:05

數據存儲持久性

2021-11-15 07:47:40

字符串位置存儲

2021-10-30 07:55:00

BLE 藍牙開發

2022-10-08 15:07:06

ChatOps運維

2021-04-16 07:46:13

Serverless 云開發FaaS

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2022-02-07 11:01:23

ZooKeeper

2023-04-20 08:00:00

ES搜索引擎MySQL

2021-05-20 06:57:16

RabbitMQ開源消息

2022-12-19 08:14:30

注解開發配置

2022-10-26 07:39:36

MVCC數據庫RR

2022-01-02 08:43:46

Python

2022-10-20 18:00:00

MyBatis緩存類型

2021-11-03 14:49:20

開發摸魚側邊欄

2020-11-20 10:15:05

TensorFlow

2025-05-13 01:10:00

數據產品開發

2022-03-18 07:48:58

GhostNode.js開源
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品综合视频 | 精品国产精品一区二区夜夜嗨 | 伊人啪啪网 | 日韩不卡在线观看 | 91九色porny首页最多播放 | 99久久99热这里只有精品 | www.中文字幕av| 国产美女视频黄 | 国产一级黄色网 | 中文字幕国产日韩 | 国产一区中文 | 国产精品久久亚洲 | 在线视频a | 国产成人久久精品一区二区三区 | 亚洲精品一区中文字幕乱码 | 美女精品一区 | 91精品国产一区二区三区 | 精品视频一区二区在线观看 | 欧美精品福利 | 中文字幕日韩一区二区 | 久久成人精品视频 | 日本网站免费在线观看 | 91精品国产91久久久久久三级 | 91麻豆精品国产91久久久久久久久 | 免费欧美| 国产精品二区三区在线观看 | 久久综合一区 | 亚洲一区亚洲二区 | 日本男人天堂 | 久久一日本道色综合久久 | 国产精品久久久久久久久久久新郎 | 一区二区三区免费在线观看 | 久久se精品一区精品二区 | 亚洲欧美日韩在线 | 成人九色 | 不卡一区 | 一区免费看 | 国产91在线播放 | 国产中文字幕在线观看 | 色综合成人网 | 久久久久久亚洲精品 |