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
可以正确地返回动态表名。