国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

MyBatis Plus 攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制

這篇具有很好參考價(jià)值的文章主要介紹了MyBatis Plus 攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、介紹

上篇文章介紹的MyBatis Plus 插件實(shí)際上就是用攔截器實(shí)現(xiàn)的,MyBatis Plus攔截器對(duì)MyBatis的攔截器進(jìn)行了包裝處理,操作起來更加方便

二、自定義攔截器

2.1、InnerInterceptor

MyBatis Plus提供的InnerInterceptor接口提供了如下方法,主要包括:在查詢之前執(zhí)行,在更新之前執(zhí)行,在SQL準(zhǔn)備之前執(zhí)行
innerinterceptor,MyBatis Plus,mybatis,java,mysql

2.2、編寫簡(jiǎn)易攔截器

package com.xx.config;

import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.delete.Delete;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectBody;
import net.sf.jsqlparser.statement.update.Update;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.MappedStatement;
import org.springframework.stereotype.Component;

import java.sql.Connection;

/**
 * @author aqi
 * @date 2023/5/17 15:07
 */
@Slf4j
@Component
public class TestInterceptor extends JsqlParserSupport implements InnerInterceptor {

    @Override
    public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) {
        // 這里固定這么寫就可以了
        PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh);
        MappedStatement ms = mpSh.mappedStatement();
        if (InterceptorIgnoreHelper.willIgnoreTenantLine(ms.getId())) {
            return;
        }
        PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql();
        mpBs.sql(parserMulti(mpBs.sql(), null));
    }

    /**
     * 該方法由JsqlParserSupport提供,主要用于通過API的方式操作SQL
     * 思路:通過API構(gòu)建出新的條件,并將新的條件和之前的條件拼接在一起
     */
    @Override
    protected void processSelect(Select select, int index, String sql, Object obj) {
        // 解析SQL
        SelectBody selectBody = select.getSelectBody();
        PlainSelect plainSelect = (PlainSelect) selectBody;

        // 構(gòu)建eq對(duì)象
        EqualsTo equalsTo = new EqualsTo(new Column("name"), new StringValue("tom"));
        // 將原來的條件和新構(gòu)建的條件合在一起
        AndExpression andExpression = new AndExpression(plainSelect.getWhere(), equalsTo);
        // 重新封裝where條件
        plainSelect.setWhere(andExpression);
    }


    @Override
    protected void processInsert(Insert insert, int index, String sql, Object obj) {
        insert.getColumns().add(new Column("name"));
        ((ExpressionList) insert.getItemsList()).getExpressions().add(new StringValue("tom"));
    }

    @Override
    protected void processUpdate(Update update, int index, String sql, Object obj) {
        update.addUpdateSet(new Column("name"), new StringValue("tom"));
    }

    @Override
    protected void processDelete(Delete delete, int index, String sql, Object obj) {
        // 刪除新增條件和查詢一樣,不做演示
    }
}


2.3、將攔截器添加到MyBatis Plus攔截器中

package com.xx.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author aqi
 * @date 2023/5/15 14:05
 */
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        // 初始化Mybatis Plus攔截器
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new TestInterceptor());
        return interceptor;
    }
}

2.4、編寫測(cè)試用例

@Test
    void save() {
        AirlinesInfo airlinesInfo = new AirlinesInfo();
        airlinesInfo.setInfo("remark");
        airlinesInfoService.save(airlinesInfo);
    }

    @Test
    void update() {
        AirlinesInfo airlinesInfo = new AirlinesInfo();
        airlinesInfo.setId(1L);
        airlinesInfo.setInfo("remark, remark");
        airlinesInfoService.updateById(airlinesInfo);
    }

    @Test
    void select() {
        airlinesInfoService.list();
    }

2.5、執(zhí)行結(jié)果

innerinterceptor,MyBatis Plus,mybatis,java,mysql

innerinterceptor,MyBatis Plus,mybatis,java,mysql

innerinterceptor,MyBatis Plus,mybatis,java,mysql

三、自定義攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制

3.1、編寫攔截器

package com.xx.config;

import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import com.xx.entity.Permission;
import com.xx.utils.ExpressionUtils;
import com.xx.utils.UserUtils;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectBody;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.springframework.stereotype.Component;

import java.sql.Connection;

/**
 * @author xiaxing
 */
@Slf4j
@Component
public class DataScopeInterceptor extends JsqlParserSupport implements InnerInterceptor {

    @Override
    public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) {
        log.info("[DataScopeInterceptor]beforePrepare...");
        PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh);
        MappedStatement ms = mpSh.mappedStatement();
        SqlCommandType sct = ms.getSqlCommandType();
        if (sct == SqlCommandType.INSERT || sct == SqlCommandType.SELECT) {
            if (InterceptorIgnoreHelper.willIgnoreTenantLine(ms.getId())) {
                return;
            }
            PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql();
            mpBs.sql(parserMulti(mpBs.sql(), null));
        }
    }

    /**
     * 查詢
     */
    @Override
    protected void processSelect(Select select, int index, String sql, Object obj) {
        SelectBody selectBody = select.getSelectBody();
        PlainSelect plainSelect = (PlainSelect) selectBody;

        // 獲取表名/別名(如果是關(guān)聯(lián)查詢是取第一個(gè)join左側(cè)的表名/別名)
        String tableName = ExpressionUtils.getTableName(plainSelect);

        // 構(gòu)建用戶權(quán)限控制條件
        Expression userPermissionExpression = this.buildUserPermissionSql(tableName);
        if (null != userPermissionExpression) {
            // 將sql原本就有得where條件和新構(gòu)建出來的條件拼接起來
            plainSelect.setWhere(ExpressionUtils.appendExpression(plainSelect.getWhere(), userPermissionExpression));
        }

    }

    /**
     * 構(gòu)建用戶權(quán)限控制條件
     * @param tableName 表名/別名(join查詢左側(cè)表名)
     */
    private Expression buildUserPermissionSql(String tableName) {
        // 獲取當(dāng)前用戶信息(這里的數(shù)據(jù)都是模擬的,實(shí)際上可能得從緩存或者session中獲取)
        Permission permission = UserUtils.getUserPermission();
        return null != permission ? ExpressionUtils.buildInSql(tableName + "."  + permission.getField(), permission.getValue()) : null;
    }

}

3.2、編寫構(gòu)建SQL工具類

package com.xx.utils;

import net.sf.jsqlparser.expression.Alias;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.select.PlainSelect;

import java.util.Set;
import java.util.stream.Collectors;

/**
 * @author aqi
 * @date 2023/5/17 10:16
 * @describe JSqlParser工具類,用于通過API的方式操作SQL語(yǔ)句
 */
public class ExpressionUtils {

    /**
     * 構(gòu)建in sql
     * @param columnName 字段名稱
     * @param params 字段值
     * @return InExpression
     */
    public static InExpression buildInSql(String columnName, Set<String> params) {
        // 把集合轉(zhuǎn)變?yōu)镴SQLParser需要的元素列表
        ItemsList itemsList = new ExpressionList(params.stream().map(StringValue::new).collect(Collectors.toList()));
        // 創(chuàng)建IN表達(dá)式對(duì)象,傳入列名及IN范圍列表
        return new InExpression(new Column(columnName), itemsList);
    }

    /**
     * 構(gòu)建eq sql
     * @param columnName 字段名稱
     * @param value 字段值
     * @return EqualsTo
     */
    public static EqualsTo buildEq(String columnName, String value) {
       return new EqualsTo(new Column(columnName), new StringValue(value));
    }

    /**
     * 獲取表名/別名
     * @param plainSelect plainSelect
     * @return 表名/別名
     */
    public static String getTableName(PlainSelect plainSelect) {
        // 獲取別名
        Table table= (Table) plainSelect.getFromItem();
        Alias alias = table.getAlias();
        return null == alias ? table.getName() : alias.getName();
    }

    /**
     * 將2個(gè)where條件拼接到一起
     * @param where 條件
     * @param appendExpression 待拼接條件
     * @return Expression
     */
    public static Expression appendExpression(Expression where, Expression appendExpression) {
        return null == where ? appendExpression : new AndExpression(where, appendExpression);
    }
}

3.3、模擬用戶信息工具類

package com.xx.utils;

import com.xx.config.Globle;
import com.xx.entity.Permission;
import com.xx.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.*;

/**
 * @author aqi
 * @date 2023/5/17 14:20
 */
@Slf4j
public class UserUtils {

    public static User currentUser;

    static {
        // 構(gòu)建測(cè)試數(shù)據(jù)
        List<Permission> permissionList = new ArrayList<>();
        // demo/test接口權(quán)限
        Permission permission = new Permission();
        permission.setField("id");
        permission.setUri("/demo/test");
        Set<String> set = new HashSet<>();
        set.add("1");
        set.add("2");
        set.add("3");
        permission.setValue(set);
        permissionList.add(permission);


        // demo/test1接口權(quán)限
        Permission permission1 = new Permission();
        permission1.setField("id");
        permission1.setUri("/demo/test1");
        Set<String> set1 = new HashSet<>();
        set1.add("4");
        set1.add("5");
        set1.add("6");
        permission1.setValue(set1);
        permissionList.add(permission1);


        User user = new User();
        user.setPermissionList(permissionList);
        user.setTenantId("1");
        currentUser = user;
    }

    public static Permission getUserPermission() {
        User currentUser = Globle.currentUser;
        String uri = UserUtils.getUri();
        List<Permission> permissionList = currentUser.getPermissionList();
        return permissionList.stream().filter(e -> Objects.equals(e.getUri(), uri)).findFirst().orElse(null);
    }

    /**
     * 獲取本次請(qǐng)求的uri
     * @return uri
     */
    private static String getUri() {
        // 獲取此次請(qǐng)求的uri
        String uri = "";
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        if (null != requestAttributes) {
            HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
            uri = request.getRequestURI();
        }
        log.info("[DataScopeInterceptor]此次請(qǐng)求uri:{}", uri);
        return uri;
    }
}


3.4、將攔截器添加到MyBatis Plus藍(lán)機(jī)器中

package com.xx.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @author aqi
 * @date 2023/5/15 14:05
 */
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        // 初始化Mybatis Plus攔截器
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new DataScopeInterceptor());
        return interceptor;
    }
}

3.5、測(cè)試

package com.xx.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.pagehelper.PageHelper;
import com.xx.entity.AirlinesInfo;
import com.xx.service.AirlinesInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author aqi
 * @date 2023/5/18 11:01
 */
@Slf4j
@RestController
@RequestMapping("/demo")
public class DemoController {

    @Resource
    private AirlinesInfoService airlinesInfoService;

    @GetMapping("/test")
    public void test() {
        log.info("進(jìn)入test接口,測(cè)試權(quán)限控制在基礎(chǔ)的sql語(yǔ)句是否能生效");
        airlinesInfoService.list();
        // 執(zhí)行結(jié)果:(SELECT * FROM airlines_info WHERE state = 0 AND airlines_info.id IN ('1', '2', '3'))
    }

    @GetMapping("/test1")
    public void test1() {
        log.info("進(jìn)入test1接口,測(cè)試權(quán)限控制在使用MyBatis Plus 的分頁(yè)插件之后能否生效");
        Page<AirlinesInfo> page = new Page<>(1, 5);
        airlinesInfoService.page(page, new QueryWrapper<AirlinesInfo>().eq("name", "tom"));
        // 執(zhí)行結(jié)果:(SELECT * FROM airlines_info WHERE state = 0 AND (name = ?) AND airlines_info.id IN ('4', '5', '6') LIMIT ?)
    }

    @GetMapping("/test2")
    public void test2() {
        log.info("進(jìn)入test2接口,測(cè)試權(quán)限控制在使用PageHelper之后能否生效");
        PageHelper.startPage(1, 5);
        airlinesInfoService.list(new LambdaQueryWrapper<AirlinesInfo>().eq(AirlinesInfo::getName, "tom"));
        // 執(zhí)行結(jié)果:(SELECT * FROM airlines_info WHERE state = 0 AND (name = ?) AND airlines_info.id IN ('7', '8', '9') LIMIT ?)
    }

    @GetMapping("/test3")
    public void test3() {
        log.info("進(jìn)入test3接口,測(cè)試權(quán)限控制在使用自定義復(fù)雜關(guān)聯(lián)查詢之后能否生效");
        airlinesInfoService.innerSql();
        // 原始SQL:(select * from airlines_info t1 INNER JOIN t_config on t1.id = t_config.id where t1.name = 'tom' and t_config.name = 'jack' limit 5)
        // 執(zhí)行結(jié)果:(SELECT * FROM airlines_info t1 INNER JOIN t_config ON t1.id = t_config.id WHERE t1.name = 'tom' AND t_config.name = 'jack' AND t1.id IN ('11', '12', '10') LIMIT 5)
    }

    @GetMapping("/test4")
    public void test4() {
        log.info("進(jìn)入test4接口,測(cè)試該接口沒有設(shè)計(jì)權(quán)限限制是否可以不生效");
        airlinesInfoService.list();
        // 執(zhí)行結(jié)果:(SELECT * FROM airlines_info WHERE state = 0)
    }


}

四、結(jié)論

通過測(cè)試可以看出不論在什么情況下都可以正常的對(duì)權(quán)限進(jìn)行控制

注意:上面部分代碼使用的是MyBatis Plus 3.5.3版本,并且使用的JSqlParser部分API已經(jīng)不推薦使用,但是我沒有找到最新的API應(yīng)該怎么寫文章來源地址http://www.zghlxwxcb.cn/news/detail-799316.html

到了這里,關(guān)于MyBatis Plus 攔截器實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpingMVC攔截器-用戶登錄權(quán)限控制分析

    SpingMVC攔截器-用戶登錄權(quán)限控制分析

    1.1 這個(gè)后臺(tái)工程,沒有進(jìn)行相關(guān)操作也能夠進(jìn)行登錄: 4.1 5.1 ?選擇test那個(gè)文件: 17.1.var可以獲得session對(duì)象: 17.2 獲取誰(shuí)啊!獲取user,返回的是user對(duì)象 ?17.3 強(qiáng)轉(zhuǎn)之后做判斷: ?17.4 如果判斷沒有登錄,這里跳轉(zhuǎn),這里我要設(shè)置重定向命令: ? 17.5 重定向 17.6 內(nèi)部requestCon

    2024年02月11日
    瀏覽(20)
  • 數(shù)據(jù)權(quán)限攔截器,多租戶攔截器

    WEB類型軟件產(chǎn)品,在Java(SpringBoot)+MybatisPlus架構(gòu)場(chǎng)景下,本文針對(duì)下面兩個(gè)問題,提供解決方案: 多租戶的產(chǎn)品,想在表內(nèi)級(jí)別上,實(shí)現(xiàn)租戶數(shù)據(jù)隔離(分表、分庫(kù)方案不在本文討論范圍內(nèi))。 ToB、ToG類型的軟件產(chǎn)品,需要實(shí)現(xiàn)數(shù)據(jù)權(quán)限鑒權(quán)。例如用戶數(shù)據(jù)、部門數(shù)據(jù)、租戶

    2024年02月02日
    瀏覽(27)
  • Spring Boot 統(tǒng)一功能處理(攔截器實(shí)現(xiàn)用戶登錄權(quán)限的統(tǒng)一校驗(yàn)、統(tǒng)一異常返回、統(tǒng)一數(shù)據(jù)格式返回)

    Spring Boot 統(tǒng)一功能處理(攔截器實(shí)現(xiàn)用戶登錄權(quán)限的統(tǒng)一校驗(yàn)、統(tǒng)一異常返回、統(tǒng)一數(shù)據(jù)格式返回)

    目錄 1. 用戶登錄權(quán)限校驗(yàn) 1.1 最初用戶登錄權(quán)限效驗(yàn) 1.2 Spring AOP 用戶統(tǒng)?登錄驗(yàn)證 1.3 Spring 攔截器 (1)創(chuàng)建自定義攔截器 (2)將自定義攔截器添加到系統(tǒng)配置中,并設(shè)置攔截的規(guī)則 1.4 練習(xí):登錄攔截器 (1)實(shí)現(xiàn) UserController 實(shí)體類 (2)返回的登錄頁(yè)面:login.html (3)實(shí)

    2024年02月12日
    瀏覽(59)
  • 利用Mybatis攔截器實(shí)現(xiàn)自定義的ID增長(zhǎng)器

    利用Mybatis攔截器實(shí)現(xiàn)自定義的ID增長(zhǎng)器

    原生的Mybatis框架是沒有ID自增器,但例如國(guó)產(chǎn)的Mybatis Plus卻是支持,不過,Mybatis Plus卻是缺少了自定屬性的填充;例如:我們需要自定義填充一些屬性,updateDate、createDate等,這時(shí)Mybatis Plus自帶的ID自增器就無法滿足需求;這種時(shí)候我們就需要自定義的ID增加器,可以自定義

    2024年02月19日
    瀏覽(26)
  • 關(guān)于MyBatis攔截器失效問題的解決(多數(shù)據(jù)源、分頁(yè)插件)

    最近做了一個(gè)備份被delete語(yǔ)句刪除的數(shù)據(jù)的小插件,是用MyBatis的攔截器去做的。 但是發(fā)現(xiàn)在一個(gè)項(xiàng)目中會(huì)失效,沒有去備份刪除的數(shù)據(jù),查看日志發(fā)現(xiàn)請(qǐng)求并沒有進(jìn)入到攔截器中,換句話說就是攔截器失效了。 百度了一下(哎,百度)發(fā)現(xiàn)說的最多的就是分頁(yè)插件導(dǎo)致的,

    2024年02月14日
    瀏覽(23)
  • Springboot 自定義 Mybatis攔截器,實(shí)現(xiàn) 動(dòng)態(tài)查詢條件SQL自動(dòng)組裝拼接(玩具)

    Springboot 自定義 Mybatis攔截器,實(shí)現(xiàn) 動(dòng)態(tài)查詢條件SQL自動(dòng)組裝拼接(玩具)

    ps:最近在參與3100保衛(wèi)戰(zhàn),戰(zhàn)況很激烈,剛剛打完仗,來更新一下之前寫了一半的博客。 該篇針對(duì)日常寫查詢的時(shí)候,那些動(dòng)態(tài)條件sql 做個(gè)簡(jiǎn)單的封裝,自動(dòng)生成(拋磚引玉,搞個(gè)小玩具,不喜勿噴)。 來看看我們平時(shí)寫那些查詢,基本上都要寫的一些動(dòng)態(tài)sql: ? 一個(gè)字段

    2024年02月12日
    瀏覽(30)
  • MyBatis 攔截器介紹

    MyBatis 提供了一種插件 (plugin) 的功能,雖然叫做插件,但其實(shí)這是攔截器功能。那么攔截器攔截 MyBatis 中的哪些內(nèi)容呢? 我們進(jìn)入官網(wǎng)看一看: MyBatis 允許你在已映射語(yǔ)句執(zhí)行過程中的某一點(diǎn)進(jìn)行攔截調(diào)用。默認(rèn)情況下,MyBatis 允許使用插件來攔截的方法調(diào)用包括: Executor

    2024年02月15日
    瀏覽(21)
  • 自定義MyBatis攔截器更改表名

    by emanjusaka from ? https://www.emanjusaka.top/2023/10/mybatis-interceptor-update-tableName 彼岸花開可奈何 本文歡迎分享與聚合,全文轉(zhuǎn)載請(qǐng)留下原文地址。 自定義MyBatis攔截器可以在方法執(zhí)行前后插入自己的邏輯,這非常有利于擴(kuò)展和定制 MyBatis 的功能。本篇文章實(shí)現(xiàn)自定義一個(gè)攔截器去改

    2024年02月08日
    瀏覽(25)
  • 7.5 SpringBoot 攔截器Interceptor實(shí)戰(zhàn) 統(tǒng)一角色權(quán)限校驗(yàn)

    7.5 SpringBoot 攔截器Interceptor實(shí)戰(zhàn) 統(tǒng)一角色權(quán)限校驗(yàn)

    在【 7.1 】管理員圖書錄入和修改API,當(dāng)時(shí)預(yù)告過:并沒有寫【校驗(yàn)是否是管理員】的邏輯,因?yàn)槭峭ㄓ眠壿?,?huì)單寫一篇來細(xì)講,那么今天就來安排! 角色權(quán)限校驗(yàn) ,是保證接口安全必備的能力:有權(quán)限才可以操作!所以,一般對(duì)于這種通用邏輯,推薦不與主業(yè)務(wù)邏輯耦合

    2024年02月16日
    瀏覽(19)
  • Mybatis攔截器注解@Intercepts與@Signature注解屬性說明

    可能有些新手使用mybatis攔截器的時(shí)候可能沒太懂@Signature注解中type,method,args的用法 首先mybatis攔截器可以攔截如下4中類型 Executor sql的內(nèi)部執(zhí)行器 ParameterHandler 攔截參數(shù)的處理 StatementHandler 攔截sql的構(gòu)建 ResultSetHandler 攔截結(jié)果的處理 type:就是指定攔截器類型(ParameterHandl

    2024年02月05日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包