mybatis-plus多租戶的select部分拼接租戶id

在將項目改成多租戶模式時,因為mybatis-plus自帶的功能只會拼接left 帐萎、from和where后面的表或子查詢添加租戶id比伏。想要將selete部分的子查詢拼接租戶id,必須重寫TenantSqlParser類的processPlainSelect(PlainSelect plainSelect)方法疆导,代碼如下:

public class TestTenantSqlParser extends TenantSqlParser {
    @Override
    protected void processPlainSelect(PlainSelect plainSelect) {
        // SELECT 至 FROM 中的嵌套查詢
        List<SelectItem> selectItemList = plainSelect.getSelectItems();
        for (SelectItem selectItem : selectItemList) {
            if (selectItem instanceof SelectExpressionItem) {
                SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem;
                if (!(selectExpressionItem.getExpression() instanceof Column)) {
                    // 處理 column select 嵌套部分
                    operateExpression(selectExpressionItem.getExpression());
                }
            }
        }
        processPlainSelect(plainSelect, false);
    }

    private void operateExpression(Expression expression){
  //例如:select (slect a from b where b.id=table.bid)a,table.*
  //from table 
        if (expression instanceof SubSelect){
            SubSelect subSelect = (SubSelect) expression;
            PlainSelect plainSelect = (PlainSelect) subSelect.getSelectBody();
            processSelectBody(plainSelect);
        }
        else if (expression instanceof Parenthesis){
            Parenthesis parenthesis= (Parenthesis) expression;
            operateExpression(parenthesis.getExpression());
        }else if (expression instanceof CaseExpression) { //處理case when
            CaseExpression caseExpression= (CaseExpression) expression;
            caseExpression.getWhenClauses();
            List<Expression> whenClauses = caseExpression.getWhenClauses();
            for (Expression e : whenClauses) {
                if (e instanceof WhenClause){
                    WhenClause whenClause= (WhenClause) e;
                    operateExpression(whenClause.getThenExpression());
                }
            }
        }else if (expression instanceof Function){//處理IFNULL
            Function function= (Function) expression;
            if ("IFNULL".equals(function.getName())){
                ExpressionList expressionList=function.getParameters();
                List<Expression> ifExpression=expressionList.getExpressions();
                for (Expression e:ifExpression){
                    operateExpression(e);
                }
            }
        }
    }
}

然后在配置文件調用

@Bean
public PaginationInterceptor paginationInterceptor() {
    PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
    paginationInterceptor.setLocalPage(true);// 開啟 PageHelper 的支持
    /*
     * 【測試多租戶】 SQL 解析處理攔截器<br>
     * 這里固定寫成住戶 1 實際情況你可以從cookie讀取赁项,因此數(shù)據(jù)看不到 【 麻花藤 】 這條記錄( 注意觀察 SQL )<br>
     */
    List<ISqlParser> sqlParserList = new ArrayList<>();
    /**
      *此處調用重寫的類
      *
      */
    TestTenantSqlParser tenantSqlParser = new TestTenantSqlParser ();
    tenantSqlParser.setTenantHandler(new TenantHandler() {
        @Override
        public Expression getTenantId() {
            return new LongValue(1L);
        }

        @Override
        public String getTenantIdColumn() {
            return "tenant_id";
        }

        @Override
        public boolean doTableFilter(String tableName) {
            // 這里可以判斷是否過濾表
            /*
            if ("user".equals(tableName)) {
                return true;
            }*/
            return false;
        }
    });
    sqlParserList.add(tenantSqlParser);
    paginationInterceptor.setSqlParserList(sqlParserList);
    paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
        @Override
        public boolean doFilter(MetaObject metaObject) {
            MappedStatement ms = PluginUtils.getMappedStatement(metaObject);
            // 過濾自定義查詢此時無租戶信息約束【 麻花藤 】出現(xiàn)
            if ("com.baomidou.springboot.mapper.UserMapper.selectListBySQL".equals(ms.getId())) {
                return true;
            }
            return false;
        }
    });
    return paginationInterceptor;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市澈段,隨后出現(xiàn)的幾起案子悠菜,更是在濱河造成了極大的恐慌,老刑警劉巖败富,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悔醋,死亡現(xiàn)場離奇詭異,居然都是意外死亡兽叮,警方通過查閱死者的電腦和手機芬骄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹦聪,“玉大人账阻,你說我怎么就攤上這事∽德螅” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵材彪,是天一觀的道長观挎。 經常有香客問我,道長段化,這世上最難降的妖魔是什么嘁捷? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮显熏,結果婚禮上雄嚣,老公的妹妹穿的比我還像新娘。我一直安慰自己喘蟆,他們只是感情好缓升,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蕴轨,像睡著了一般港谊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上橙弱,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天歧寺,我揣著相機與錄音燥狰,去河邊找鬼。 笑死斜筐,一個胖子當著我的面吹牛龙致,可吹牛的內容都是我干的。 我是一名探鬼主播顷链,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼目代,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蕴潦?” 一聲冷哼從身側響起像啼,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎潭苞,沒想到半個月后忽冻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡此疹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年僧诚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝗碎。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡湖笨,死狀恐怖,靈堂內的尸體忽然破棺而出蹦骑,到底是詐尸還是另有隱情慈省,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布眠菇,位于F島的核電站边败,受9級特大地震影響,放射性物質發(fā)生泄漏捎废。R本人自食惡果不足惜笑窜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望登疗。 院中可真熱鬧排截,春花似錦、人聲如沸辐益。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽智政。三九已至艳悔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間女仰,已是汗流浹背猜年。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工抡锈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乔外。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓床三,卻偏偏與公主長得像,于是被迫代替她去往敵國和親杨幼。 傳聞我的和親對象是個殘疾皇子撇簿,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348