开发中遇到需要查询一些表里的数据,这些数据按照一定的规则存放在不同的数据库表里,例如表名是table_name+月份 table_name_2024_05,table_name_2024_04这样,这些表的结构都相同。
网上找了一些动态修改实体对应数据库表名的方法,操作相对复杂而且跟mybatisplus的版本有关。自己想出一个相对简单的解决方案,思路如下:
1、数据库里创建一个视图table_name_v 对应表table_name(那一批表的结构都一样对应哪一个都可以)
2、在查询数据之前重新建立视图,修改视图对应的表。这样就完成了视图不变,但是查询的内容是根据业务需求对应的表里的数据。
实体代码:
@TableName(value = "table_name_v")
public class TableNameV extends BaseEntity {
private static final long serialVersionUID = 1L;
@TableId
private Integer id;
private String Name;
mapper代码(关键)
public interface TableNameVMapper extends BaseMapper<TableNameV> {
@Select(" create or replace view table_name_v as " +
" select id, name from ${tableName}" )
void createView(String tableName);
server代码
public class TableNameVServiceImpl implements ITableNameVService {
@Autowired
TableNameVMapper tableNameVMapper;
@Override
public Map selectList(TableNameV tableNameV) {
id = "2024_05";
String tableName = "table_name_"+id;
//动态创建视图 指向对应的分表
tableNameVMapper.createView(tableName);
//.......业务代码