开发中遇到需要查询一些表里的数据,这些数据按照一定的规则存放在不同的数据库表里,例如表名是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); //.......业务代码