最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MybatisPlus實(shí)現(xiàn)數(shù)據(jù)攔截的使用示例

 更新時(shí)間:2023年10月13日 15:34:18   作者:Younger成  
在MyBatis-Plus中,可以通過自定義攔截器來實(shí)現(xiàn)對(duì)SQL語句的攔截和修改,本文就來介紹一下如何使用,具有一定的參考價(jià)值,感興趣的可以了解一下

基于配置文件實(shí)現(xiàn)(關(guān)鍵key存儲(chǔ)在配置文件,通過讀取配置文件來實(shí)現(xiàn)動(dòng)態(tài)拼接sql)

1、創(chuàng)建注解類

@UserDataPermission(id="app")

注:id用以區(qū)分是小程序還是應(yīng)用程序

注解加的位置:

2、配置枚舉類配置文件 EDataPermissionType

3、創(chuàng)建攔截器重寫InnerInterceptor接口,重寫查詢方法

/**
 * 攔截器
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class MyDataPermissionInterceptor extends JsqlParserSupport implements InnerInterceptor {
    /**
     * 數(shù)據(jù)權(quán)限處理器
     */
    private MyDataPermissionHandler dataPermissionHandler;
    @Override
    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
        if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) {
            return;
        }
        PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);
        mpBs.sql(this.parserSingle(mpBs.sql(), ms.getId()));
    }
    @Override
    protected void processSelect(Select select, int index, String sql, Object obj) {
        SelectBody selectBody = select.getSelectBody();
        if (selectBody instanceof PlainSelect) {
            this.setWhere((PlainSelect) selectBody, (String) obj);
        } else if (selectBody instanceof SetOperationList) {
            SetOperationList setOperationList = (SetOperationList) selectBody;
            List<SelectBody> selectBodyList = setOperationList.getSelects();
            selectBodyList.forEach(s -> this.setWhere((PlainSelect) s, (String) obj));
        }
    }
 /**
     * 設(shè)置 where 條件
     *
     * @param plainSelect  查詢對(duì)象
     * @param whereSegment 查詢條件片段
     */
    private void setWhere(PlainSelect plainSelect, String whereSegment) {
        Expression sqlSegment = this.dataPermissionHandler.getSqlSegment(plainSelect, whereSegment);
        if (null != sqlSegment) {
            plainSelect.setWhere(sqlSegment);
        }
    }
}

4、創(chuàng)建處理類,動(dòng)態(tài)拼接sql片段,設(shè)置where

/**
 * 攔截器處理器
 */
@Slf4j
public class MyDataPermissionHandler {
    private ISysUserDataRelationService sysUserDataRelationService = new SysUserDataRelationServiceImpl();
    private MpcTokenUtil mpcTokenUtil = new MpcTokenUtil();
    private AppManageConfig appManageConfig;
    /**
     * 獲取數(shù)據(jù)權(quán)限 SQL 片段
     *
     * @param plainSelect  查詢對(duì)象
     * @param whereSegment 查詢條件片段
     * @return JSqlParser 條件表達(dá)式
     */
    @SneakyThrows(Exception.class)
    public Expression getSqlSegment(PlainSelect plainSelect, String whereSegment) {
        sysUserDataRelationService = SpringUtils.getBean(ISysUserDataRelationService.class);
        mpcTokenUtil = SpringUtils.getBean(MpcTokenUtil.class);
        appManageConfig = SpringUtils.getBean(AppManageConfig.class);
        // 待執(zhí)行 SQL Where 條件表達(dá)式
        Expression where = plainSelect.getWhere();
        if (where == null) {
            where = new HexValue(" 1 = 1 ");
        }
        //獲取mapper名稱
        String className = whereSegment.substring(0, whereSegment.lastIndexOf("."));
        //獲取方法名
        String methodName = whereSegment.substring(whereSegment.lastIndexOf(".") + 1);
        Table fromItem = (Table) plainSelect.getFromItem();
        // 有別名用別名,無別名用表名,防止字段沖突報(bào)錯(cuò)
        Alias fromItemAlias = fromItem.getAlias();
        String mainTableName = fromItemAlias == null ? fromItem.getName() : fromItemAlias.getName();
        //獲取當(dāng)前mapper 的方法
        Method[] methods = Class.forName(className).getMethods();
        //遍歷判斷mapper 的所有方法,判斷方法上是否有 UserDataPermission
        for (Method m : methods) {
            if (Objects.equals(m.getName(), methodName)) {
                UserDataPermission annotation = m.getAnnotation(UserDataPermission.class);
                if (annotation == null) {
                    return where;
                }
                String type = annotation.id();
                //小程序或應(yīng)用程序的集合,in的范圍
                List<String> dataIds = sysUserDataRelationService.getUserPermission(mpcTokenUtil.getUserAccountByToken(), EDataPermissionType.getCode(type));
                if (CollectionUtils.isEmpty(dataIds)) {
                    return null;
                }
                log.info("開始進(jìn)行權(quán)限過濾,where: {},mappedStatementId: {}", where, whereSegment);
                // 把集合轉(zhuǎn)變?yōu)镴SQLParser需要的元素列表
                ItemsList ids = new ExpressionList(dataIds.stream().map(StringValue::new).collect(Collectors.toList()));
                //in表達(dá)式的寫法
                InExpression inExpressiondept = null;
                String key = appManageConfig.getList().get(type);
                inExpressiondept = new InExpression(new Column(mainTableName + "." + key), ids);
                return new AndExpression(where, inExpressiondept);
            }
        }
        //說明無權(quán)查看,
        where = new HexValue(" 1 = 2 ");
        return where;
    }
}

5、將攔截器加到mybatis-plus插件中

@Configuration
@MapperScan("com.shinho.mpc.mapper")
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
    /**
     * 將攔截器加到mybatis插件中
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加數(shù)據(jù)權(quán)限插件
        MyDataPermissionInterceptor dataPermissionInterceptor = new MyDataPermissionInterceptor();
        // 添加自定義的數(shù)據(jù)權(quán)限處理器
        dataPermissionInterceptor.setDataPermissionHandler(new MyDataPermissionHandler());
        interceptor.addInnerInterceptor(dataPermissionInterceptor);
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

6、使用的位置加注解即可生效

在mapper層加上注解:

@UserDataPermission(id="app")
  • id :注解入?yún)?/li>
  • app:應(yīng)用程序類型權(quán)限控制
  • mp:小程序類型權(quán)限控制

7、數(shù)據(jù)攔截效果:

到此這篇關(guān)于MybatisPlus實(shí)現(xiàn)數(shù)據(jù)攔截的使用示例的文章就介紹到這了,更多相關(guān)MybatisPlus 數(shù)據(jù)攔截 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot Bean花式注解方法示例下篇

    SpringBoot Bean花式注解方法示例下篇

    這篇文章主要介紹了SpringBoot Bean花式注解方法,很多時(shí)候我們需要根據(jù)不同的條件在容器中加載不同的Bean,或者根據(jù)不同的條件來選擇是否在容器中加載某個(gè)Bean
    2023-02-02
  • spring使用Filter過濾器對(duì)Response返回值進(jìn)行修改的方法

    spring使用Filter過濾器對(duì)Response返回值進(jìn)行修改的方法

    這篇文章主要介紹了spring使用Filter過濾器對(duì)Response返回值進(jìn)行修改,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • Java輸出數(shù)組的3種方法

    Java輸出數(shù)組的3種方法

    這篇文章主要給大家介紹了關(guān)于Java輸出數(shù)組的3種方法,對(duì)于初學(xué)者來說,數(shù)組的輸入輸出是一個(gè)麻煩的問題,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • RocketMQ中多消息不同狀態(tài)回查的設(shè)計(jì)與優(yōu)化過程

    RocketMQ中多消息不同狀態(tài)回查的設(shè)計(jì)與優(yōu)化過程

    文章介紹了事務(wù)狀態(tài)回查的觸發(fā)條件、核心挑戰(zhàn)、方案設(shè)計(jì)、實(shí)現(xiàn)、優(yōu)化策略及監(jiān)控告警,通過多狀態(tài)回查,確保系統(tǒng)在業(yè)務(wù)異常時(shí)仍能保持最終一致性,并提升性能和穩(wěn)定性
    2026-01-01
  • Spring?Security自定義AuthenticationManager實(shí)現(xiàn)手機(jī)號(hào)/密碼雙認(rèn)證

    Spring?Security自定義AuthenticationManager實(shí)現(xiàn)手機(jī)號(hào)/密碼雙認(rèn)證

    這篇文章給大家介紹了Spring?Security自定義AuthenticationManager實(shí)現(xiàn)手機(jī)號(hào)/密碼雙認(rèn)證,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2026-06-06
  • 避免sql注入_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    避免sql注入_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了避免sql注入,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Mybatis使用簡(jiǎn)述及環(huán)境搭建

    Mybatis使用簡(jiǎn)述及環(huán)境搭建

    MyBatis是一款優(yōu)秀的Java持久層框架,它通過XML或注解的方式將 Java對(duì)象與數(shù)據(jù)庫(kù)中的記錄進(jìn)行映射,本文給大家介紹Mybatis使用簡(jiǎn)述,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Java Applet查找素?cái)?shù)小程序代碼實(shí)例

    Java Applet查找素?cái)?shù)小程序代碼實(shí)例

    這篇文章主要介紹了Java Applet查找素?cái)?shù)小程序代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java對(duì)象創(chuàng)建的幾種方式總結(jié)

    Java對(duì)象創(chuàng)建的幾種方式總結(jié)

    本文詳細(xì)介紹了Java中創(chuàng)建對(duì)象的五種方法,包括使用new關(guān)鍵字、Class的newInstance()方法、Constructor的newInstance()方法、克隆以及反序列化,同時(shí)討論了這些方式是否調(diào)用了構(gòu)造器以及創(chuàng)建對(duì)象的條件,文章還提供了示例代碼進(jìn)行演示,需要的朋友可以參考下
    2025-02-02
  • java 學(xué)習(xí)筆記(入門篇)_多選擇結(jié)構(gòu)switch語句

    java 學(xué)習(xí)筆記(入門篇)_多選擇結(jié)構(gòu)switch語句

    在java中為多路分支選擇流程專門提供了switch語句,switch語句根據(jù)一個(gè)表達(dá)式的值,選擇運(yùn)行多個(gè)操作中的一個(gè),感興趣的朋友可以了解下
    2013-01-01

最新評(píng)論

杭锦后旗| 江阴市| 麻江县| 普兰店市| 崇文区| 双江| 泽州县| 奇台县| 洪泽县| 鸡泽县| 信丰县| 霞浦县| 昌邑市| 呼伦贝尔市| 莱州市| 晋宁县| 仪陇县| 玛曲县| 株洲县| 宁波市| 历史| 化隆| 雷山县| 唐山市| 丹棱县| 雅江县| 深圳市| 云梦县| 射阳县| 泰安市| 梁平县| 淮北市| 新竹市| 镇远县| 遂宁市| 东丰县| 奇台县| 商丘市| 耒阳市| 汉阴县| 繁峙县|