日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

一篇聊聊Mybatis插件開(kāi)發(fā)

來(lái)源: 責(zé)編: 時(shí)間:2023-09-21 20:48:26 345觀看
導(dǎo)讀Mybatis的插件,主要用于在執(zhí)行sql前后,對(duì)sql進(jìn)行封裝加工,或者在sql執(zhí)行后,對(duì)數(shù)據(jù)進(jìn)行加工處理。常用于一些公共數(shù)據(jù)操作處理,例如:分頁(yè)插件,在執(zhí)行sql查詢前增加分頁(yè)參數(shù)多租戶系統(tǒng)中,增加租戶ID參數(shù)。增加更新時(shí)間、創(chuàng)建時(shí)

Mybatis的插件,主要用于在執(zhí)行sql前后,對(duì)sql進(jìn)行封裝加工,或者在sql執(zhí)行后,對(duì)數(shù)據(jù)進(jìn)行加工處理。常用于一些公共數(shù)據(jù)操作處理,例如:9cU28資訊網(wǎng)——每日最新資訊28at.com

  1. 分頁(yè)插件,在執(zhí)行sql查詢前增加分頁(yè)參數(shù)
  2. 多租戶系統(tǒng)中,增加租戶ID參數(shù)。
  3. 增加更新時(shí)間、創(chuàng)建時(shí)間、更新人、創(chuàng)建人的參數(shù)信息。
  4. 數(shù)據(jù)權(quán)限中,增加參數(shù)查詢。

插件開(kāi)發(fā)過(guò)程

確定需要攔截的簽名

指定需要攔截的方法,通過(guò)方法簽名來(lái)指定,方法簽名即指定哪個(gè)類的哪個(gè)方法+方法參數(shù)。這里的類不能隨便寫(xiě),只能從以下幾個(gè)類中選,也就是說(shuō),MyBatis 插件可以攔截四大對(duì)象中的任意一個(gè)。9cU28資訊網(wǎng)——每日最新資訊28at.com

  • Executor 是執(zhí)行 SQL 的全過(guò)程,包括組裝參數(shù),組裝結(jié)果集返回和執(zhí)行 SQL 過(guò)程,都可以攔截。
  • StatementHandler 是執(zhí)行 SQL 的過(guò)程,我們可以重寫(xiě)執(zhí)行 SQL 的過(guò)程。
  • ParameterHandler 是攔截執(zhí)行 SQL 的參數(shù)組裝,我們可以重寫(xiě)組裝參數(shù)規(guī)則。
  • ResultSetHandler 用于攔截執(zhí)行結(jié)果的組裝,我們可以重寫(xiě)組裝結(jié)果的規(guī)則。

我們來(lái)看以下mybatisplus的插件配置的簽名:9cU28資訊網(wǎng)——每日最新資訊28at.com

@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指定四大類型中的任意一個(gè),method指定攔截類型中方法,args指定方法參數(shù)。例如:9cU28資訊網(wǎng)——每日最新資訊28at.com

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

指定了攔截StatementHandler的prepare方法,方法有兩個(gè)參數(shù),一個(gè)是Connection類型,另一個(gè)是Integer類型。9cU28資訊網(wǎng)——每日最新資訊28at.com

public interface StatementHandler {  Statement prepare(Connection connection, Integer transactionTimeout)      throws SQLException;            //....      }

插件接口定義

在 MyBatis 中開(kāi)發(fā)插件,需要實(shí)現(xiàn) Interceptor 接口。接口的定義如下:9cU28資訊網(wǎng)——每日最新資訊28at.com

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

實(shí)現(xiàn)插件

創(chuàng)建個(gè)類實(shí)現(xiàn)Interceptor接口,并且在實(shí)現(xiàn)類上指定方法簽名即可。9cU28資訊網(wǎng)——每日最新資訊28at.com

最后需要在mybatis配置文件中配置插件9cU28資訊網(wǎng)——每日最新資訊28at.com

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

最后建議看一下MybatisPlusInterceptor的實(shí)現(xiàn),里面還使用到了責(zé)任鏈設(shè)計(jì)模式。9cU28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-10908-0.html一篇聊聊Mybatis插件開(kāi)發(fā)

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 一起聊聊GraalVM for JDK 21

下一篇: C++函數(shù)式編程:提高代碼表達(dá)力和可維護(hù)性

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top 主站蜘蛛池模板: 巴楚县| 东平县| 鄯善县| 顺昌县| 宁强县| 桦川县| 胶州市| 高淳县| 元阳县| 睢宁县| 奉节县| 双辽市| 蒙自县| 平乡县| 兴化市| 永福县| 和硕县| 普洱| 四平市| 丹东市| 武冈市| 宾川县| 红桥区| 城固县| 会东县| 灵川县| 元阳县| 诏安县| 高尔夫| 静海县| 泸溪县| 万载县| 博野县| 吉木萨尔县| 惠来县| 宁海县| 津市市| 西吉县| 邓州市| 福海县| 嘉荫县|