mybatis、mybatis-plus插件開發,實現數據脫敏功能

首先說一下mybatis中四大組件的作用,下面開發的插件攔截器會使用
四大組件Executor、StatementHandler、ParameterHandler、ResultSetHandler


Executor:

Executor 是 MyBatis 中的執行器,負責 SQL 語句的執行工作。它通過調度 StatementHandler、ParameterHandler 和 ResultSetHandler 來完成 SQL 的增刪改查操作。Executor 管理事務和緩存,可以是 SimpleExecutor、ReuseExecutor、BatchExecutor 或在開啟二級緩存時的 CachingExecutor。

ParameterHandler:

ParameterHandler 用于處理 SQL 語句的參數設置。它將 Mapper 接口方法的參數封裝,并負責將這些參數值傳遞給 PreparedStatement,以便進行預編譯和執行。ParameterHandler 通過 TypeHandler 接口完成 Java 類型到 JDBC 類型的轉換。

ResultSetHandler:

ResultSetHandler 負責處理 SQL 執行后的返回結果集(ResultSet)。它將結果集轉換并映射到 Java 對象,完成從數據庫字段到 Java 實體屬性的映射工作。ResultSetHandler 能夠處理多種結果集的復雜映射關系。

StatementHandler:

StatementHandler 是 MyBatis 中的語句處理器,它是四大對象的核心,起到承上啟下的作用。StatementHandler 負責使用 JDBC 的 Statement(包括 PreparedStatement 和 CallableStatement)執行實際的數據庫操作。它通過調用 ParameterHandler 來設置 SQL 參數,并通過調用 ResultSetHandler 來處理查詢結果。



實現思路:


1 首先我們需要對數據的結果集進行攔截,也就是說需要攔截這個接口的方法

2 得到數據返回的結果集后,對結果集轉換成 List 進行遍歷脫敏

3 脫敏的時候我們還需要判斷一下哪些字段需要進行脫敏,這里我們定義注解來標識需要脫敏的字段(在這個注解里面可以定義一些脫敏策略,比如對手機號的脫敏規則、身份證的脫敏規則等等)

4 遍歷的時候通過反射,獲取所有屬性

5 我這里的脫敏有三個條件

? ? ? ? a、必須帶有 脫敏標識注解
? ? ? ? b、必須是 String 類型
? ? ? ? c、不得為空,這里直接使用工具類來判斷 StringUtils.isEmpty()


6 脫敏條件達成后,就獲取該注解上的 脫敏策略,根據脫敏策略 對屬性進行脫敏

7 將脫敏后的結果重新設置到屬性上


具體實現步驟


1?定義注解和不同的脫敏策略

import java.util.function.Function;//這里的Function是jdk8新特性,自己了解一哈子
//提示:傳入一個函數執行
public interface Desensitizer extends Function<String,String> {}
//這里定義脫敏策略
public enum TuoMinStrategy {/*手機號*/PHONE(s->s.replaceAll("^(\\\\d{3})\\\\d{4}(\\\\d{4})$","$1****$2")),/*用戶名 匹配中文全部替換*/USERNAME(s->s.replaceAll("[\\u4e00-\\u9fa5]","*"));private final Desensitizer desensitizer;TuoMinStrategy(Desensitizer d) {desensitizer = d;}public Desensitizer getDesensitizer() {return desensitizer;}
}
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 TuoMin {/*** 脫敏策略* @return*/TuoMinStrategy strategy();}

2?脫敏插件核心類
注意:注解中的屬性,method和args不是硬背的,有技巧,如這個,
ResultSetHandler類,點進去,要攔截哪個方法,方法名直接復制,方法里的參數,直接copy?引用

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 org.springframework.util.StringUtils;
import java.lang.reflect.Field;
import java.sql.Statement;
import java.util.List;
import java.util.stream.Stream;@Component //需要放入到 ioc 容器中攔截器才會生效哦
//指定要攔截的目標方法的注解
//<h1>1、這個就是指定需要攔截的方法,這里我們指定攔截返回結果集的方法</h1>
@Intercepts(@Signature(type = ResultSetHandler.class,method = "handleResultSets",args= Statement.class))
public class TongMinPlugin implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {//<h1>2、得到數據返回的結果集,對結果集轉換成 List<Object> 進行遍歷脫敏</h1>List<Object> records = (List<Object>) invocation.proceed();System.out.println("records = " + records);// 遍歷數據 調用 tuoMin 這個方法records.forEach(this::tuoMin);return records;}private void tuoMin(Object source) {Class<?> sourceClass = source.getClass();System.out.println("sourceClass = " + sourceClass);MetaObject metaObject = SystemMetaObject.forObject(source);//這個東東是 mybatis 提供的,通過這個玩意我們可以得到屬性的值System.out.println("metaObject = " + metaObject);// 使用 stream 流/*** 1、得到所有屬性* 2、篩選出帶有 TuoMin.class 注解的屬性* 3、調用doTuoMin方法將這些屬性脫敏*/Stream.of(sourceClass.getDeclaredFields()).filter(field -> field.isAnnotationPresent(TuoMin.class)).forEach(field->doTuoMin(metaObject,field));}private void doTuoMin(MetaObject metaObject, Field field) {System.out.println("metaObject = " + metaObject);System.out.println("field = " + field);String name = field.getName();System.out.println("name = " + name);Object value = metaObject.getValue(name);//根據屬性名得到屬性值System.out.println("value = " + value);// 脫敏條件:必須為String類型,值不等于空if (String.class == metaObject.getGetterType(name) && StringUtils.hasText(value.toString())) {//獲取脫敏策略TuoMin tuoMin = field.getAnnotation(TuoMin.class);System.out.println("tuoMin = " + tuoMin);TuoMinStrategy type = tuoMin.strategy();System.out.println("type = " + type);// 調用策略正則表達式脫敏,得到結果Object apply = type.getDesensitizer().apply((String) value);System.out.println("apply = " + apply);// 將脫敏后的結果重新設置到屬性上metaObject.setValue(name,apply);}}}

3?在需要脫敏的pojo的字段上加上注解,如

@TableField(value = "title")
@TuoMin(strategy = TuoMinStrategy.USERNAME) //加上注解并指定脫敏策略
private String title;

4?測試,舉例

脫敏前:
張三達美脫敏后:
張 * * 美


部分文字和代碼引用博文
【MyBatis】脫敏插件_前端脫敏插件是什么-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40235.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40235.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40235.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python基礎語法 004-3流程控制- while

1 while while 主要用的場景沒有 for 循環多。 while循環&#xff1a;主要運行場景 我不知道什么時候結束。。。不知道運行多少次 1.1 基本用法 # while 4 > 3: #一直執行 # print("hell0")while 4 < 3: #不會打印&#xff0c;什么都沒有print("…

IT之旅啟航:高考后IT專業預習全攻略

?作者主頁&#xff1a; Mr.Zwq??個人簡介&#xff1a;一個正在努力學技術的Python領域創作者&#xff0c;擅長爬蟲&#xff0c;逆向&#xff0c;全棧方向&#xff0c;專注基礎和實戰分享&#xff0c;歡迎咨詢&#xff01; 您的點贊、關注、收藏、評論&#xff0c;是對我最大…

opencv 處理圖像去噪的幾種方法

OpenCV 提供了多種圖像去噪的方法&#xff0c;以下是一些常見的去噪技術以及相應的 Python 代碼示例&#xff1a; 均值濾波&#xff1a;使用像素鄰域的灰度均值代替該像素的值。 import cv2 import numpy as np import matplotlib.pyplot as pltimg cv2.imread("4.jpg&qu…

Java知識點大綱

文章目錄 第一階段&#xff1a;JavaSE1、面向對象編程(基礎)1)面向過程和面向對象區別2)類和對象的概述3)類的屬性和方法4)創建對象內存分析5)構造方法(Construtor)及其重載6)對象類型的參數傳遞7)this關鍵字詳解8)static關鍵字詳解9)局部代碼塊、構造代碼塊和靜態代碼塊10)pac…

2-24 基于圖像處理的細胞計數方法

基于圖像處理的細胞計數方法。經過初次二值化、中值濾波后二值化、優化后二值化圖像、填充背景色的二進制圖像、開運算后的圖像一系列運算后&#xff0c;進行標簽設置&#xff0c;最終得到細胞總數。程序已調通&#xff0c;可直接運行。 2-24 細胞計數方法 中值濾波后二值化 - …

【C++】 解決 C++ 語言報錯:Invalid Cast

文章目錄 引言 無效類型轉換&#xff08;Invalid Cast&#xff09;是 C 編程中常見且嚴重的錯誤之一。當程序試圖進行不合法或不安全的類型轉換時&#xff0c;就會發生無效類型轉換錯誤。這種錯誤不僅會導致程序崩潰&#xff0c;還可能引發不可預測的行為。本文將深入探討無效…

圖像增強方法匯總OpenCV+python實現【第一部分:常用圖像增強方法】

圖像增強方法匯總OpenCVpython實現【第一部分】 前言常用的圖像增強方法1. 旋轉&#xff08;Rotation&#xff09;&#xff1a;2. 平移&#xff08;Translation&#xff09;&#xff1a;3. 縮放&#xff08;Scaling&#xff09;&#xff1a;4. 剪切變換&#xff08;Shear Trans…

UserWarning: IPython History requires SQLite, your history will not be saved

UserWarning: IPython History requires SQLite, your history will not be saved 很久未打開pycharm&#xff0c;控制臺出現爆紅 解決方法&#xff1a; 重啟pycharm&#xff0c;就好啦&#xff01;&#xff01;&#xff01;我猜測可能是上次pycharm沒有關閉就電腦關機&…

56、Flink DataStream 的管理執行配置詳解

1&#xff09;概述 1.執行配置 StreamExecutionEnvironment 包含了 ExecutionConfig&#xff0c;它允許在運行時設置作業特定的配置值。 StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); ExecutionConfig executionConfig env.get…

《企業實戰分享 · 內存溢出分析》

&#x1f4e2; 大家好&#xff0c;我是 【戰神劉玉棟】&#xff0c;有10多年的研發經驗&#xff0c;致力于前后端技術棧的知識沉淀和傳播。 &#x1f497; &#x1f33b; 近期剛轉戰 CSDN&#xff0c;會嚴格把控文章質量&#xff0c;絕不濫竽充數&#xff0c;如需交流&#xff…

用PyQt5打造炫酷界面:深入解析pyqt5-custom-widgets

在PyQt5中&#xff0c;使用自定義小部件可以為應用程序增添更多實用性和時尚感。pyqt5-custom-widgets是一個開源項目&#xff0c;提供了一系列有用且時尚的自定義小部件&#xff0c;如開關按鈕、動畫按鈕等。本文將詳細介紹pyqt5-custom-widgets的安裝和使用方法。 安裝 可以…

權限維持Linux---監控功能Strace后門命令自定義Alias后門

免責聲明:本文僅做技術交流與學習... 目錄 監控功能Strace后門 1、記錄 sshd 明文 監控 篩選查看 2、記錄sshd私鑰 命令自定義Alias后門 1、簡單粗魯實現反彈&#xff1a; 靶機替換命令 攻擊機監聽上線 2.升級(讓命令正常) 將反彈命令進行base64編碼 替換alias命令 …

【Linux】--help,man page , info page

我們知道Linux有很多的命令&#xff0c;那LInux要不要背命令&#xff1f; 答案是背最常用的那些就行了 那有的時候我們想查詢一些命令的詳細用法該怎么辦呢&#xff1f; 這里我給出3種方法 1.--help --help的使用方法很簡單啊 要查詢的命令 --help 我們看個例子 這里我只…

java版企業工程管理系統源碼:全方位的項目管理解決方案

工程管理系統是一款專注于建設工程項目全生命周期管理的軟件。它覆蓋了項目從策劃、設計、施工到竣工的每一個階段&#xff0c;提供全方位的管理功能。系統采用模塊化設計&#xff0c;包括系統管理、系統設置、項目管理、合同管理、預警管理、竣工管理、質量管理、統計報表和工…

李白的酒量之謎

在中國古典文學的璀璨星空中&#xff0c;李白的名字猶如一顆耀眼的星辰&#xff0c;其卓越的文學成就與獨特的人生經歷引得無數后人仰望。特別是“李白斗酒詩百篇”&#xff0c;這句話不僅高度概括了李白的詩歌才華和其對酒精的熱愛&#xff0c;也使得后人對李白的酒量產生了濃…

6月30日功能測試Day10

3.4.4拼團購測試點 功能位置&#xff1a;營銷-----拼團購 后臺優惠促銷列表管理可以添加拼團&#xff0c;查看拼團活動&#xff0c;啟動活動&#xff0c;編輯活動&#xff0c;刪除活動。 可以查看拼團活動中已下單的訂單以狀態 需求分析 功能和添加拼團 商品拼團活動頁 3…

Pytorch中方法對象和屬性,例如size()和shape

文章目錄 方法對象和屬性的基本概念方法對象屬性示例說明總結 常見的方法對象和屬性常見的方法對象常見的屬性總結示例 方法對象和屬性的基本概念 方法對象&#xff08;method object&#xff09;和屬性&#xff08;attribute&#xff09;是面向對象編程中的兩個重要概念。讓我…

python使用pywebview集成vue3和element-plus開發桌面系統框架

隨著web技術越來越成熟&#xff0c;就連QQ的windows客戶端都用web技術來開發&#xff0c;所以在未來&#xff0c;web技術來開發windows桌面軟件也會越來越多&#xff0c;所以在此發展驅動之下&#xff0c;將最近流程的python與web技術相結合&#xff0c;使用vue3和element-plus…

圖像增強 目標檢測 仿射變換 圖像處理 扭曲圖像

1.背景 在目標檢測中&#xff0c;需要進行圖像增強。這里的代碼模擬了旋轉、扭曲圖像的功能&#xff0c;并且在扭曲的時候&#xff0c;能夠同時把標注的結果也進行扭曲。 這里忽略了讀取xml的過程&#xff0c;假設圖像IMG存在對應的標注框&#xff0c;且坐標為左上、右下兩個…

[C++初階]vector的初步理解

一、標準庫中的vector類 1.vector的介紹 1. vector是表示可變大小數組的序列容器 &#xff0c; 和數組一樣&#xff0c;vector可采用的連續存儲空間來存儲元素。也就是意味著可以采用下標對vector的元素進行訪問&#xff0c;和數組一樣高效。但是又不像數組&#xff0c;它的大…