亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

利用Mybatis?Plus實(shí)現(xiàn)一個(gè)SQL攔截器

 更新時(shí)間:2023年05月09日 14:08:04   作者:KevinQ  
SQL攔截器是一種用于攔截和修改Mybatis執(zhí)行的SQL語(yǔ)句的工具,通過(guò)使用SQL攔截器,開(kāi)發(fā)人員可以在執(zhí)行SQL語(yǔ)句之前或之后對(duì)其進(jìn)行修改或記錄,本文就來(lái)借助一下Mybatis-Plus實(shí)現(xiàn)一個(gè)SQL攔截器吧

起源

最近公司要做多租戶,Mybatis-Plus的多租戶插件很好用,但是有一個(gè)場(chǎng)景是:字典表或者某些數(shù)據(jù)表,一些數(shù)據(jù)需要在各個(gè)租戶之間共享,而數(shù)據(jù)表本身又同時(shí)要實(shí)現(xiàn)多租戶數(shù)據(jù)隔離,比如字典表:性別等“男”/“女”基礎(chǔ)數(shù)據(jù)。

SQL攔截器是一種用于攔截和修改Mybatis執(zhí)行的SQL語(yǔ)句的工具。通過(guò)使用SQL攔截器,開(kāi)發(fā)人員可以在執(zhí)行SQL語(yǔ)句之前或之后對(duì)其進(jìn)行修改或記錄,從而更好地控制和優(yōu)化數(shù)據(jù)庫(kù)操作。例如MyBatis-Plus的基礎(chǔ)分頁(yè)插件、多租戶插件就是SQL攔截器,那么,我們是否可以實(shí)現(xiàn)自己的SQL攔截器呢?

答案當(dāng)然是肯定的。

實(shí)現(xiàn)攔截器接口InnerInterceptor

InnerInterceptor 這個(gè)接口是MyBaitsPlus的攔截器接口類,實(shí)現(xiàn)它之后,并且通過(guò)MybatisPlusInterceptor配置后,就可以實(shí)現(xiàn)SQL執(zhí)行攔截。

MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

// 多租戶攔截器
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantDatabaseInterceptor(tenantProperties)));
// 多租戶部分表數(shù)據(jù)共享攔截器
interceptor.addInnerInterceptor(new TenantDatabaseShareInterceptor(new TenantShareHandlerImpl(tenantProperties)));

那么如何實(shí)現(xiàn)該接口以及修改SQL呢?

下面是一個(gè)樣例:

import com.baomidou.mybatisplus.core.interceptor.InnerInterceptor;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.parser.SqlParserHelper;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptorChain;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.select.Select;

public class MyInterceptor implements InnerInterceptor {
    @Override
    ```
    @Override
    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
        if (InterceptorIgnoreHelper.willIgnoreTenantLine(ms.getId())) return;
        PluginUtils.MPBoundSql mpBs = PluginUtils.mpBoundSql(boundSql);
        mpBs.sql(parserSingle(mpBs.sql(), null));
    }

}

通過(guò)修改beforeQuery函數(shù)中的代碼,即可修改執(zhí)行的SQL。

修改sql常用的工具類

JsqlParserSupport該類用于解析與修改SQL,并且MybatisPlus的多租戶插件更是直接繼承了該類。 CCJSqlParserUtil是JSqlParser中用于解析SQL語(yǔ)句的工具類。它提供了一些靜態(tài)方法,可以將SQL語(yǔ)句解析為Statement對(duì)象、Select對(duì)象、Update對(duì)象、Insert對(duì)象、Delete對(duì)象等。

常用的類還有Expression, Statement等類。

例如,使用Expression實(shí)現(xiàn)一個(gè)IN語(yǔ)句:

import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList;
import net.sf.jsqlparser.expression.operators.relational.NamedParameter;
import net.sf.jsqlparser.expression.operators.relational.SubSelect;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;

public class JSqlParserExample {
    public static void main(String[] args) throws Exception {
        // IN語(yǔ)句
        InExpression inExpr = new InExpression();
        inExpr.setLeftExpression(CCJSqlParserUtil.parseExpression("age"));
        ItemsList valueList = new MultiExpressionList();
        ((MultiExpressionList) valueList).addExpressions(new LongValue(18), new LongValue(21), new LongValue(30));
        inExpr.setItemsList(valueList);
        System.out.println(inExpr.toString());

        // 子查詢
        InExpression subqueryInExpr = new InExpression();
        subqueryInExpr.setLeftExpression(CCJSqlParserUtil.parseExpression("age"));
        SubSelect subquery = new SubSelect();
        subquery.setSelectBody(CCJSqlParserUtil.parse("SELECT age FROM users WHERE country = 'US'"));
        subqueryInExpr.setRightExpression(subquery);
        System.out.println(subqueryInExpr.toString());
    }
}

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

相關(guān)文章

  • Spring如何正確注入集合類型

    Spring如何正確注入集合類型

    這篇文章主要介紹了Spring如何正確注入集合類型,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Java鎖之阻塞鎖介紹和代碼實(shí)例

    Java鎖之阻塞鎖介紹和代碼實(shí)例

    這篇文章主要介紹了Java鎖之阻塞鎖介紹和代碼實(shí)例,阻塞鎖與自旋鎖不同,它改變了線程的運(yùn)行狀態(tài),需要的朋友可以參考下
    2014-09-09
  • Java實(shí)現(xiàn)ATM取款機(jī)程序

    Java實(shí)現(xiàn)ATM取款機(jī)程序

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)ATM取款機(jī)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java獲取當(dāng)?shù)氐娜粘鋈章鋾r(shí)間代碼分享

    Java獲取當(dāng)?shù)氐娜粘鋈章鋾r(shí)間代碼分享

    這篇文章主要介紹了Java獲取當(dāng)?shù)氐娜粘鋈章鋾r(shí)間代碼分享,國(guó)外猿友寫的一個(gè)類,需要的朋友可以參考下
    2014-06-06
  • Spring中ThreadLocal的解析

    Spring中ThreadLocal的解析

    這篇文章主要介紹了Spring中ThreadLocal的解析,Spring通過(guò)各種DAO模板類降低了開(kāi)發(fā)者使用各種數(shù)據(jù)持久技術(shù)的難度。這些模板類都是線程安全的,也就是說(shuō),多個(gè)DAO可以復(fù)用同一個(gè)模板實(shí)例而不會(huì)發(fā)生沖突,下面一起進(jìn)入文章學(xué)子詳細(xì)內(nèi)容吧
    2022-01-01
  • Java同步關(guān)鍵字synchronize底層實(shí)現(xiàn)原理解析

    Java同步關(guān)鍵字synchronize底層實(shí)現(xiàn)原理解析

    synchronized關(guān)鍵字對(duì)大家來(lái)說(shuō)并不陌生,當(dāng)我們遇到并發(fā)情況時(shí),優(yōu)先會(huì)想到用synchronized關(guān)鍵字去解決,synchronized確實(shí)能夠幫助我們?nèi)ソ鉀Q并發(fā)的問(wèn)題,接下來(lái)通過(guò)本文給大家分享java synchronize底層實(shí)現(xiàn)原理,感興趣的朋友一起看看吧
    2021-08-08
  • java中Path和ClassPath用法比較

    java中Path和ClassPath用法比較

    在本篇文章里小編給大家分享了關(guān)于java中Path和ClassPath用法比較內(nèi)容,有需要的朋友們學(xué)習(xí)下。
    2019-01-01
  • java二維碼生成的方法

    java二維碼生成的方法

    這篇文章主要為大家詳細(xì)介紹了java二維碼生成的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java實(shí)現(xiàn)動(dòng)態(tài)代理

    Java實(shí)現(xiàn)動(dòng)態(tài)代理

    本文給大家介紹的是java使用動(dòng)態(tài)代理類實(shí)現(xiàn)動(dòng)態(tài)代理的方法和示例,這里推薦給大家,有需要的小伙伴參考下吧
    2015-02-02
  • JavaWeb Servlet生命周期細(xì)枝末節(jié)處深究

    JavaWeb Servlet生命周期細(xì)枝末節(jié)處深究

    Servlet指在服務(wù)器端執(zhí)行的一段Java代碼,可以接收用戶的請(qǐng)求和返回給用戶響應(yīng)結(jié)果,下面這篇文章主要給大家介紹了關(guān)于JavaWeb.servlet生命周期的相關(guān)資料,需要的朋友可以參考下
    2022-10-10

最新評(píng)論