精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久www免费人成看片高清| 日韩欧美精品综合| 日本久久一区二区| 亚洲最大免费| 精品人妻伦一区二区三区久久| 韩国精品一区二区三区| 亚洲男人的天堂网站| 手机精品视频在线| 天堂中文av在线资源库| 国产精品欧美经典| 国产精品传媒毛片三区| 91丝袜一区二区三区| 中文在线播放一区二区| 亚洲欧美日韩另类| 男插女视频网站| 二吊插入一穴一区二区| 亚洲一区二区免费视频| 亚洲国产综合自拍| 熟妇人妻av无码一区二区三区| 久久精品99国产国产精| 26uuu另类亚洲欧美日本一| 日韩一卡二卡在线观看| 国产99亚洲| 精品国产欧美一区二区| 在线能看的av网站| 欧美xo影院| 亚洲一区二区精品视频| 国产系列第一页| porn亚洲| 久久久久久97三级| 国产一级特黄a大片99| 国产又黄又大又爽| 亚洲一卡久久| 性色av一区二区三区免费| 国产suv精品一区二区68| 国产aⅴ精品一区二区三区久久| 亚洲国产精品电影| 国产又黄又嫩又滑又白| crdy在线观看欧美| 欧美唯美清纯偷拍| 人妻丰满熟妇av无码区app| 波多野结衣在线播放| 亚洲精品日产精品乱码不卡| 中文网丁香综合网| 日本在线免费播放| 国产精品理伦片| 欧洲一区二区在线| 国产一区电影| 久久精品亚洲精品国产欧美| 久久一区免费| 青青国产在线| 国产三级久久久| 日本视频精品一区| porn亚洲| 亚洲欧美自拍偷拍色图| 99精品视频网站| 久久日韩视频| 亚洲精品中文字幕乱码三区| 日本黄xxxxxxxxx100| 成a人片在线观看| 一区二区三区中文在线观看| 欧美一级爱爱视频| 蜜桃传媒在线观看免费进入| 亚洲高清在线精品| 欧美成人高潮一二区在线看| 啊啊啊久久久| 一本色道久久加勒比精品| 中文字幕无码不卡免费视频| 成人午夜在线| 日韩一区二区三区视频在线| 亚洲一级片免费观看| 成人福利一区| 亚洲区中文字幕| 东京热无码av男人的天堂| 久久综合av| 欧美高清视频一区二区| 全部毛片永久免费看| 日欧美一区二区| 成人激情黄色网| 亚洲免费黄色片| 久久久欧美精品sm网站| 五月天色婷婷综合| 91色在线看| 欧美综合色免费| 超碰在线免费av| 亚州综合一区| 日韩一级裸体免费视频| 久久久久久久久97| 日韩av电影免费观看高清完整版| 91精品久久久久久久久久久久久久 | 欧美另类交人妖| 日韩精品一卡二卡| 免费人成黄页网站在线一区二区| 91沈先生在线观看| 午夜视频福利在线| 中文字幕一区二区不卡| 蜜臀av色欲a片无码精品一区| 两个人看的在线视频www| 欧美午夜电影网| 大尺度做爰床戏呻吟舒畅| 欧美中文字幕一区二区| 欧美国产日韩一区二区三区| www.久久久久久久| 国产精品77777| 日本亚洲导航| av今日在线| 欧美裸体bbwbbwbbw| 性色av蜜臀av色欲av| **女人18毛片一区二区| 国产91精品不卡视频| 国产情侣一区二区| 国产视频一区在线播放| 欧美一区二区视频在线播放| 亚洲精品成人图区| 欧美成人一区二区三区在线观看| 中文字幕第24页| 最新成人av网站| 91丨九色丨国产在线| 黄网在线免费| 图片区日韩欧美亚洲| 亚洲女人在线观看| 日韩大片在线播放| 日韩美女视频免费在线观看| 国 产 黄 色 大 片| 亚洲天堂福利av| 欧美三级午夜理伦三级富婆| 亚洲亚洲免费| 26uuu另类亚洲欧美日本老年| 亚洲va欧美va| 亚洲精品高清在线| 亚洲欧美日韩精品一区| 国产探花在线精品| 68精品久久久久久欧美| 亚洲精品人妻无码| 亚洲精品国产成人久久av盗摄| 在线观看免费污视频| 不卡中文字幕| 国产精品丝袜高跟| 第九色区av在线| 在线这里只有精品| 国产激情在线免费观看| 亚洲一区中文| 欧美精品一区在线发布| 三级中文字幕在线观看| 日韩精品在线观看网站| 日韩欧美一级视频| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 一道本在线免费视频| 第一会所sis001亚洲| 国产精品电影久久久久电影网| 毛片在线免费| 在线观看av一区| 国产福利在线导航| 看片的网站亚洲| 国产a级片免费看| 国产高清视频一区二区| 九九九热精品免费视频观看网站| 国产人妻精品一区二区三| 亚洲激情图片小说视频| 一级少妇精品久久久久久久| 亚洲国产裸拍裸体视频在线观看乱了中文| 国产精品久久久久久久久久直播 | 亚洲成人1234| 99精品视频99| 国产欧美综合色| 在线观看高清免费视频| 午夜片欧美伦| 春色成人在线视频| 一区二区乱码| 自拍偷拍亚洲区| 成人av手机在线| 精品国产乱码久久久久酒店| 国产sm调教视频| 激情六月婷婷综合| 国产欧美日韩小视频| 亚洲自拍都市欧美小说| 国产精品一二三视频| 18av在线播放| 亚洲美女激情视频| 91成人一区二区三区| 亚洲一区免费观看| 性欧美13一14内谢| 精品亚洲国产成人av制服丝袜| 国产欧美久久久久| 九九亚洲视频| 亚洲a级在线观看| 国产伦久视频在线观看| 最近2019年手机中文字幕| www.五月婷| 欧洲视频一区二区| 精品无码一区二区三区电影桃花| 久久精子c满五个校花| 激情小说欧美色图| 日韩成人免费在线| 免费看黄在线看| 日本久久精品| 精品午夜一区二区三区| 青青在线精品| 青草成人免费视频| 污片视频在线免费观看| 在线观看日韩专区| 日批免费在线观看| 91精品免费观看| 国产日产精品一区二区三区| 亚洲欧美乱综合| 国产123在线| 99久久婷婷国产综合精品电影| 鲁一鲁一鲁一鲁一av| 米奇777在线欧美播放| 欧美一区二区视频在线播放| 久久综合av| 日本一区免费观看| 99热这里有精品| 国产精品成人播放| 蜜桃视频动漫在线播放| 久精品免费视频| 欧美成人hd| 在线电影中文日韩| 青青草视频免费在线观看| 欧美成人综合网站| 99久久婷婷国产一区二区三区| 色菇凉天天综合网| 性无码专区无码| 亚洲一级二级三级在线免费观看| 精品在线观看一区| 欧美激情资源网| 亚洲AV无码国产成人久久| 成人精品视频网站| 亚洲v在线观看| 国产成人精品亚洲午夜麻豆| www.五月天色| 激情综合网天天干| av免费一区二区| 精品一区二区在线观看| 久久国产精品国产精品| 奇米精品一区二区三区在线观看 | 亚洲在线色站| 残酷重口调教一区二区| 亚洲精品成人久久久998| 国产精品自拍区| 日本a级片久久久| 国产免费av一区二区三区| 欧美日韩在线一二三| 最新国产一区| 色999日韩自偷自拍美女| jvid福利在线一区二区| 四虎一区二区| 三区四区不卡| 国产女主播av| 一区福利视频| 丰满爆乳一区二区三区| 亚洲一区区二区| 激情五月开心婷婷| 日本在线不卡视频一二三区| 日韩欧美黄色大片| 美女视频黄 久久| 天天操精品视频| 国产99久久久国产精品免费看| 成人一区二区三区仙踪林| 粉嫩一区二区三区性色av| 精品一区二区视频在线观看| 26uuu精品一区二区| 成人激情五月天| 国产精品久久久一本精品| 91视频综合网| 亚洲电影在线播放| 在线观看免费av片| 在线看不卡av| av中文字幕免费在线观看| 精品国偷自产国产一区| 日漫免费在线观看网站| 在线成人免费网站| 在线观看中文| 97超碰国产精品女人人人爽 | 欧美亚洲高清一区二区三区不卡| 在线免费av片| 欧美精品一区二区三区四区| 邻居大乳一区二区三区| 久久精品一本久久99精品| 国产精品一品| 国产精品色婷婷视频| 136国产福利精品导航网址应用| 精品视频高清无人区区二区三区| 欧美日韩精品一区二区视频| 视色,视色影院,视色影库,视色网 日韩精品福利片午夜免费观看 | 欧美美女黄色网| 久久久久国产精品午夜一区| 成人不卡免费视频| av中文字幕不卡| 欧美a级片免费看| 成 人 免费 黄 色| 亚洲伊人伊色伊影伊综合网| 在线天堂中文字幕| 欧美精品777| 天堂91在线| 久久香蕉频线观| 亚洲美女炮图| 92裸体在线视频网站| 人人精品亚洲| 欧美美女黄色网| 日韩二区三区四区| 999精品免费视频| 亚洲品质自拍视频| 免费看污视频的网站| 欧美成人vps| 国产在线一区二区视频| 日产精品99久久久久久| 亚洲福利合集| 亚洲一区二区三区精品视频| 一区二区三区国产盗摄| 色综合五月婷婷| 国产精品萝li| 成人h动漫精品一区二区下载| 精品国产乱码久久久久久久久| 日本不卡视频| 国产精品wwwwww| 亚瑟一区二区三区四区| 亚洲国产精品无码av| 国产精品77777| √天堂中文官网8在线| 欧美午夜寂寞影院| 免费a在线观看| 57pao成人永久免费视频| av日韩精品| 男人c女人视频| 国产精品一区二区不卡| 美女网站视频色| 欧美三电影在线| 国产一区二区三区福利| 国产91在线播放精品91| 爽爽窝窝午夜精品一区二区| 欧美精品自拍视频| 成人国产一区二区三区精品| 欧美性猛交xxxxx少妇| 69精品人人人人| 欧美日韩在线看片| 国产欧美欧洲在线观看| 不卡中文字幕| 在线观看国产一级片| 国产精品伦一区二区三级视频| 在线观看日韩一区二区| 日韩亚洲精品电影| 伊人久久大香线蕉综合影院首页| 中日韩在线视频| 国产在线精品视频| 69av视频在线| 精品欧美一区二区在线观看| 欧美性爽视频| 精品免费二区三区三区高中清不卡| 亚洲人成在线影院| 国产乱了高清露脸对白| 色哟哟一区二区| 大片免费播放在线视频| 91精品国产综合久久香蕉最新版| 亚洲91精品| 妖精视频一区二区| 欧美日韩免费看| 高清av在线| 成人国产精品免费视频| 欧美激情成人在线| 丰满岳乱妇一区二区| 色系网站成人免费| 日韩在线资源| 91久久极品少妇xxxxⅹ软件 | 无码人妻丰满熟妇区五十路| 国产亚洲美女精品久久久| 狠狠久久伊人中文字幕| 日本精品免费视频| caoporen国产精品视频| 免费看污视频的网站| www.日韩.com| 久9re热视频这里只有精品| 欧美 日韩精品| 国产精品白丝在线| 风流少妇一区二区三区91| 欧美亚洲第一区| 91精品啪在线观看国产81旧版| 无码成人精品区在线观看| 91激情在线视频| 伊人福利在线| 日韩精品久久久| 国产精品2024| 无码人妻精品一区二区三区9厂 | 国产精品综合av一区二区国产馆| 国产亚洲自拍av| 在线国产精品视频| 伊人久久影院| 别急慢慢来1978如如2| 亚洲精品国产高清久久伦理二区| 三级av在线| 99蜜桃在线观看免费视频网站| 久久成人亚洲| 欧美三根一起进三p| 亚洲三级 欧美三级| 亚洲午夜精品| 少妇网站在线观看| 精品国产31久久久久久| 日本高清中文字幕在线| 国产综合色一区二区三区| 老司机午夜精品|