欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mybatis-plus團(tuán)隊(duì)新作mybatis-mate實(shí)現(xiàn)數(shù)據(jù)權(quán)限

 更新時(shí)間:2021年09月02日 08:27:35   作者:如夢(mèng)技術(shù)  
本文主要介紹了mybatis-plus 團(tuán)隊(duì)新作 mybatis-mate 輕松搞定數(shù)據(jù)權(quán)限,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、主要功能

  • 字典綁定
  • 字段加密
  • 數(shù)據(jù)脫敏
  • 表結(jié)構(gòu)動(dòng)態(tài)維護(hù)
  • 數(shù)據(jù)審計(jì)記錄
  • 數(shù)據(jù)范圍(數(shù)據(jù)權(quán)限)
  • 數(shù)據(jù)庫(kù)分庫(kù)分表、動(dòng)態(tài)據(jù)源、讀寫(xiě)分離、數(shù)據(jù)庫(kù)健康檢查自動(dòng)切換。

二、使用

2.1 依賴導(dǎo)入

Spring Boot 引入自動(dòng)依賴注解包

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-mate-starter</artifactId>
  <version>1.0.8</version>
</dependency>

注解(實(shí)體分包使用)

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-mate-annotation</artifactId>
  <version>1.0.8</version>
</dependency>

2.2 字典綁定

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

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

實(shí)現(xiàn) IDataDict 接口提供字典數(shù)據(jù)源,注入到 Spring 容器即可。

@Component
public class DataDict implements IDataDict {

    /**
     * 從數(shù)據(jù)庫(kù)或緩存中獲取
     */
    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 注解即可加密存儲(chǔ),會(huì)自動(dòng)解密查詢結(jié)果,支持全局配置加密密鑰算法,及注解密鑰算法,可以實(shí)現(xiàn) IEncryptor 注入自定義算法。

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

2.4 數(shù)據(jù)脫敏

屬性 @FieldSensitive 注解即可自動(dòng)按照預(yù)設(shè)策略對(duì)源數(shù)據(jù)進(jìn)行脫敏處理,默認(rèn) SensitiveType 內(nèi)置 9 種常用脫敏策略。例如:中文名、銀行卡賬號(hào)、手機(jī)號(hào)碼、固話號(hào)碼、郵寄地址、電子郵箱、身份證號(hào)碼、密碼、車牌號(hào) 脫敏策略,也可以自定義策略如下:

@FieldSensitive(type = "testStrategy")
private String username;

@FieldSensitive(type = SensitiveType.mobile)
private String mobile;

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

@Configuration
public class SensitiveStrategyConfig {

    /**
     * 注入脫敏策略
     */
    @Bean
    public ISensitiveStrategy sensitiveStrategy() {
        // 自定義 testStrategy 類型脫敏處理
        return new SensitiveStrategy().addStrategy("testStrategy", t -> t + "***test***");
    }
}

2.5 DDL 數(shù)據(jù)結(jié)構(gòu)自動(dòng)維護(hù)

解決升級(jí)表結(jié)構(gòu)初始化,版本發(fā)布更新 SQL 維護(hù)問(wèn)題,目前支持 MySql、PostgreSQL。

@Component
public class PostgresDdl implements IDdl {

    /**
     * 執(zhí)行 SQL 腳本方式
     */
    @Override
    public List<String> getSqlFiles() {
        return Arrays.asList(
                // 內(nèi)置包方式
                "db/tag-schema.sql",
                // 文件絕對(duì)路徑方式
                "D:\\db\\tag-data.sql"
        );
    }
}

不僅僅可以固定執(zhí)行,也可以動(dòng)態(tài)執(zhí)行!!

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');"));

這樣就完了嗎??當(dāng)然沒(méi)有,它還支持多數(shù)據(jù)源執(zhí)行?。?!

@Component
public class MysqlDdl implements IDdl {

    @Override
    public void sharding(Consumer<IDdl> consumer) {
        // 多數(shù)據(jù)源指定,主庫(kù)初始化從庫(kù)自動(dòng)同步
        String group = "mysql";
        ShardingGroupProperty sgp = ShardingKey.getDbGroupProperty(group);
        if (null != sgp) {
            // 主庫(kù)
            sgp.getMasterKeys().forEach(key -> {
                ShardingKey.change(group + key);
                consumer.accept(this);
            });
            // 從庫(kù)
            sgp.getSlaveKeys().forEach(key -> {
                ShardingKey.change(group + key);
                consumer.accept(this);
            });
        }
    }

    /**
     * 執(zhí)行 SQL 腳本方式
     */
    @Override
    public List<String> getSqlFiles() {
        return Arrays.asList("db/user-mysql.sql");
    }
}

2.6 動(dòng)態(tài)多數(shù)據(jù)源主從自由切換

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

@Mapper
@Sharding("mysql")
public interface UserMapper extends BaseMapper<User> {

    @Sharding("postgres")
    Long selectByUsername(String username);
}

你也可以自定義策略統(tǒng)一調(diào)兵遣將

@Component
public class MyShardingStrategy extends RandomShardingStrategy {

    /**
     * 決定切換數(shù)據(jù)源 key {@link ShardingDatasource}
     *
     * @param group          動(dòng)態(tài)數(shù)據(jù)庫(kù)組
     * @param invocation     {@link Invocation}
     * @param sqlCommandType {@link SqlCommandType}
     */
    @Override
    public void determineDatasourceKey(String group, Invocation invocation, SqlCommandType sqlCommandType) {
        // 數(shù)據(jù)源組 group 自定義選擇即可, keys 為數(shù)據(jù)源組內(nèi)主從多節(jié)點(diǎn),可隨機(jī)選擇或者自己控制
        this.changeDatabaseKey(group, sqlCommandType, keys -> chooseKey(keys, invocation));
    }
}

可以開(kāi)啟主從策略,當(dāng)然也是可以開(kāi)啟健康檢查?。。?/p>

2.7 數(shù)據(jù)權(quán)限

mapper 層添加注解:

// 測(cè)試 test 類型數(shù)據(jù)權(quán)限范圍,混合分頁(yè)模式
@DataScope(type = "test", value = {
        // 關(guān)聯(lián)表 user 別名 u 指定部門(mén)字段權(quán)限
        @DataColumn(alias = "u", name = "department_id"),
        // 關(guān)聯(lián)表 user 別名 u 指定手機(jī)號(hào)字段(自己判斷處理)
        @DataColumn(alias = "u", name = "mobile")
})
@Select("select u.* from user u")
List<User> selectTestList(IPage<User> page, Long id, @Param("name") String username);

模擬業(yè)務(wù)處理邏輯:

@Bean
public IDataScopeProvider dataScopeProvider() {
    return new AbstractDataScopeProvider() {
        @Override
        protected void setWhere(PlainSelect plainSelect, Object[] args, DataScopeProperty dataScopeProperty) {
            // args 中包含 mapper 方法的請(qǐng)求參數(shù),需要使用可以自行獲取
            /*
                // 測(cè)試數(shù)據(jù)權(quán)限,最終執(zhí)行 SQL 語(yǔ)句
                SELECT u.* FROM user u WHERE (u.department_id IN ('1', '2', '3', '5'))
                AND u.mobile LIKE '%1533%'
             */
            if ("test".equals(dataScopeProperty.getType())) {
                // 業(yè)務(wù) test 類型
                List<DataColumnProperty> dataColumns = dataScopeProperty.getColumns();
                for (DataColumnProperty dataColumn : dataColumns) {
                    if ("department_id".equals(dataColumn.getName())) {
                        // 追加部門(mén)字段 IN 條件,也可以是 SQL 語(yǔ)句
                        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())) {
                        // 支持一個(gè)自定義條件
                        LikeExpression likeExpression = new LikeExpression();
                        likeExpression.setLeftExpression(new Column(dataColumn.getAliasDotName()));
                        likeExpression.setRightExpression(new StringValue("%1533%"));
                        plainSelect.setWhere(new AndExpression(plainSelect.getWhere(), likeExpression));
                    }
                }
            }
        }
    };
}

最終執(zhí)行 SQL 輸出:

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

三、最后

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

如果大家在企業(yè)內(nèi)有 mybatis-mate 使用場(chǎng)景,不妨支持一下。更多 mybatis-mate 使用示例詳見(jiàn):https://gitee.com/baomidou/mybatis-mate-examples

到此這篇關(guān)于mybatis-plus團(tuán)隊(duì)新作mybatis-mate實(shí)現(xiàn)數(shù)據(jù)權(quán)限的文章就介紹到這了,更多相關(guān)mybatis-mate 數(shù)據(jù)權(quán)限內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論