MyBatis-Plus实现动态表名
Posted 不想做咸鱼的王富贵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis-Plus实现动态表名相关的知识,希望对你有一定的参考价值。
MyBatis-Plus实现动态表名
MyBatis实现方法如下现在要用MyBatis-Plus 实现
<select id="getList" resultType="com.wys.entity.User">
SELECT *
FROM $tableName
</select>
MyBatis-Plus官网说明
MyBatis-Plus版本
1、添加MyBatis-Plus依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
MyBatis-Plus配置
2、添加MyBatis-Plus配置,利用拦截器获取到表名给替换
@Configuration
public class MybatisPlusConfig
static List<String> tableList()
List<String> tables = new ArrayList<>();
//伪表名 可以为任意字符串 建议设置复杂度 避免重复 tables.add("C55EA8171877E962E08DFF63AA3678841");
tables.add("TestUser");
return tables;
//拦截器,获取到表名给替换
@Bean
public MybatisPlusInterceptor dynamicTableNameInnerInterceptor()
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) ->
String newTable = null;
for (String table : tableList())
newTable = RequestDataHelper.getRequestData(table);
if (table.equals(tableName) && newTable!=null)
tableName = newTable;
break;
return tableName;
);
interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
return interceptor;
如果上面的拦截器不生效可以使用下面这个
https://www.cnblogs.com/aaacarrot/p/16995126.html
@Configuration
@AutoConfigureAfter(PageHelperAutoConfiguration.class)
public class MybatisPlusConfig
static List<String> tableList()
List<String> tables = new ArrayList<>();
//表名
tables.add("C55EA8171877E962E08DFF63AA3678841");
return tables;
//拦截器,获取到表名给替换
// @Bean
// public MybatisPlusInterceptor dynamicTableNameInnerInterceptor()
// MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
// dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) ->
// String newTable = null;
// for (String table : tableList())
// newTable = RequestDataHelper.getRequestData(table);
// if (table.equals(tableName) && newTable!=null)
// tableName = newTable;
// break;
//
//
// return tableName;
// );
// interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
// return interceptor;
//
@Autowired
private List<SqlSessionFactory> sqlSessionFactoryList;
@PostConstruct
public void addMyInterceptor()
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
dynamicTableNameInnerInterceptor.setTableNameHandler((sql, tableName) ->
String newTable = null;
for (String table : tableList())
newTable = RequestDataHelper.getRequestData(table);
if (table.equals(tableName) && newTable!=null)
tableName = newTable;
break;
return tableName;
);
interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
for (SqlSessionFactory sqlSessionFactory : sqlSessionFactoryList)
sqlSessionFactory.getConfiguration().addInterceptor(interceptor);
请求参数传递辅助类
3、创建请求参数传递辅助类
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();
使用
4、在程序中使用,注意如果实际表名与实体类与不同,可先在实体类类注明表名@TableName(“TestUser”)
@GetMapping("/listUser")
public void listUser()
RequestDataHelper.setRequestData(new HashMap<String, Object>()
put("kfafkasfaskfasjfkasf", "user_2018");
);
Integer age=2018;
User user=new User();
List list = userMapper.getList(user);
// User user_2019 = userMapper.findById("user_2019", 2019);
System.out.println(list);
System.out.println("-------------");
// System.out.println(user_2019);
RequestDataHelper.setRequestData(new HashMap<String, Object>()
put("kfafkasfaskfasjfkasf", "user_2019");
);
List lis2 = userMapper.getList(user);
System.out.println(lis2);
System.out.println("-------------");
结果:
Mybatis中将参数作为查询的表名或字段,实现动态操作
今天在一个功能模块时,想要实现传入字段名来进行查询,遇到了些问题,网上查了很多,最后解决如下:
例如,在SQL映射文件中,我想要实现的查询:
1 <select id="queryAllTitle" parameterType="String" resultType="org.work.entity.UserFile" > 2 select * from file where ${modelName} = ‘1‘ 3 </select>
(1)、 注意要将#{..}改成${...},因为#{}输出结果会加引号,而${}直接输出值
(2)、 要给接口函数的的值前加上注解@param(value=“....”)
以上是关于MyBatis-Plus实现动态表名的主要内容,如果未能解决你的问题,请参考以下文章
mybatis-plus小技能: 分表策略(按年分表和按月分表)
springboot~mybatis-plus的DynamicTableNameInnerInterceptor实现分表
springboot2.x+MyBatis-Plus+mysql5.7 动态拼接sql语句 分页查询 自定义sql 查询条件 分组 排序
springboot2.x+MyBatis-Plus+mysql5.7 动态拼接sql语句 分页查询 自定义sql 查询条件 分组 排序