动态查询:
需求:
有许多同类型的表(表名前缀相同,都是类似于xxxx202209 --> 公共前缀+年月信息),由于数据量庞大按月份分成了多张表,我们需要根据前端请求中携带的年月信息去查询不同的表
实现方案:
使用拦截器,(按照我目前的理解。。)对数据库查询语句进行拦截,当查询表名为公共前缀时,就获取请求头传来的日期信息,拼接成完整的表名,去对应的表中查询!
示例代码:
package com.xxx.springbootinit.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Map;
/**
* @author miemie
* @since 2018-08-10
*/
@Configuration
@MapperScan("com.nrec.springbootinit.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> {
if("这里填哪些相同结构表名的公共前缀".equals(tableName)) {
//这里,我在controller中,用户请求时,就将date信息存放在请求参数传递辅助类的 map 中,因此在这里可以获取
String dateSuf = RequestDataHelper.getRequestData("date");
return "公共前缀" + dateSuf;
}else {
//如果不是我要查询的表,那么就还是按原来的表名查询
return tableName;
}
});
interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
return interceptor;
}
}
package com.xxx.springbootinit.config;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import java.util.Map;
/**
* 请求参数传递辅助类
*/
public class RequestDataHelper {
/**
* 请求参数存取
*/
private static final ThreadLocal<Map<String, Object>> REQUEST_DATA = new ThreadLocal<>();
/**
* 设置请求参数
*
* @param requestData 请求参数 MAP 对象
*/
public static void setRequestData(Map<String, Object> requestData) {
REQUEST_DATA.set(requestData);
}
/**
* 获取请求参数
*
* @param param 请求参数
* @return 请求参数 MAP 对象
*/
public static <T> T getRequestData(String param) {
Map<String, Object> dataMap = getRequestData();
if (CollectionUtils.isNotEmpty(dataMap)) {
return (T) dataMap.get(param);
}
return null;
}
/**
* 获取请求参数
*
* @return 请求参数 MAP 对象
*/
public static Map<String, Object> getRequestData() {
return REQUEST_DATA.get();
}
}
//controller层示例接口:
@GetMapping("/query")
public ResultDTO query(@RequestParam("date")String date){
RequestDataHelper.setRequestData(new HashMap<String, Object>() {{
put("date", date);}});
//继续写业务。。。
}