mybatis-mate
? 為 mp 企業(yè)級模塊,旨在更敏捷優(yōu)雅處理數(shù)據(jù)。
mybatis-mate 示例 :傳送門
// 1,異步回調(diào),注意 @EnableAsync 開啟異步
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()));
}
}));
// 2,手動調(diào)用對比
DataAuditor.compare(obj1, obj2);
@DataScope
?屬性 | 類型 | 必須指定 | 默認(rèn)值 | 描述 |
?type ? |
String | 否 | "" | 范圍類型,用于區(qū)分對于業(yè)務(wù)分類,默認(rèn)空 |
?value ? |
DataColumn[] | 否 | {} | 數(shù)據(jù)權(quán)限字段,支持多字段組合 |
?ignore ? |
boolean | 否 | false | 忽略權(quán)限處理邏輯 true 是 false 否 |
@DataColumn
?屬性 | 類型 | 必須指定 | 默認(rèn)值 | 描述 |
alias | String | 否 | "" | 關(guān)聯(lián)表別名 |
name | String | 是 | 字段名 |
// 測試 test 類型數(shù)據(jù)權(quán)限范圍,混合分頁模式
@DataScope(type = "test", value = {
// 關(guān)聯(lián)表 user 別名 u 指定部門字段權(quán)限
@DataColumn(alias = "u", name = "department_id"),
// 關(guān)聯(lián)表 user 別名 u 指定手機號字段(自己判斷處理)
@DataColumn(alias = "u", name = "mobile")
})
@Select("select u.* from user u")
List<User> selectTestList(IPage<User> page, Long id, @Param("name") String username);
// 測試數(shù)據(jù)權(quán)限,最終執(zhí)行 SQL 語句
SELECT u.* FROM user u WHERE (u.department_id IN ('1', '2', '3', '5')) AND u.mobile LIKE '%1533%' LIMIT 1,10
請注意必須注入 ?IDataScopeProvider
實現(xiàn)類處理數(shù)據(jù)權(quán)限,關(guān)于數(shù)據(jù)傳參支持 2 種方式:
mapper
方法通過方法參數(shù)傳遞,在 ?setWhere
方法 ?Object[] args
參數(shù)中獲取 ThreadLocal
傳遞參數(shù),你可以攔截 ?controller
層或者 ?service
層設(shè)置數(shù)據(jù)權(quán)限處理參數(shù),更多可以參考
mybatis-mate-ddl-mysql,mybatis-mate-ddl-postgres
Schema
初始化,升級 SQL 自動維護,區(qū)別于 ?flyway
支持分表庫、可控制代碼執(zhí)行 SQL 腳本ddl_history
表,每次執(zhí)行SQL腳本會自動維護版本信息。@Component
public class MysqlDdl implements IDdl {
/**
* 執(zhí)行 SQL 腳本方式
*/
@Override
public List<String> getSqlFiles() {
return Arrays.asList(
"db/tag-schema.sql",
"D:\\db\\tag-data.sql"
);
}
}
// 切換到 mysql 從庫,執(zhí)行 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');"));
@FieldBind
?屬性 | 類型 | 必須指定 | 默認(rèn)值 | 描述 |
?sharding ? |
String | 否 | "" | 分庫分表數(shù)據(jù)源指定 |
?type ? |
String | 是 | 類型(用于區(qū)分不同業(yè)務(wù)) | |
?target ? |
String | 是 | 目標(biāo)顯示屬性(待綁定屬性,注意非數(shù)據(jù)庫字段請排除) |
@FieldBind(type = "user_sex", target = "sexText")
private Integer sex;
// 綁定顯示屬性,非表字典(排除)
@TableField(exist = false)
private String sexText;
IDataBind
接口,注入 spring 容器@Component
public class DataBind implements IDataBind {
...
}
@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) {
{
// 注入虛擬節(jié)點
put(Type.departmentRole, (obj) -> new HashMap(2) {{
User user = (User) obj;
// 枚舉類型轉(zhuǎn)換
put("statusText", StatusEnum.get(user.getStatus()).getDesc());
// 可調(diào)用數(shù)據(jù)庫查詢角色信息
put("roleName", "經(jīng)理");
}});
}
};
}
}
@FieldEncrypt
?屬性 | 類型 | 必須指定 | 默認(rèn)值 | 描述 |
?password ? |
String | 否 | "" | 加密密碼 |
?algorithm ? |
Algorithm | 否 | PBEWithMD5AndDES | PBE MD5 DES 混合算法 |
?encryptor ? |
Class | 否 | IEncryptor | 加密處理器 |
Algorithm
?算法 | 描述 |
?MD5_32 ? |
32 位 md5 算法 |
?MD5_16 ? |
16 位 md5 算法 |
?BASE64 ? |
64 個字符來表示任意二進制數(shù)據(jù)算法 |
?AES ? |
AES 對稱算法 |
?RSA ? |
非對稱加密算法 |
?SM2 ? |
國密 SM2 非對稱加密算法,基于 ECC |
?SM3 ? |
國密 SM3 消息摘要算法,可以用 MD5 作為對比理解 |
?SM4 ? |
國密 SM4 對稱加密算法,無線局域網(wǎng)標(biāo)準(zhǔn)的分組數(shù)據(jù)算法 |
?PBEWithMD5AndDES ? |
混合算法 |
?PBEWithMD5AndTripleDES ? |
混合算法 |
?PBEWithHMACSHA512AndAES_256 ? |
混合算法 |
?PBEWithSHA1AndDESede ? |
混合算法 |
?PBEWithSHA1AndRC2_40 ? |
混合算法 |
?MD5
算法為不可逆算法,存儲數(shù)據(jù)庫及查詢結(jié)果都是密文 ?SM4
算法必須依賴 ?bouncycastle
加密庫 混合算法必須依賴 ?jasypt
加密庫 【注意】查詢返回加密對象必須包含加密注解信息,單純的返回某個 ?String
或者 ?List
某個集合是無法解密的。
FieldEncrypt
實現(xiàn)數(shù)據(jù)加解密,支持多種加密算法@FieldEncrypt
private String email;
mybatis-mate-sensitive-jackson
@FieldSensitive
?FieldSensitive
實現(xiàn)數(shù)據(jù)脫敏,內(nèi)置 手機號、郵箱、銀行卡號 等 9 種常用脫敏規(guī)則@FieldSensitive("testStrategy")
private String username;
@Configuration
public class SensitiveStrategyConfig {
/**
* 注入脫敏策略
*/
@Bean
public ISensitiveStrategy sensitiveStrategy() {
// 自定義 testStrategy 類型脫敏處理
return new SensitiveStrategy().addStrategy("testStrategy", t -> t + "***test***");
}
}
// 跳過脫密處理,用于編輯場景
RequestDataTransfer.skipSensitive();
@Sharding
?屬性 | 類型 | 必須指定 | 默認(rèn)值 | 描述 |
value | String | 是 | "" | 分庫組名,空使用默認(rèn)主數(shù)據(jù)源 |
strategy | Class | 否 | RandomShardingStrategy | 分庫&分表策略 |
mybatis-mate:
sharding:
health: true # 健康檢測
primary: mysql # 默認(rèn)選擇數(shù)據(jù)源
datasource:
mysql: # 數(shù)據(jù)庫組
- key: node1
...
- key: node2
cluster: slave # 從庫讀寫分離時候負(fù)責(zé) sql 查詢操作,主庫 master 默認(rèn)可以不寫
...
postgres:
- key: node1 # 數(shù)據(jù)節(jié)點
...
Sharding
切換數(shù)據(jù)源,組內(nèi)節(jié)點默認(rèn)隨機選擇(查從寫主)@Mapper
@Sharding("mysql")
public interface UserMapper extends BaseMapper<User> {
@Sharding("postgres")
Long selectByUsername(String username);
}
// 切換到 mysql 從庫 node2 節(jié)點
ShardingKey.change("mysqlnode2");
mybatis-mate-sharding-jta-atomikos
更多建議: