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

MybatisPlus攔截器如何實現(xiàn)數(shù)據(jù)表分表

 更新時間:2024年11月06日 09:29:12   作者:樘棣寂寂  
為了解決MySQL中大數(shù)據(jù)量的查詢效率問題,采用水平拆分策略,通過取模運算確定表后綴,實現(xiàn)數(shù)據(jù)的有效管理,設計分表時,需利用線程變量存取請求參數(shù),并通過攔截器確定操作的具體表名,從而優(yōu)化數(shù)據(jù)處理性能,此方法適用于業(yè)務表數(shù)據(jù)量大或快速增長的場景

MybatisPlus攔截器實現(xiàn)數(shù)據(jù)表分表

很多項目都會存在一些數(shù)據(jù)量很大或者數(shù)據(jù)量增加很快的業(yè)務表,由于mysql的數(shù)據(jù)量達到一定量后會影響我們的查詢效率,為了避免該類問題發(fā)生,我們需要在項目前期設計的時候針對這兩類情況做一個分表的設計。

這里的分表指的是水平拆分(只是表名不同,其余字段都一致,主鍵id不允許重復),對某一個數(shù)字取模運算做為拆分后表的后綴名,具體要分多少張表可通過自己實際的項目情況確定。

首先創(chuàng)建請求參數(shù)傳遞的一個輔助類

/**
 * 請求參數(shù)傳遞輔助類
 */
public class RequestDataHelper {
    /**
     * 請求參數(shù)存取
     */
    private static final ThreadLocal<Map<String, Object>> REQUEST_DATA = new ThreadLocal<>();

    /**
     * 設置請求參數(shù)
     *
     * @param requestData 請求參數(shù) MAP 對象
     */
    public static void setRequestData (Map<String, Object> requestData) {
        REQUEST_DATA.set(requestData);
    }

    /**
     * 獲取請求參數(shù)
     *
     * @return 請求參數(shù) MAP 對象
     */
    public static Map<String, Object> getRequestData () {
        return REQUEST_DATA.get();
    }
}

該輔助類主要作用有:

  • a.設置請求參數(shù)
  • b.將請求參數(shù)存取到線程變量中
  • c.獲取請求參數(shù)

簡單的說就是在涉及到需要分表的數(shù)據(jù)操作時,將請求參數(shù)放入線程變量中。

然后在攔截器里面獲取這個參數(shù),做特定的處理,找到我們具體要操作的那張表。

這里的請求參數(shù)大家可以把它理解成跟我們分表后的表名產生關聯(lián)的數(shù)據(jù)。

這里面的線程變量是僅在當前線程下可使用的數(shù)據(jù),與其他線程做隔離。

在本文中不做詳細解釋。

在涉及到分表的數(shù)據(jù)層操作前(Mybatisplus或者Mybatis增刪改查數(shù)據(jù)前)

將請求參數(shù)放入線程變量

RequestDataHelper.setRequestData(Collections.singletonMap("studentId", param.getStudentId()));
        LambdaQueryWrapper<StudentRecordEntity> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StudentRecordEntity::getStudentId, param.getStudentId());
        List<StudentRecordEntity> studentRecordEntityList = super.list(queryWrapper);

Mybatisplus 攔截器代碼

/**
     * Mybatis plus 攔截器
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        //動態(tài)表插件
        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> {
            // 獲取參數(shù)方法
            if (tableName.equalsIgnoreCase("t_student_record")) {
                Map<String, Object> paramMap = RequestDataHelper.getRequestData();
                long studentId= Long.parseLong(String.valueOf(paramMap.get("studentId")));
                int mod = (int) (studentId% 16);
                return tableName + "_" + mod;

            } else {
                return tableName;
            }
        });
        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
        return interceptor;
    }

這里面t_student_record表就是要拆分的表,如果有多個,在if里面寫多個。

studentId就是調用的時候傳入線程變量的請求參數(shù),對它%16就是分了16張表,根據(jù)實際業(yè)務情況,需要分多少張就把%后面的數(shù)字改為多少。

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • MYSQL根據(jù)JSON列將一行拆為多行的操作方法

    MYSQL根據(jù)JSON列將一行拆為多行的操作方法

    這篇文章主要介紹了MYSQL根據(jù)JSON列將一行拆為多行的操作方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • MySQL8.0窗口函數(shù)入門實踐及總結

    MySQL8.0窗口函數(shù)入門實踐及總結

    這篇文章主要給大家介紹了關于MySQL8.0窗口函數(shù)入門實踐及總結的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用MySQL8.0具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-06-06
  • 如何解決MySQL?this?is?incompatible?with?sql_mode=only_full_group_by問題

    如何解決MySQL?this?is?incompatible?with?sql_mode=only_full_

    MySQL的ONLY_FULL_GROUP_BY模式要求在使用GROUP?BY時,SELECT語句中引用的所有列必須在GROUP?BY子句中明確指定,或者是聚合函數(shù)的一部分,本文提供了修改SQL語句、使用聚合函數(shù)、禁用ONLY_FULL_GROUP_BY等解決方法,并強調了在禁用該模式時應評估其影響
    2024-11-11
  • MySQL中聚簇索引和非聚簇索引的區(qū)別及說明

    MySQL中聚簇索引和非聚簇索引的區(qū)別及說明

    聚簇索引決定數(shù)據(jù)物理存儲順序,每表僅一個,葉子節(jié)點存數(shù)據(jù)行;非聚簇索引獨立存儲,可多個,葉子節(jié)點存主鍵指針,聚簇索引適合主鍵查詢,范圍效率高;非聚簇需回表,維護成本低,合理選擇提升性能
    2025-08-08
  • mysql 8.0.25之取巧解決修改密碼報錯的問題

    mysql 8.0.25之取巧解決修改密碼報錯的問題

    這篇文章主要介紹了mysql8.0.25之取巧解決修改密碼報錯的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • MySQL?字符集、排序規(guī)則與查詢關系最佳實踐

    MySQL?字符集、排序規(guī)則與查詢關系最佳實踐

    MySQL查詢是否區(qū)分大小寫和重音敏感由字符集與排序規(guī)則決定,推薦使用utf8mb4字符集及utf8mb4_general_ci排序規(guī)則,本文給大家介紹MySQL字符集、排序規(guī)則與查詢關系詳解,感興趣的朋友一起看看吧
    2025-06-06
  • MySQL中日期和時間戳互相轉換的函數(shù)和方法

    MySQL中日期和時間戳互相轉換的函數(shù)和方法

    這篇文章主要介紹了MySQL中日期和時間戳互相轉換的函數(shù)和方法,本文分別講解了時間戳轉換成日期的方法和把日期轉換為時間戳的方法,需要的朋友可以參考下
    2015-06-06
  • mysql實現(xiàn)根據(jù)多個字段查找和置頂功能

    mysql實現(xiàn)根據(jù)多個字段查找和置頂功能

    在mysql中,如果要實現(xiàn)根據(jù)某個字段排序的時候,可以使用下面的SQL語句,下面為大家介紹下如何實現(xiàn)根據(jù)多個字段查找和置頂功能
    2013-11-11
  • Ubuntu配置Mysql主從數(shù)據(jù)庫

    Ubuntu配置Mysql主從數(shù)據(jù)庫

    MySQL數(shù)據(jù)庫支持數(shù)據(jù)庫的主從復制功能,因此在集群方面具有其獨特的優(yōu)勢。眾多國內外大型網(wǎng)站架構體系中,均采用了MySQL的主從數(shù)據(jù)庫配置來實現(xiàn)查詢負載、數(shù)據(jù)庫熱備等功能。本人在實際的Web項目中也涉及到這一需求,在此將如何配置實現(xiàn)做個簡單小結。
    2014-07-07
  • mysql數(shù)據(jù)庫在表中添加數(shù)據(jù)三種操作方式

    mysql數(shù)據(jù)庫在表中添加數(shù)據(jù)三種操作方式

    這篇文章主要介紹了mysql數(shù)據(jù)庫在表中添加數(shù)據(jù)三種方式,首先創(chuàng)建數(shù)據(jù)庫和表,創(chuàng)建完成后就可以進行添加數(shù)據(jù)的操作了,本文結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-08-08

最新評論

卓尼县| 琼结县| 宣威市| 永德县| 仁寿县| 从江县| 手游| 彭泽县| 临泽县| 汝南县| 锡林浩特市| 太保市| 兴仁县| 宁阳县| 武汉市| 托里县| 阜新市| 苍南县| 田林县| 剑河县| 株洲县| 武义县| 衡山县| 上犹县| 金溪县| 宝坻区| 怀来县| 赤城县| 胶南市| 米林县| 六盘水市| 日土县| 新野县| 怀宁县| 顺平县| 新余市| 蓬安县| 陆川县| 彰武县| 巫溪县| 广昌县|