首页 > 其他分享 >记录一次使用MP的TableNameHandler实现简单的分表需求

记录一次使用MP的TableNameHandler实现简单的分表需求

时间:2023-09-27 16:27:00浏览次数:41  
标签:TableNameHandler String tableName DynamicTableNameHolder MP 表名 分表 public

1.使用场景

  • MybatisPlus3.4.0及以上版本
  • 有简单的分表需求,项目不允许嵌入其他分库分表框架

2.具体使用

2.1 TableNameHandler介绍

TableNameHandler是MP提供的一个动态表名处理接口,其原理是通过MP拓展的拦截器(DynamicTableNameInnerInterceptor)中动态修改解析完成后的sql中的表名。

2.2 具体使用

2.2.1 实现TableNameHandler接口

/**
 * 动态表名处理器
 * 使用完需要手动调用清除
 */
public class DynamicTableNameHolder implements TableNameHandler {

    private static final ThreadLocal<String> tableNameTL = ThreadLocal.withInitial(() -> StringUtil.EMPTY);

    private String getDynamicTableName(String tableName) {
        //如果有设置表名,则使用配置的表名
        if (StringUtil.isNotBlank(tableNameTL.get())) {
            return tableNameTL.get();
        } else {
            return tableName;
        }
    }

    @Override
    public String dynamicTableName(String sql, String tableName) {
        // 在这里根据业务逻辑决定要使用的表名
        String dynamicTableName = getDynamicTableName(tableName);
        return dynamicTableName;
    }

    public static void setTableName(String tableName) {
        tableNameTL.set(tableName);
    }

    public static void remove() {
        tableNameTL.remove();
    }
}

2.2.2 添加DynamicTableNameHolder 到拦截器

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        HashMap<String, TableNameHandler> map = new HashMap<String, TableNameHandler>();

        //这里为不同的表设置对应表名处理器
        map.put("table_name", new DynamicTableNameHolder());

        dynamicTableNameInnerInterceptor.setTableNameHandlerMap(map);
        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
        return interceptor;
    }

2.2.3配置对应的mapper与entity

@TableName("table_name")
public class Demo{
  ....
}
public interface JlinkDataMapper extends BaseMapper<Demo> {

}

2.2.3代码中使用

    public void getData() {
        try {
            //设置需要操作的表名
            DynamicTableNameHolder.setTableName("table_name2");
            //查询数据
            List<Demo> datas = demoMapper.selectList(null);
            //do something
        } finally {
            //需要手动清空
            DynamicTableNameHolder.remove();
        }
    }

在上面的代码中,demoMapper原本生成的sql里查询的表名是table_name,但经过DynamicTableNameHolder 处理,会被替换成table_name2,这样就简单实现了一个简单的分表需求。

标签:TableNameHandler,String,tableName,DynamicTableNameHolder,MP,表名,分表,public
From: https://www.cnblogs.com/ziye-1/p/17732973.html

相关文章

  • python numpy 计算1-10000 平方 立方 执行效率
    importsysfromdatetimeimportdatetimeimportnumpyasnpimportmatplotlib.pyplotasplt#使用NumPy计算defnumpysum(n):a=np.arange(n)**2b=np.arange(n)**3c=a+breturnc#使用Python计算#并这里由于源码为Python2的,python3中rang......
  • python numpy 数组操作
          ......
  • 报错:Invalid bound statement (not found): org.example.mapper.ZoneInfoMapper.getA
    错误org.apache.ibatis.binding.BindingException:Invalidboundstatement(notfound):org.example.mapper.ZoneInfoMapper.getAll解决方法<resources><resource><directory>src/main/java</directory>&......
  • 解析Prompt自然语言处理的关键因素
    随着人工智能的飞速发展,自然语言处理技术日新月异,各种模型层出不穷。然而,作为一名关注该领域的观察者,我不得不坦率地说,您的模型可能并没有完全理解所给的prompt。在此,我将着重讨论这一现象,并对“prompt”的含义和重要性进行深入剖析。首先,我们来解析“prompt”这个词。在英文中,“p......
  • 用简单Prompt生成高质量图像
    随着技术的不断发展,人工智能领域也在不断创新和突破。其中,图像生成技术已经成为了人工智能领域中的一颗璀璨明星。在过去的几年中,文生图技术取得了长足的进步,但是也存在着一些问题,最为常见的就是生成的图像质量不高,以及所需的文生图Prompt往往冗长且难以编写。但是,随着LLM增强扩散......
  • prompt
    prompt并不是一件简单的事情,它可以包括多个阶段:设计、实现、评估、细化、迭代、验证、部署和维护本文旨在汇总prompt的各种使用方式 常规操作写作Prompt·请帮我撰写一篇500字的文章,介绍机器学习的发展历史。采用通俗易懂的语言,适合高中生阅读。·你是一个旅游博......
  • Android Sample 之 Tab 和 Navigation
    Sample中,Tab在上,Navigation在下,后者有图标。不理解为什么用不同的名称。之前没有区分,混淆模糊。 搜索发现有人在stackoverflow问。有人答曰:区别在于 Tab是同一主题,而 Navigation可用于不相关的主题。 Tabsareconsideredtoberelatedtoeachotherwhere......
  • 【流行前沿】Text + Sketch Image Compression at Ultra Low Rates
    今天分享一篇7月挂在arxiv上的文章,研究的是用生成式网络进行图片压缩。近十年来,用图片压缩的主流方法是神经网络来做。17年左右流行用带有量化的autoencoder来做图片压缩,同时训练的指标也是常用的distortionmetric,比如MSE,PSNR,MS-SSIM等等。但是这些方法在低比特率的时候通常有......
  • python numpy所有的数据类型 查看 np.sctypeDict
    >>>np.sctypeDict{'?':<class'numpy.bool_'>,0:<class'numpy.bool_'>,'byte':<class'numpy.int8'>,'b':<class'numpy.int8'>,1:<class'num......
  • resttemplate exchange方法,两种用法结果不一样
    有问题的代码importorg.springframework.http.*;importorg.springframework.web.client.RestTemplate;importjava.net.URI;importjava.util.Arrays;/***<p>Title:</p>*<p>Description:</p>**@authorzhanghong*@date2023/9/27*......