文章目錄 前言 一、數據審計(對賬) 二、數據敏感詞過濾 三、數據范圍(數據權限) 四、表結構自動維護 五、字段數據綁定(字典回寫) 六、虛擬屬性綁定 七、字段加密解密 八、字段脫敏 九、多數據源分庫分表(讀寫分離) 十、多數據源動態加載卸載 十一、多數據源事務(JTA Atomikos) 總結
前言
Mybatis-Mate
是為 MyBatis-Plus 提供的企業級模塊,旨在更敏捷優雅處理數據。
使用示例 :傳送門 聯系作者確認后微信公眾號發文介紹 Mybatis-Mate 的軟文,可免費獲得永久個人授權證書。 該模塊屬于 MyBatis-Plus 的擴展庫,非 MyBatis-Plus 的收費版本,任何問題由 青苗 個人負責。
一、數據審計(對賬)
使用示例:👉 mybatis-mate-audit 對比兩對象屬性差異,例如:銀行流水對賬。
applicationEventPublisher. publishEvent ( new DataAuditEvent ( ( t) -> { List < Change > changes = t. apply ( newVersion, oldVersion) ; for ( Change valueChange : changes) { ValueChange change = ( ValueChange ) valueChange; System . err. println ( String . format ( "%s不匹配,期望值 %s 實際值 %s" , change. getPropertyName ( ) , change. getLeft ( ) , change. getRight ( ) ) ) ; }
} ) ) ;
DataAuditor . compare ( obj1, obj2) ;
二、數據敏感詞過濾
使用示例👉 mybatis-mate-sensitive-words 數據敏感詞過濾(AC 算法)配置完處理器,框架自動處理請求的所有字符串敏感詞過濾,支持嵌套關鍵詞讓敏感詞無處遁形。 數據庫自維護敏感詞庫(免費、可控),默認加載緩存詞根支持指定重新加載詞庫。
三、數據范圍(數據權限)
使用示例:mybatis-mate-datascope 注解 @DataScope
屬性 類型 必須指定 默認值 描述 type String 否 “” 范圍類型,用于區分對于業務分類,默認空 value DataColumn[] 否 數據權限字段,支持多字段組合 ignore boolean 否 false 忽略權限處理邏輯 true 是 false 否
屬性 類型 必須指定 默認值 描述 alias String 否 “” 關聯表別名 name String 是 字段名
行級粒度權限控制,例如:上級部門可以查看子部門信息。
@DataScope ( type = "test" , value = { @DataColumn ( alias = "u" , name = "department_id" ) , @DataColumn ( alias = "u" , name = "mobile" )
} )
@Select ( "select u.* from user u" )
List < User > selectTestList ( IPage < User > page, Long id, @Param ( "name" ) String username) ;
SELECT u. * FROM user u WHERE ( u. department_id IN ( '1' , '2' , '3' , '5' ) ) AND u. mobile LIKE '%1533%' LIMIT 1 , 10
關于 請注意必須注入 IDataScopeProvider 實現類處理數據權限,關于數據傳參支持 2 種方式: 1,自定義 mapper 方法通過方法參數傳遞,在 setWhere 方法 Object[] args
參數中獲取 2,利用 ThreadLocal 傳遞參數,你可以攔截 controller 層或者 service 層設置數據權限處理參數,更多可以 👉參考
四、表結構自動維護
使用示例: 👉 mybatis-mate-ddl-mysql 👉 mybatis-mate-ddl-postgres 數據庫 Schema
初始化,升級 SQL 自動維護,區別于 flyway
支持分表庫、可控制代碼執行 SQL 腳本 首次會在數據庫中生成 ddl_history
表,每次執行SQL腳本會自動維護版本信息。
@Component
public class MysqlDdl implements IDdl { @Override public List < String > getSqlFiles ( ) { return Arrays . asList ( "db/tag-schema.sql" , "D:\\db\\tag-data.sql" ) ; }
}
ShardingKey . change ( "mysqlt2" ) ;
ddlScript. run ( new StringReader ( "DELETE FROM user;\n" + "INSERT INTO user (id, username, password, sex, email) VALUES\n" + "(20, 'Duo', '123456', 0, 'Duo@baomidou.com');" ) ) ;
五、字段數據綁定(字典回寫)
使用示例:👉 mybatis-mate-dict 注解 @FieldBind
屬性 類型 必須指定 默認值 描述 sharding String 否 “” 分庫分表數據源指定 type String 是 類型(用于區分不同業務) target String 是 目標顯示屬性(待綁定屬性,注意非數據庫字段請排除)
數據庫 sex 值 0、1 自動映射為 男、女 可以綁定映射為對象,例如:根據訂單 ID 映射 訂單對象或者編號
@FieldBind ( type = "user_sex" , target = "sexText" )
private Integer sex;
@TableField ( exist = false )
private String sexText;
綁定業務處理類需要實現 IDataBind 接口,注入 spring 容器
@Component
public class DataBind implements IDataBind { . . .
}
六、虛擬屬性綁定
使用示例:👉 mybatis-mate-jsonbind 注解 @JsonBind
@JsonBind ( "綁定類型" )
public class User { . . .
}
@Component
public class JsonBindStrategy implements IJsonBindStrategy { @Override public Map < String , Function < Object , Map < String , Object > > > getStrategyFunctionMap ( ) { return new HashMap < String , Function < Object , Map < String , Object > > > ( 16 ) { { put ( Type . departmentRole, ( obj) -> new HashMap ( 2 ) { { User user = ( User ) obj; put ( "statusText" , StatusEnum . get ( user. getStatus ( ) ) . getDesc ( ) ) ; put ( "roleName" , "經理" ) ; } } ) ; } } ; }
}
七、字段加密解密
屬性 類型 必須指定 默認值 描述 password String 否 “” 加密密碼 algorithm Algorithm 否 PBEWithMD5AndDES PBE MD5 DES 混合算法 encryptor Class 否 IEncryptor 加密處理器
算法 描述 MD5_32 32 位 md5 算法 MD5_16 16 位 md5 算法 BASE64 64 個字符來表示任意二進制數據算法 AES AES 對稱算法 【需要模糊查詢的請務必使用該算法】 RSA 非對稱加密算法 SM2 國密 SM2 非對稱加密算法,基于 ECC SM3 國密 SM3 消息摘要算法,可以用 MD5 作為對比理解 SM4 國密 SM4 對稱加密算法,無線局域網標準的分組數據算法 PBEWithMD5AndDES 混合算法 PBEWithMD5AndTripleDES 混合算法 PBEWithHMACSHA512AndAES_256 混合算法 PBEWithSHA1AndDESede 混合算法 PBEWithSHA1AndRC2_40 混合算法
注意
MD5 算法為不可逆算法,存儲數據庫及查詢結果都是密文。 SM4 算法必須依賴 bouncycastle 加密庫。 混合算法必須依賴 jasypt 加密庫。 【注意】查詢返回加密對象必須包含加密注解
信息,單純的返回某個 String 或者 List 某個集合是無法解密的。
注解 FieldEncrypt 實現數據加解密,支持多種加密算法
@FieldEncrypt
private String email;
八、字段脫敏
使用示例:👉 mybatis-mate-sensitive-jackson 注解 @FieldSensitive 注解 FieldSensitive 實現數據脫敏,內置 手機號
、郵箱
、銀行卡號
等 9 種常用脫敏規則
@FieldSensitive ( "testStrategy" )
private String username; @Configuration
public class SensitiveStrategyConfig { @Bean public ISensitiveStrategy sensitiveStrategy ( ) { return new SensitiveStrategy ( ) . addStrategy ( "testStrategy" , t -> t + "***test***" ) ; }
}
RequestDataTransfer . skipSensitive ( ) ;
九、多數據源分庫分表(讀寫分離)
使用示例:👉 mybatis-mate-sharding 注解 @Sharding
屬性 類型 必須指定 默認值 描述 value String 是 “” 分庫組名,空使用默認主數據源 strategy Class 否 RandomShardingStrategy 分庫&分表策略
mybatis-mate : sharding : health : true primary : mysql datasource : mysql : - key : node1... - key : node2cluster : slave ... postgres : - key : node1 ...
注解 Sharding 切換數據源,組內節點默認隨機選擇(查從寫主)
@Mapper
@Sharding ( "mysql" )
public interface UserMapper extends BaseMapper < User > { @Sharding ( "postgres" ) Long selectByUsername ( String username) ; }
ShardingKey . change ( "mysqlnode2" ) ;
十、多數據源動態加載卸載
使用示例:👉 mybatis-mate-sharding-dynamic
十一、多數據源事務(JTA Atomikos)
使用示例:👉 mybatis-mate-sharding-jta-atomikos
總結
回到頂部