IT袋

当前位置:主页 > 经验教程 > 建站编程 >

MybatisPlus设置动态表名

MybatisPlus设置动态表名

时间:2024-01-27 13:18:57 来源:IT袋 作者:马勇
导读:MybatisPlus设置动态表名,小编为你讲解MybatisPlus设置动态表名的电脑小知识,具体介绍如下: 对于一些数据量比较大的表,为了提高查询性能,我们一般将表拆分成多张表,常见的是根据数据量,

MybatisPlus设置动态表名

小编为你讲解MybatisPlus设置动态表名的电脑小知识,具体介绍如下:

对于一些数据量比较大的表,为了提高查询性能,我们一般将表拆分成多张表,常见的是根据数据量,按年分表或者按月分表;

分表虽然太高了查询性能,但是在查询的时候,如何才能查询执行分表数据呢,这里整理了一下,使用MybatisPlus设置动态表名的功能实现。

MybatisPlus设置动态表名

增加MyBatisPlus配置类

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        HashMap<String, TableNameHandler> map = new HashMap<>();
        map.put("my_test", (sql, tableName) -> DynamicTableTreadLocal.INSTANCE.getTableName());
        
        // 如果存在多张分表,则在下面添加多条记录
        dynamicTableNameInnerInterceptor.setTableNameHandlerMap(map);
        mybatisPlusInterceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
        return mybatisPlusInterceptor;
    }
}

方法解析

MybatisPlusInterceptor

该插件是核心插件,目前代理了Executor#queryExecutor#updateStatementHandler#prepare方法

方法属性
private List<InnerInterceptor> interceptors = new ArrayList<>();
InnerInterceptor接口

目前已有的功能:

  • 自动分页:PaginationInnerInterceptor
  • 多租户:TenantLineInnerInterceptor
  • 动态表名:DynamicTableNameInnerInterceptor
  • 乐观锁:OptimisticLockerInnerInterceptor
  • sql 性能规范:IllegalSQLInnerInterceptor
  • 防止全表更新与删除:BlockAttackInnerInterceptor

注意事项

使用多个功能需要注意顺序关系,建议使用如下顺序

  • 多租户,动态表名
  • 分页,乐观锁
  • sql 性能规范,防止全表更新与删除

总结: 对 sql 进行单次改造的优先放入,不对 sql 进行改造的最后放入

增加本地动态线程设置表名

public enum DynamicTableTreadLocal {
    INSTANCE;
    private ThreadLocal<String> tableName = new ThreadLocal<>();
    public String getTableName() {
        return tableName.get();
    }
    public void setTableName(String tableName) {
        this.tableName.set(tableName);
    }
    public void remove() {
        tableName.remove();
    }
}

相关阅读

  • 电脑快捷操作:全选快捷键全面解析

    电脑快捷操作:全选快捷键全面解析

    今天小编详解电脑快捷操作的相关知识,接下来就是全面介绍。 在日常的电脑操作中,快捷键可以大大提高我们的工作效率。 其中,全选快捷键是最常用的一种,本文将详细介绍电脑上全选的

  • 怎么注册自己的网站域名账号 申请域名网址的流程

    怎么注册自己的网站域名账号 申请域名网址的流程

    一篇很详细的教程是关于怎么注册自己的网站域名账号和申请域名网址的流程的IT知识,下面为详细的介绍。 注册域名的一般流程是什么?个人申请域名流程需要知道哪些? 一、域名注册流程

  • 服务器怎么安装iis iis的安装及web服务器配置

    服务器怎么安装iis iis的安装及web服务器配置

    关于这个服务器怎么安装iis和iis的安装及web服务器配置方面的介绍,具体内容如下: 大家好,我是老盖,感谢观看本篇文章,本文做的也有视频,也可以看我发布的视频。 今天给大家讲一下安

  • 什么是dmz网络 DMZ网络的定义与解析

    什么是dmz网络 DMZ网络的定义与解析

    今天小编介绍什么是dmz网络的相关知识,下面为详细的介绍。 DMZ,全名为Demilitarized Zone,是计算机网络中的一个重要概念。 它通常是一个位于内部网络和外部网络之间的中立区域,充当了网络