精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MyBatis 攔截器,帶你輕松搞定數據脫敏!

數據庫 其他數據庫
MyBatis 攔截器是一種插件機制,用于在 MyBatis 執行 SQL 語句時對其進行攔截、修改或增強。攔截器可以插入到 MyBatis 的執行過程中的不同位置,從而實現自定義的行為,例如記錄日志、修改 SQL 查詢、增強性能等。

1. 引言

1.1 什么是 MyBatis 攔截器

MyBatis 攔截器是一種插件機制,用于在 MyBatis 執行 SQL 語句時對其進行攔截、修改或增強。攔截器可以插入到 MyBatis 的執行過程中的不同位置,從而實現自定義的行為,例如記錄日志、修改 SQL 查詢、增強性能等。

  • 定義:MyBatis 攔截器是一種自定義插件,可以通過它攔截 MyBatis 核心組件(如 Executor、StatementHandler、ParameterHandler、ResultSetHandler)的方法調用。通過攔截器,我們可以在不修改 MyBatis 源碼的情況下,改變其行為或增強其功能。
  • 功能:

修改 SQL 語句,例如根據某些業務規則動態拼接 SQL。

記錄 SQL 執行日志、性能監控,統計執行時間等。

控制事務或實現緩存邏輯等。

1.2 為什么使用攔截器

使用 MyBatis 攔截器的主要原因是需要在不修改核心代碼的情況下,靈活地擴展 MyBatis 的功能。常見的應用場景包括:

  • 日志記錄:通過攔截器記錄每個 SQL 語句的執行情況,包括 SQL 本身、執行時間、返回結果等信息,用于后期分析和調試。
  • SQL 性能監控:攔截器可以用于統計 SQL 執行的時間,從而評估 SQL 的性能。長時間執行的 SQL 可以被識別出來,作為性能優化的目標。
  • 修改 SQL 語句:通過攔截器可以動態修改 SQL 語句,例如,在查詢中動態插入條件、修改排序規則,或者添加分頁邏輯。
  • 事務控制:在執行 SQL 操作之前、之后,或者在某些異常發生時,攔截器可以用來增強事務管理。

2. MyBatis 攔截器工作原理

2.1 攔截器的核心概念

MyBatis 攔截器工作時,核心組件是 Invocation、Interceptor、Method 和 Target 對象等:

  • Interceptor:這是所有自定義攔截器的接口,MyBatis 會根據配置找到并調用實現該接口的類。
  • Invocation:封裝了方法調用的對象,它包含了目標方法的信息以及方法的參數。通過 Invocation 對象,我們可以對方法的執行進行控制。
  • Method:表示目標方法,它是通過反射來獲取的。
  • Target:表示目標對象,它是被攔截的對象。例如,Executor、StatementHandler 等都是目標對象,攔截器會通過 Target 對象來訪問和控制這些對象的行為。

2.2 攔截器的生命周期

MyBatis 中,攔截器的生命周期通常包含三個階段:

  1. 插件初始化:當 MyBatis 啟動時,它會加載并初始化所有配置的攔截器。這時,攔截器會準備好攔截邏輯。
  2. 攔截執行:當 MyBatis 執行某個 SQL 語句時,會觸發攔截器的 intercept() 方法,這時攔截器會獲取執行方法的參數,可以進行修改、增強或替換方法的執行。
  3. 插件銷毀:攔截器在 MyBatis 銷毀時會清理資源,釋放占用的內存或線程等。

2.3 目標對象和方法

在 MyBatis 中,主要有四個目標對象可以被攔截:

  • Executor:執行 SQL 語句的核心對象。它的 update()、query() 等方法負責執行實際的增、刪、改、查操作。
  • StatementHandler:處理 SQL 語句的對象。它負責將 SQL 語句和參數綁定,并將其傳遞給數據庫。
  • ResultSetHandler:處理 SQL 查詢結果的對象。它負責將從數據庫返回的 ResultSet 轉換為 Java 對象。
  • ParameterHandler:處理 SQL 參數綁定的對象。它負責將參數設置到 SQL 語句中。

3. MyBatis 攔截器的實現

這里小編會分享工作中實際的案例: 數據脫敏。

3.1 自定義脫敏注解

首先需要知曉具體是哪個類中的哪些屬性需要進行脫敏處理,因此,需要自定義注解來實現對需要脫敏的屬性進行標注。

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Desensitization {
    StrategyEnum strategy();
}

3.2 脫敏策略

有了標注后,對于脫敏也會涉及到脫敏策略的問題。不同的屬性,應該對應不同的脫敏方式,例如,名字只保留姓氏,而身份證和電話號碼,則需要對中間的數字打碼。因此,在使用自定義注解進行標注的同時,也要指定這個屬性對應的脫敏策略,這里使用枚舉類枚舉出不同屬性對應的正則處理。

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum StrategyEnum {

    NAME(s -> s.replaceAll("([\\u4e00-\\u9fa5]{1})(.*)", "$1*")),
    ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2")),
    PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),
    ADDRESS(s -> s.replaceAll("(\\s{8})\\s{4}(\\s*)\\s{4})", "$1****$2****"));

    private final Desensitizer desensitizer;

}

3.3 脫敏執行者

對于脫敏處理還需要一個執行者,將屬性值和正則表達式進行匹配和替換,進而完成脫敏處理。這里我們利用了JDK8提供的一個非常好用的接口Fuction,它提供了apply方法,這個方法作用是為了實現函數映射,也就是將一個值轉換為另一個值。如果不了解的同學可以百度下 Fuction 接口。

import java.util.function.Function;

public interface Desensitizer extends Function<String, String> {
}

3.4 自定義數據脫敏攔截器

因為要對結果集進行脫敏處理,所以要攔截的對象肯定是ResultSetHandler,并且是第一個方法。(可以想一下為啥是第一個方法)

public interface ResultSetHandler {
    <E> List<E> handleResultSets(Statement var1) throws SQLException;

    <E> Cursor<E> handleCursorResultSets(Statement var1) throws SQLException;

    void handleOutputParameters(CallableStatement var1) throws SQLException;
}

來看下具體的實現:

import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.sql.Statement;
import java.util.List;
import java.util.stream.Stream;

@Component
@Intercepts(@Signature(type = ResultSetHandler.class, method = "handleResultSets", args = Statement.class))
public class DesensitizationPlugin implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 獲取結果集
        List<Object> records = (List<Object>) invocation.proceed();
        // 處理結果集
        records.forEach(this::desensitization);
        return records;
    }

    /**
     * 2 * 判斷哪些需要脫敏處理
     * 3 * @param source 脫敏之前的源對象
     * 4
     */
    private void desensitization(Object source) {
        // 反射獲取類型中的所有屬性,判斷哪個需要進行脫敏
        Class<?> sourceClass = source.getClass();
        MetaObject metaObject = SystemMetaObject.forObject(source);
        Stream.of(sourceClass.getDeclaredFields())
                .filter(field -> field.isAnnotationPresent(Desensitization.class))
                .forEach(field -> doDesensitization(metaObject, field));
    }

    /**
     * 2 * 真正的脫敏處理
     * 3 * @param metaObject
     * 4
     */
    private void doDesensitization(MetaObject metaObject, Field field) {
        String name = field.getName();
        Object value = metaObject.getValue(name);
        if (value != null && metaObject.getGetterType(name) == String.class) {
            Desensitization annotation = field.getAnnotation(Desensitization.class);
            StrategyEnum strategy = annotation.strategy();
            String apply = strategy.getDesensitizer().apply((String) value);
            metaObject.setValue(name, apply);
        }
    }
}

數據脫敏字段:

import com.example.cl.mybatisPlugin.Desensitization;
import com.example.cl.mybatisPlugin.StrategyEnum;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
    private Long id;
    @Desensitization(strategy = StrategyEnum.NAME)
    private String name;
    private Integer age;
}

最后看下脫敏結果:

圖片圖片

4. 總結

根據上面的說明,我們來看看MyBatis 攔截器的優勢和不足

  • 優勢:

非侵入式:通過攔截器機制,不需要修改 MyBatis 源碼即可定制功能。

靈活性:可以在多個階段對 SQL 操作進行干預,從而實現豐富的功能。

  • 不足:

性能開銷:如果攔截器過多或者邏輯復雜,可能會導致性能下降。

調試困難:攔截器的執行過程較為隱式,調試時可能會遇到一定的困難。

因此,我們攔截器不能創建過多,如果攔截的對象同一個,那么我們可以將多個功能放到同一個攔截器當中,從而減少攔截器的創建。

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2025-01-02 10:10:51

2023-11-13 08:16:08

MySQL數據數據庫

2025-07-15 02:00:00

2019-07-09 08:23:07

數據安全旅游網絡安全

2024-09-09 16:50:21

2025-08-01 07:07:18

2024-08-29 08:58:30

JPA編寫數據操

2024-07-17 08:29:20

2016-04-29 10:02:39

2025-03-11 08:34:22

2009-06-24 16:00:00

2025-07-30 01:00:25

2016-09-09 01:07:06

數據中心容量規劃數據中心

2009-09-27 17:37:32

Hibernate攔截

2025-02-28 08:14:53

2024-02-28 09:35:52

2019-12-19 08:56:21

MybatisSQL執行器

2025-06-09 07:35:00

NumPy數據分析數組

2023-09-05 08:58:07

2011-05-16 10:14:11

Hibernate
點贊
收藏

51CTO技術棧公眾號

豆国产97在线 | 亚洲| 亚洲一区二区三区观看| 婷婷伊人综合中文字幕| 久久亚洲精选| 播播国产欧美激情| 扒开伸进免费视频| 日韩国产激情| 亚洲精选视频免费看| 官网99热精品| 波多野结衣一区二区三区在线| 午夜片欧美伦| 亚洲男人av在线| 深夜视频在线观看| 日本一区免费网站| 亚洲成av人片在线观看无码| 日韩精品资源| 天堂av2024| 国产一区二区三区免费看| 97在线视频免费播放| 欧美xxxooo| 一呦二呦三呦国产精品| 日韩欧美一级二级| 538在线视频观看| 大桥未久在线视频| 亚洲欧美日韩中文字幕一区二区三区 | 91在线高清视频| 国产三级av片| 国产精品jizz在线观看美国| 伊人久久久久久久久久久| 黄色免费视频网站| 成人爽a毛片免费啪啪红桃视频| 欧美日韩另类国产亚洲欧美一级| 免费看国产曰批40分钟| 日本无删减在线| 亚洲三级在线免费观看| 亚洲va久久久噜噜噜久久狠狠| 天堂在线资源网| 国产成人免费xxxxxxxx| 成人免费视频在线观看超级碰| 日本免费精品视频| 久久精品动漫| 欧美亚洲另类制服自拍| 久久久午夜影院| 亚洲欧洲午夜| 98视频在线噜噜噜国产| 国产极品美女高潮无套嗷嗷叫酒店| 国产精品黑丝在线播放| 自拍亚洲一区欧美另类| 免费观看a级片| 精品一二三区| 中文字幕国产日韩| 青青青视频在线免费观看| 国产探花在线精品一区二区| 日韩精品免费视频| 极品人妻一区二区三区| 亚洲理论电影片| 亚洲欧美中文日韩v在线观看| 久久无码人妻精品一区二区三区| 国产一区调教| 亚洲国产又黄又爽女人高潮的| 国产精品手机在线观看| 卡通动漫精品一区二区三区| 亚洲电影免费观看高清| 中文字幕一区二区人妻电影丶| 久久av国产紧身裤| 亚洲美女av电影| 黄色片在线观看免费| 成人一区二区| 久久国产精品久久久久| 久久精品视频日本| 校园激情久久| 国产精品人人做人人爽| 91国内精品视频| 国产麻豆日韩欧美久久| 国产亚洲精品自在久久| 欧美另类自拍| 一区视频在线播放| 妞干网视频在线观看| 中文在线免费视频| 欧美色窝79yyyycom| 一区二区久久精品| 国产精品99久久免费观看| 亚洲国产精品字幕| 五月天精品在线| 综合av在线| 欧美一级电影久久| 中文无码av一区二区三区| 国产一区二区不卡在线| 国产精品免费区二区三区观看| 三级做a全过程在线观看| 欧美高清在线一区二区| 日日噜噜夜夜狠狠久久丁香五月| 国产一线二线在线观看| 色婷婷一区二区| 6080国产精品| 网友自拍一区| 欧美成人免费小视频| 青草视频在线观看免费| 久久国产生活片100| 国产一区免费在线| 免费在线午夜视频| 色综合久久久久久久久久久| 国产欧美一区二| 亚洲精品456| 欧美日韩国产二区| 伊人网视频在线| 99视频热这里只有精品免费| 正在播放久久| 欧美成人ⅴideosxxxxx| 日韩欧美在线影院| 国产欧美小视频| 亚洲天堂黄色| 亚洲iv一区二区三区| 欧美日韩国产综合视频 | 久久久久99精品| 免费一区二区视频| 精品产品国产在线不卡| 大地资源网3页在线观看| 91福利在线观看| 性久久久久久久久久久| 欧美成人日韩| 成人av在线天堂| 春暖花开成人亚洲区| 欧美午夜片欧美片在线观看| 一卡二卡三卡四卡五卡| 99久久99热这里只有精品| 国产999在线| 香港三日本三级少妇66| 亚洲综合男人的天堂| 国产成人美女视频| 第四色成人网| 国产999精品| 欧美视频免费一区二区三区| 亚洲成人综合在线| 国产日韩视频一区| 午夜久久福利| 亚洲最大av网| 高清免费电影在线观看| 在线观看91av| 成人在线观看免费完整| 激情综合网最新| 亚洲一区二区三区四区中文| 日韩天堂在线| 亚洲午夜久久久影院| 中国一级特黄毛片| 99精品视频一区二区三区| 人妻少妇精品久久| 加勒比中文字幕精品| 97视频色精品| 三级理论午夜在线观看| 欧美色视频日本高清在线观看| a级片在线观看视频| 黄色成人精品网站| 国产一区二区不卡视频| a国产在线视频| 亚洲国产欧美在线成人app| 日韩 欧美 精品| 成人午夜免费av| 欧美日韩性生活片| 亚洲精品3区| 国产精品欧美久久久| 免费不卡视频| 欧美成人精品3d动漫h| 国产中文字幕免费| 91日韩精品一区| 成年人免费在线播放| 欧美色女视频| 91视频国产一区| 国产啊啊啊视频在线观看| 精品少妇一区二区三区免费观看| 日产精品久久久久| 国产亚洲欧美色| 中文字幕亚洲影院| 亚洲精品社区| 欧美性xxxx69| 四虎影视成人精品国库在线观看| 久久精品视频一| 亚洲第一色网站| 欧美性高潮床叫视频| av电影网站在线观看| 激情另类小说区图片区视频区| 欧洲金发美女大战黑人| 特黄特色欧美大片| 国产专区欧美专区| h片视频在线观看| 在线播放日韩av| 亚洲av无码国产综合专区 | 精品少妇在线视频| 精品国产一区二区三区久久久樱花| 国产精品自产拍高潮在线观看| 在线heyzo| 亚洲美女免费精品视频在线观看| 97国产成人无码精品久久久| 亚洲国产精品尤物yw在线观看| 中文字幕高清视频| 国产精品一二三| 欧在线一二三四区| 欧美在线播放| 欧美深深色噜噜狠狠yyy| 国产精品久久久久久av公交车| 韩国三级电影久久久久久| 欧美被日视频| 亚洲精品综合久久中文字幕| 国产精品系列视频| 色老头久久综合| 久久综合激情网| 国产精品欧美经典| 精品夜夜澡人妻无码av| 国产在线乱码一区二区三区| 国产又大又硬又粗| 亚洲私拍自拍| 色婷婷777777仙踪林| 国内精品伊人久久久| 国产乱码精品一区二区三区日韩精品| 成人精品国产亚洲| 欧美综合激情网| 欧美xxxx少妇| 久久中文字幕在线视频| 国产精品ⅴa有声小说| 精品福利在线导航| 国产a级免费视频| 欧美日韩不卡一区| 男操女视频网站| 欧美午夜激情在线| 日韩欧美不卡视频| 一卡二卡三卡日韩欧美| 国产色无码精品视频国产| 国产欧美日韩精品a在线观看| 欧美双性人妖o0| 大白屁股一区二区视频| 91热视频在线观看| 激情文学综合插| 最新国产黄色网址| 免费在线看成人av| 欧美精品性生活| 日韩国产在线观看一区| 妺妺窝人体色www在线小说| 亚洲天堂激情| 日韩黄色短视频| 亚洲二区免费| 国产中文字幕二区| 亚洲福利电影| 欧美极品欧美精品欧美| 亚洲国产美女| 777精品久无码人妻蜜桃| 精品动漫av| 成人黄色av片| 亚洲综合99| 欧美日韩激情视频在线观看 | 午夜免费福利视频在线观看| 日本中文字幕不卡| 视频二区在线播放| 国内精品写真在线观看| 亚洲色图偷拍视频| 国产精品亚洲人在线观看| 日韩精品国产一区| 成人av在线播放网站| 色综合久久五月| 2021国产精品久久精品| 国产一二三四五区| 国产精品亲子乱子伦xxxx裸| 很污很黄的网站| 亚洲乱码中文字幕| 国产精彩视频在线观看| 欧美日韩亚洲一区二区| 亚洲中文一区二区| 欧美日韩大陆在线| 亚洲免费成人网| 日韩av最新在线| 麻豆国产在线播放| 日韩中文字幕av| 天使と恶魔の榨精在线播放| 国内免费精品永久在线视频| 欧美男女交配| 91免费在线视频| 日韩av三区| 亚洲精品一区二区三区樱花| 中文精品久久| 一本大道熟女人妻中文字幕在线 | 最新国产精品自拍| 91视频一区二区三区| av永久免费观看| 亚洲免费在线播放| 精品免费囯产一区二区三区| 欧美日韩国产a| 粉嫩av一区二区夜夜嗨| 亚洲丝袜在线视频| 91黄色在线| 日本高清+成人网在线观看| 欧美性生活一级| 精品日本一区二区| 91久久电影| 国产精品亚洲αv天堂无码| 精品在线播放免费| 成人无码www在线看免费| 亚洲欧洲日本在线| 免费在线不卡视频| 制服丝袜亚洲色图| 你懂的视频在线播放| 欧美另类69精品久久久久9999| 二区三区不卡| av一区观看| 久久伦理在线| av天堂永久资源网| 顶级嫩模精品视频在线看| 波多野结衣一二三四区| 亚洲444eee在线观看| 国产精品无码在线播放| 亚洲丝袜av一区| 极品在线视频| 91久久大香伊蕉在人线| 欧美日韩精品一区二区视频| 男人插女人视频在线观看| 国产一区二区网址| a资源在线观看| 欧美性猛交xxxx免费看久久久| jlzzjlzzjlzz亚洲人| 一道本无吗dⅴd在线播放一区 | 国产精品va在线播放我和闺蜜| 玖玖精品一区| 一区精品在线| 奇米影视一区二区三区小说| 欧美丰满少妇人妻精品| 亚洲国产精品久久久久秋霞影院| 91丨九色丨丰满| 最近中文字幕mv在线一区二区三区四区| 黄色软件视频在线观看| av免费精品一区二区三区| 亚洲免费二区| 久久久久久久久久一区二区| 国产欧美精品日韩区二区麻豆天美| 国产极品美女高潮无套嗷嗷叫酒店| 91精品国产综合久久福利| 免费在线看黄色| 国产在线视频91| 五月开心六月丁香综合色啪| 波多野结衣xxxx| 国产精品久久免费看| 中文字幕欧美人妻精品一区蜜臀| 亚洲欧美激情一区| 超碰国产一区| 免费试看一区| 日韩中文字幕一区二区三区| 丝袜美腿中文字幕| 日本道色综合久久| 风间由美一区| 国产伦精品免费视频| 欧美高清视频手机在在线| 最新天堂中文在线| 亚洲同性同志一二三专区| 国产精品人人爽| 欧美成人精品不卡视频在线观看| 精品国产乱码一区二区三区| 手机在线视频你懂的| 国产一区美女在线| 免费在线视频观看| 日韩精品一区二区在线| 久久亚洲导航| 久久综合九色欧美狠狠| 日日摸夜夜添夜夜添精品视频| 我想看黄色大片| 欧美片网站yy| 欧美xxx黑人xxx水蜜桃| 久久精品女人的天堂av| 三级在线观看一区二区| 亚洲综合第一区| 欧美成人r级一区二区三区| 成av人片在线观看www| 欧美激情论坛| 捆绑调教美女网站视频一区| 丁香花五月激情| 亚洲国产美女久久久久| 日韩成人影音| 香蕉视频在线网址| 97久久超碰国产精品电影| 最近中文字幕在线观看视频| 久热爱精品视频线路一| 欧美丝袜美腿| 色乱码一区二区三区在线| 一区二区三区中文免费| 日韩在线无毛| 91九色综合久久| 国产日韩一区二区三区在线| 99精品欧美一区二区| 欧美一区二区久久| 中日韩脚交footjobhd| 99re99热| 久久综合九色综合久久久精品综合| 精品一区二三区| 欧美区在线播放| 久久超碰99| 熟女人妻一区二区三区免费看| 一本久久a久久精品亚洲| 好操啊在线观看免费视频| 久久国产精品一区二区三区四区| 乱一区二区av| 日本午夜视频在线观看| 久久国产精品99国产精| 欧美亚洲在线日韩| 亚洲 欧美 日韩在线|