mybatis-plus动态插库(相同的表结构,根据变量特性动态操作表)
适用场景
如果单表的数据压力过大,那么必定需要分表分库进行操作,例如:
1.我们记录系统的日志,日志信息过大,为了减轻数据库单表的压力
我们必定要对其进行分表,可根据月份,业务名进行分表
例如:日志表-1月 ,日志表-2月,日志表3月
具体代码
1.具体工具
@Configuration
@Slf4j
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser();
dynamicTableNameParser.setTableNameHandlerMap(new HashMap<String, ITableNameHandler>(2) {{
put(“T_DECLARE_POWER_VALUE_GENERAL”, (metaObject, sql, tableName) -> {
// 获取传入参数 year,如果有的话做为后缀,没有的话则使用当前年份作为后缀
Object param = getParamValue(“orgCode”, metaObject);
if(null!=param){
log.info(“电量保存至-》》》”+String.valueOf(param)+“库”);
return tableName + “_” + String.valueOf(param);
}
log.info(“电量保存至-》》》备用库”);
return tableName;
});
}});
paginationInterceptor.setSqlParserList(Collections.singletonList(dynamicTableNameParser));
return paginationInterceptor;
}
/**
* 获取参数值
*/
private Object getParamValue(String title, MetaObject metaObject){
//获取参数
Object originalObject = metaObject.getOriginalObject();
JSONObject originalObjectJSON = JSON.parseObject(JSON.toJSONString(originalObject));
JSONObject boundSql = originalObjectJSON.getJSONObject(“boundSql”);
try {
JSONObject parameterObject = boundSql.getJSONObject(“parameterObject”);
return parameterObject.get(title);
}catch (Exception e) {
return null;
}
}
逻辑步骤:
拦截执行的sql,获取标注的入参,如果当前执行的sql中包含这个参数则
走不通的表进行操作(增删改查)
2.具体代码:以组织信息作为拦截条件,进入不同组织表(表结构一致)
3.具体表名
表名:原表名_orgCode1,原表名_orgCode2,原表名_orgCode3