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

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

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

起源

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

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

答案當然是肯定的。

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

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

MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

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

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

下面是一個樣例:

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));
    }

}

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

修改sql常用的工具類

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

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

例如,使用Expression實現(xiàn)一個IN語句:

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語句
        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實現(xiàn)一個SQL攔截器的文章就介紹到這了,更多相關(guān)Mybatis Plus SQL攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

    Spring如何正確注入集合類型

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

    Java鎖之阻塞鎖介紹和代碼實例

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

    Java實現(xiàn)ATM取款機程序

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

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

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

    Spring中ThreadLocal的解析

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

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

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

    java中Path和ClassPath用法比較

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

    java二維碼生成的方法

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

    Java實現(xiàn)動態(tài)代理

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

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

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

最新評論