首页 > 其他分享 >动态表名插件

动态表名插件

时间:2022-10-01 21:38:11浏览次数:81  
标签:插件 return name email ---- user 表名 动态 id

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.6.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.18</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.21.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
  • 配置类
@Configuration
@MapperScan("org.example.demo17.mapper")
public class MybatisPlusConfig {

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) -> {
// 获取参数方法
Map<String, Object> paramMap = RequestDataHelper.getRequestData();
paramMap.forEach((k, v) -> System.err.println(k + "----" + v));

String year = "_2018";
int random = new Random().nextInt(10);
if (random % 2 == 1) {
year = "_2019";
}
return tableName + year;
});
interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
// 3.4.3.2 作废该方式
// dynamicTableNameInnerInterceptor.setTableNameHandlerMap(map);
return interceptor;
}
}
  • 请求参数传递辅助类
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();
}
}
  • 实体类
@Data
@Accessors(chain = true)
public class User {
private Long id;
private String name;
private Integer age;
private String email;

}
  • 测试
@SpringBootTest
class DynamicTableNameTest {

@Resource
private UserMapper userMapper;

@Test
void test() {
RequestDataHelper.setRequestData(new HashMap<String, Object>() {{
put("id", 123);
put("hello", "tomcat");
put("name", "汤姆凯特");
}});
for (int i = 0; i < 6; i++) {
User user = userMapper.selectById(1);
System.err.println(user.getName());
}
}
}
  • 控制台打印
name----汤姆凯特
id----123
hello----tomcat
SELECT id,name,age,email FROM user_2018 WHERE id=?
1(Integer)
Jone

name----汤姆凯特
id----123
hello----tomcat
SELECT id,name,age,email FROM user_2018 WHERE id=?
Parameters: 1(Integer)
Jone

name----汤姆凯特
id----123
hello----tomcat
Preparing: SELECT id,name,age,email FROM user_2019 WHERE id=?
1(Integer)
Jack

name----汤姆凯特
id----123
hello----tomcat
SELECT id,name,age,email FROM user_2019 WHERE id=?
1(Integer)
Jack

name----汤姆凯特
id----123
hello----tomcat
SELECT id,name,age,email FROM user_2019 WHERE id=?
1(Integer)
Jack

name----汤姆凯特
id----123
hello----tomcat
SELECT id,name,age,email FROM user_2019 WHERE id=?
1(Integer)
Jack



标签:插件,return,name,email,----,user,表名,动态,id
From: https://blog.51cto.com/chniny/5728438

相关文章

  • 恶意代码分析 动态行为分析 Lab3-1
    Lab3-1使用动态分析基础技术来分析lab03-01.exe 目录Lab3-11.找出这个恶意代码的导入函数与字符串列表2.这个恶意代码在主机上的感染迹象特征是什么3.这个恶意代码......
  • 【动态规划】背包问题----分组背包
    题目描述acwing分组背包要点1.每组物品有若干个,同一组内的物品最多只能选一个2.总体积不超过V3.总价值最大分析状态计算用v[i][j]表示第i组的第j个物品的体积,w[i......
  • 动态规划算法
    应用实例有一个背包,容量为4磅,现在将如下商品装入背包,要求装入的背包的总价值最大,并且重量不超出,且物品不能重复#当前为01背包#如果为完全背包则放入物品可重复简介思路分......
  • 【动态规划】背包问题----完全背包
    题目描述acwing完全背包要点1.每种物品可选无数次2.总体积不超过V3.总价值最大分析按照第i个物品选几个将集合进行划分第i种物品1件物品都不选f[i-1][j]第i......
  • VSCode编写博客插件
    @目录前言MarkdownToolsMarkdownPreviewEnhanced博客园Cnblogs客户端插入图片一键发布前言在编写博客的道路上面,几经波折,以前写博客,都是直接使用CSDN或者博客园在线编......
  • graylog 插件模型之PluginModule
    graylog的PluginModule可以简化graylog插件的开发,方便我们进行扩展参考功能类结构从下图可以看出是依赖了guice进行的包装,代码中好多都是支持依赖PluginModule开......
  • 【动态规划】背包问题----01背包
    题目描述acwing01背包要点1.每件物品只能使用一次2.总体积不超过V3.总价值最大分析按照集合划分最后一个不选i代表要从1到i-1中选择物品,并且其体积不超......
  • Even Number Addicts - 题解【动态规划/记忆化搜索】
    题面本题是CodeforcesGlobalRound22的C题。原题链接见:C.EvenNumberAddicts。下面搬运一下题面:DescriptionAliceandBobareplayingagameonasequence\(a_......
  • nonebot2插件入门-你的第一个机器人插件(发送文字消息)
    机器人需要各种插件来实现各种功能,只有个机器人框架是不够的。......
  • vue中class和style动态绑定
    使用v-bind指令可以给元素动态绑定class与style属性。1、动态绑定class的三种方式①直接绑定②绑定对象语法:{key(类名):value(布尔值)}③绑定数组③三元运算符来......