public class DynamicTableNameOnBuHelper {

    private static final ThreadLocal<Map<String, LocalDateTime>> DYNAMIC_TABLE_DATA = new ThreadLocal<>();

    public static void setDynamicTableData(Map<String, LocalDateTime> dynamicTableData) {
        DYNAMIC_TABLE_DATA.set(dynamicTableData);
    }

    public static void setDynamicTableData(LocalDateTime localDateTime) {
        DYNAMIC_TABLE_DATA.set(new HashMap<String, LocalDateTime>() {
            {put("", localDateTime);}
        });
    }


    public static <T> T getRequestData(String param) {
        Map<String, LocalDateTime> dataMap = getDynamicTableData();
        if (CollectionUtils.isNotEmpty(dataMap)) {
            return (T) dataMap.get(param);
        }
        return null;
    }

    public static Map<String, LocalDateTime> getDynamicTableData() {
        return DYNAMIC_TABLE_DATA.get();
    }

    public static void clear() {
        DYNAMIC_TABLE_DATA.remove();
    }
}
@Configuration
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        TableNameHandler tableNameHandler = (sql, tableName) -> {
            try {
                Map<String, LocalDateTime> tableData = DynamicTableNameOnTimeHelper.getDynamicTableData();
                if (tableData == null) {
                    return tableName;
                }
                LocalDateTime tableNameTime = null;
                if (tableData.containsKey(tableName)) {
                    tableNameTime = tableData.get(tableName);
                }
                else if (tableData.size() >= 1) {
                    tableNameTime = tableData.get("");
                }
                if (tableNameTime == null) {
                    return tableName;
                }

                String timeStr = tableNameTime.format(DateTimeFormatter.ofPattern("yyyy_MM"));
                return tableName + "_" +timeStr;
            }
            finally {
                DynamicTableNameOnTimeHelper.clear();
            }
        };
        Map<String, TableNameHandler> tableNameHandlerMap = Maps.newHashMap();
        tableNameHandlerMap.put("douyin_live", tableNameHandler);
        dynamicTableNameInnerInterceptor.setTableNameHandlerMap(tableNameHandlerMap);
        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
        // 3.4.3.2 作废该方式
        // dynamicTableNameInnerInterceptor.setTableNameHandlerMap(map);
        return interceptor;
    }

测试一下:

  @GetMapping("/info")
    public BaseResponse<?> info() {
        DynamicTableNameOnTimeHelper.setDynamicTableData(LocalDateTime.now());
        Entity entity = mapper.selectById(1);
        System.err.println(entity);

        // 自己去观察打印 SQL 目前随机访问 user_2018  user_2019 表
        for (int i = 0; i < 6; i++) {

        }
      return BaseResponse.success();
    }

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐