MybatisPlus进阶篇学习笔记(七)------动态表

原创:兜里的猫

本章目录

  • 动态表名应用场景
  • 动态表名实现
  • 注意事项

1 动态表名应用场景

动态名表在什么场景下需要使用?

举个例子:假设我们有一个应用程序,这套程序有多个公司同时使用,在各个公司同时使用的时候数据流量肯定很大,这个时候如果全部放到同一张表中,可想而知数据量的庞大。所以数据库设计的时候可以一家公司对应一张表table_001、table_002等等,分开存储, 表中的字段都是一样的,只是表名不同。

或者还可以对日志的存储进行使用,日志数据量也是很大的,可以分一个月对应一张表,比如:log_202001、log_202002等等之类的。

2 动态表名实现

动态表名还是在MybatisPlusConfiguration配置类中的分页器中实现的,代码如下:

@Configuration
@MapperScan({"com.ethan.service", "com.ethan.dao"})
public class MybatisPlusConfiguration {

@Autowired
private TableName myTableName; // 获取传入的表名后缀

private String tableName = "user"; // 需要动态修改的表名

/**
* 动态表名的实现也是基于分页器的
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();

ArrayList<ISqlParser> sqlParserList = new ArrayList<>(); // ISqlParser是sql解析器接口
DynamicTableNameParser dynamicTableNameParser = new DynamicTableNameParser(); // 动态表名解析器
Map<String, ITableNameHandler> tableNameHandlerMap = new HashMap<>();
tableNameHandlerMap.put(tableName, new ITableNameHandler() { // 选择替换user表
@Override
public String dynamicTableName(MetaObject metaObject, String sql, String tableName) {
return tableName + myTableName.getName();
}
});

dynamicTableNameParser.setTableNameHandlerMap(tableNameHandlerMap);
sqlParserList.add(dynamicTableNameParser);
paginationInterceptor.setSqlParserList(sqlParserList); // 配置到分页器中

return paginationInterceptor;
}
}

其中TableName是我自定义的一个类用于传递拼接的表后缀,类中只有一个name属性,生成下get/set方法。然后在Springboot启动类中加载该类,使得上下文都能获取到。

@SpringBootApplication
@MapperScan("com.ethan.dao")
public class MpHighApplication {

public static void main(String[] args) {
SpringApplication.run(MpHighApplication.class, args);
}

@Bean
public TableName myTableName() {
return new TableName();
}

}

然后我随便测试一个方法selectUser,测试之前先复制一份数据库中的user表,命名为user_2020。

image
image

从图中可以看到我们设置表名后缀之后,控制台打印的sql语句中自动为我们拼接好表名user_2020,并使用该表进行相关操作。

3 注意事项

  • 如果自定义规则的表名返回为空,即下面这个dynamicTableName重写类返回null,则会按照实际的表名来处理。
@Override
public String dynamicTableName(MetaObject metaObject, String sql, String tableName) {
return tableName + myTableName.getName();
}
  • 如果配置了sql过滤器,过滤了特定的sql,则也会按照实际表名来处理。
在mySelectUsers接口第一行加上myTableName.setName("_2020"); 然后进行测试。
image
image
//  或者使用@SqlParser注解也一样
@SqlParser(filter = true)
@Select("select * from user ${ew.customSqlSegment}")
List<User> mySelectUsers(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
兜里的猫 小程序

dvdf

欢迎访问博客网页版:www.wldeer.com

评论

兜里的猫 : 是md
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×