一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - mybatis-plus團隊新作mybatis-mate實現數據權限

mybatis-plus團隊新作mybatis-mate實現數據權限

2021-12-14 13:14如夢技術 Java教程

本文主要介紹了mybatis-plus 團隊新作 mybatis-mate 輕松搞定數據權限,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、主要功能

  • 字典綁定
  • 字段加密
  • 數據脫敏
  • 表結構動態維護
  • 數據審計記錄
  • 數據范圍(數據權限)
  • 數據庫分庫分表、動態據源、讀寫分離、數據庫健康檢查自動切換。

二、使用

2.1 依賴導入

Spring Boot 引入自動依賴注解包

?
1
2
3
4
5
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-mate-starter</artifactId>
  <version>1.0.8</version>
</dependency>

注解(實體分包使用)

?
1
2
3
4
5
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-mate-annotation</artifactId>
  <version>1.0.8</version>
</dependency>

2.2 字典綁定

例如 user_sex 類型 sex 字典結果映射到 sexText 屬性

?
1
2
3
@FieldDict(type = "user_sex", target = "sexText")
private Integer sex;
private String sexText;

實現 IDataDict 接口提供字典數據源,注入到 Spring 容器即可。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Component
public class DataDict implements IDataDict {
 
    /**
     * 從數據庫或緩存中獲取
     */
    private Map<String, String> SEX_MAP = new ConcurrentHashMap<String, String>() {{
        put("0", "女");
        put("1", "男");
    }};
 
    @Override
    public String getNameByCode(FieldDict fieldDict, String code) {
        System.err.println("字段類型:" + fieldDict.type() + ",編碼:" + code);
        return SEX_MAP.get(code);
    }
}

2.3 字段加密

屬性 @FieldEncrypt 注解即可加密存儲,會自動解密查詢結果,支持全局配置加密密鑰算法,及注解密鑰算法,可以實現 IEncryptor 注入自定義算法。

?
1
2
@FieldEncrypt(algorithm = Algorithm.PBEWithMD5AndDES)
private String password;

2.4 數據脫敏

屬性 @FieldSensitive 注解即可自動按照預設策略對源數據進行脫敏處理,默認 SensitiveType 內置 9 種常用脫敏策略。例如:中文名、銀行卡賬號、手機號碼、固話號碼、郵寄地址、電子郵箱、身份證號碼、密碼、車牌號 脫敏策略,也可以自定義策略如下:

?
1
2
3
4
5
@FieldSensitive(type = "testStrategy")
private String username;
 
@FieldSensitive(type = SensitiveType.mobile)
private String mobile;

自定義脫敏策略 testStrategy 添加到默認策略中注入 Spring 容器即可。

?
1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
public class SensitiveStrategyConfig {
 
    /**
     * 注入脫敏策略
     */
    @Bean
    public ISensitiveStrategy sensitiveStrategy() {
        // 自定義 testStrategy 類型脫敏處理
        return new SensitiveStrategy().addStrategy("testStrategy", t -> t + "***test***");
    }
}

2.5 DDL 數據結構自動維護

解決升級表結構初始化,版本發布更新 SQL 維護問題,目前支持 MySql、PostgreSQL。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Component
public class PostgresDdl implements IDdl {
 
    /**
     * 執行 SQL 腳本方式
     */
    @Override
    public List<String> getSqlFiles() {
        return Arrays.asList(
                // 內置包方式
                "db/tag-schema.sql",
                // 文件絕對路徑方式
                "D:\\db\\tag-data.sql"
        );
    }
}

不僅僅可以固定執行,也可以動態執行!!

?
1
2
3
ddlScript.run(new StringReader("DELETE FROM user;\n" +
                "INSERT INTO user (id, username, password, sex, email) VALUES\n" +
                "(20, 'Duo', '123456', 0, '[email protected]');"));

這樣就完了嗎??當然沒有,它還支持多數據源執行!!!

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Component
public class MysqlDdl implements IDdl {
 
    @Override
    public void sharding(Consumer<IDdl> consumer) {
        // 多數據源指定,主庫初始化從庫自動同步
        String group = "mysql";
        ShardingGroupProperty sgp = ShardingKey.getDbGroupProperty(group);
        if (null != sgp) {
            // 主庫
            sgp.getMasterKeys().forEach(key -> {
                ShardingKey.change(group + key);
                consumer.accept(this);
            });
            // 從庫
            sgp.getSlaveKeys().forEach(key -> {
                ShardingKey.change(group + key);
                consumer.accept(this);
            });
        }
    }
 
    /**
     * 執行 SQL 腳本方式
     */
    @Override
    public List<String> getSqlFiles() {
        return Arrays.asList("db/user-mysql.sql");
    }
}

2.6 動態多數據源主從自由切換

@Sharding 注解支持一句話使數據源不限制隨意使用切換,你可以在 mapper 層添加注解,按需求指哪打哪!!

?
1
2
3
4
5
6
7
@Mapper
@Sharding("mysql")
public interface UserMapper extends BaseMapper<User> {
 
    @Sharding("postgres")
    Long selectByUsername(String username);
}

你也可以自定義策略統一調兵遣將

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Component
public class MyShardingStrategy extends RandomShardingStrategy {
 
    /**
     * 決定切換數據源 key {@link ShardingDatasource}
     *
     * @param group          動態數據庫組
     * @param invocation     {@link Invocation}
     * @param sqlCommandType {@link SqlCommandType}
     */
    @Override
    public void determineDatasourceKey(String group, Invocation invocation, SqlCommandType sqlCommandType) {
        // 數據源組 group 自定義選擇即可, keys 為數據源組內主從多節點,可隨機選擇或者自己控制
        this.changeDatabaseKey(group, sqlCommandType, keys -> chooseKey(keys, invocation));
    }
}

可以開啟主從策略,當然也是可以開啟健康檢查!!!

2.7 數據權限

mapper 層添加注解:

?
1
2
3
4
5
6
7
8
9
// 測試 test 類型數據權限范圍,混合分頁模式
@DataScope(type = "test", value = {
        // 關聯表 user 別名 u 指定部門字段權限
        @DataColumn(alias = "u", name = "department_id"),
        // 關聯表 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);

模擬業務處理邏輯:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
@Bean
public IDataScopeProvider dataScopeProvider() {
    return new AbstractDataScopeProvider() {
        @Override
        protected void setWhere(PlainSelect plainSelect, Object[] args, DataScopeProperty dataScopeProperty) {
            // args 中包含 mapper 方法的請求參數,需要使用可以自行獲取
            /*
                // 測試數據權限,最終執行 SQL 語句
                SELECT u.* FROM user u WHERE (u.department_id IN ('1', '2', '3', '5'))
                AND u.mobile LIKE '%1533%'
             */
            if ("test".equals(dataScopeProperty.getType())) {
                // 業務 test 類型
                List<DataColumnProperty> dataColumns = dataScopeProperty.getColumns();
                for (DataColumnProperty dataColumn : dataColumns) {
                    if ("department_id".equals(dataColumn.getName())) {
                        // 追加部門字段 IN 條件,也可以是 SQL 語句
                        Set<String> deptIds = new HashSet<>();
                        deptIds.add("1");
                        deptIds.add("2");
                        deptIds.add("3");
                        deptIds.add("5");
                        ItemsList itemsList = new ExpressionList(deptIds.stream().map(StringValue::new).collect(Collectors.toList()));
                        InExpression inExpression = new InExpression(new Column(dataColumn.getAliasDotName()), itemsList);
                        if (null == plainSelect.getWhere()) {
                            // 不存在 where 條件
                            plainSelect.setWhere(new Parenthesis(inExpression));
                        } else {
                            // 存在 where 條件 and 處理
                            plainSelect.setWhere(new AndExpression(plainSelect.getWhere(), inExpression));
                        }
                    } else if ("mobile".equals(dataColumn.getName())) {
                        // 支持一個自定義條件
                        LikeExpression likeExpression = new LikeExpression();
                        likeExpression.setLeftExpression(new Column(dataColumn.getAliasDotName()));
                        likeExpression.setRightExpression(new StringValue("%1533%"));
                        plainSelect.setWhere(new AndExpression(plainSelect.getWhere(), likeExpression));
                    }
                }
            }
        }
    };
}

最終執行 SQL 輸出:

?
1
2
3
SELECT u.* FROM user u
  WHERE (u.department_id IN ('1', '2', '3', '5'))
  AND u.mobile LIKE '%1533%' LIMIT 1, 10

三、最后

大家好,我是 如夢技術春哥(mica 微服務組件開源作者)筆者使用 mybatis-plus 已有 4 年多(資深老粉),mybatis-plus 幫助我們大大提升了開發效率,統一了企業內代碼開發風格,降低維護成本。

如果大家在企業內有 mybatis-mate 使用場景,不妨支持一下。更多 mybatis-mate 使用示例詳見:https://gitee.com/baomidou/mybatis-mate-examples

到此這篇關于mybatis-plus團隊新作mybatis-mate實現數據權限的文章就介紹到這了,更多相關mybatis-mate 數據權限內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/7002876425187360781

延伸 · 閱讀

精彩推薦
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
主站蜘蛛池模板: 日韩性生活片 | 国产自在自拍 | 91久久国产视频 | 免费看男女做好爽好硬视频 | 国产区香蕉精品系列在线观看不卡 | 国产精品视频自拍 | 日本美女视频韩国视频网站免费 | 99热这里只有精品国产在热久久 | 性色AV乱码一区二区三区视频 | 和直男装修工在工地啪 | 国产自产在线 | 国产国语videosex另类 | 99视频在线观看视频 | 爆操| 亚洲天堂网在线观看视频 | 高清欧美不卡一区二区三区 | 粗了大了 整进去好爽视频 刺激一区仑乱 | 免费二级毛片免费完整视频 | 99爱在线观看精品视频 | 青柠网在线观看视频 | 国产精品免费拍拍拍 | 岛国虐乳紧缚媚药调教 | 色图图片 | 免费在线观看网址入口 | 九九成人免费视频 | 亚裔aⅴ艳星katsuni | 金发美女与黑人做爰 | 青青草国产免费国产是公开 | 亚洲国产精品网 | 精品国产品香蕉在线观看75 | 日韩精品免费一区二区三区 | 调教肉文 | 日本动漫黄网站在线观看 | 欧美亚洲国产精品久久久 | 亚洲高清视频在线观看 | 51国产| 亚洲欧美一 | 非洲黑女人性xxxx | 亚洲黄色高清 | 99久久精品无码一区二区毛片 | 日韩成a人片在线观看日本 日韩不卡一区二区 |