MyBatis-Plus 支持动态表名的功能,可以通过实现 TableNameHandler 接口来设置动态表名。以下是一个简单的示例:
- 创建 
DynamicTableNameHandler 类实现 TableNameHandler 接口: 
import com.baomidou.mybatisplus.extension.parsers.ITableNameHandler;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.StringValue;
 
import java.util.Map;
 
public class DynamicTableNameHandler implements ITableNameHandler {
 
    @Override
    public Expression dynamicTableName(String sql, String tableName, Map<String, Object> parameters) {
        // 这里可以根据实际需求从 parameters 中获取动态表名的条件
        // 示例:根据用户ID来动态选择表
        Object userId = parameters.get("userId");
        if (userId != null) {
            // 返回一个新的表名表达式
            return new StringValue("dynamic_" + userId.toString());
        }
        return new StringValue(tableName);
    }
}
- 配置 
DynamicTableNameHandler: 
在 MyBatis-Plus 的配置中注册 DynamicTableNameHandler:
import com.baomidou.mybatisplus.core.parser.ISqlParser;
import com.baomidou.mybatisplus.extension.parsers.DynamicTableNameParser;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import java.util.ArrayList;
import java.util.List;
 
@Configuration
public class MybatisPlusConfig {
 
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        List<ISqlParser> sqlParserList = new ArrayList<>();
        sqlParserList.add(new DynamicTableNameParser(new DynamicTableNameHandler()));
        paginationInterceptor.setSqlParserList(sqlParserList);
        return paginationInterceptor;
    }
}
- 使用动态表名:
 
在 Mapper 中引用动态表名,MyBatis-Plus 会自动调用 DynamicTableNameHandler 来处理:
public interface UserMapper extends BaseMapper<User> {
    // 这里的表名将会根据 DynamicTableNameHandler 中的逻辑动态改变
}
确保在执行 SQL 时提供足够的参数(如 userId),以便 DynamicTableNameHandler 可以正确地返回动态表名。