TenantLineHandler
在 MyBatis Plus 中通常用于处理多租户场景。多租户是指在一个软件实例中,能够同时处理多个不同的租户数据,并且保证数据之间的隔离性。在多租户应用中,通常需要在 SQL 查询中加入额外的条件,以确保每个租户只能访问到自己的数据。
TenantLineHandler
是 MyBatis Plus 提供的一个接口,它允许开发者自定义租户 ID 的获取和插入逻辑。通过实现这个接口,你可以将租户 ID 加入到生成的 SQL 查询中,以实现数据的隔离。
下面是一个简单的 TenantLineHandler
的实现示例,以及关于其用途和作用的详细解释。
示例实现
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; | |
import com.baomidou.mybatisplus.core.toolkit.StringUtils; | |
import org.apache.ibatis.executor.statement.StatementHandler; | |
import org.apache.ibatis.mapping.BoundSql; | |
import org.apache.ibatis.reflection.MetaObject; | |
import java.sql.Connection; | |
import java.util.Properties; | |
public class CustomTenantLineHandler implements TenantLineHandler { | |
@Override | |
public Expression getTenantId(boolean where) { | |
// 这里假设我们从某个地方(如 ThreadLocal)获取租户 ID | |
String tenantId = TenantContextHolder.getCurrentTenantId(); | |
if (StringUtils.isNotBlank(tenantId)) { | |
return new LongValue(Long.valueOf(tenantId)); | |
} | |
return null; | |
} | |
@Override | |
public String getTenantIdColumn() { | |
// 返回包含租户 ID 的列名 | |
return "tenant_id"; | |
} | |
@Override | |
public boolean doTableFilter(String tableName) { | |
// 这里可以根据需要过滤掉不需要添加租户条件的表 | |
// 例如,某些公共表或系统表可能不需要租户条件 | |
return !"public_table".equals(tableName); | |
} | |
@Override | |
public void setProperties(Properties properties) { | |
// 如果需要,可以在这里设置一些配置属性 | |
} | |
} |
使用方法
在 MyBatis Plus 的配置中,你需要将这个 TenantLineHandler
的实现类注册为插件。这样,当 MyBatis Plus 生成 SQL 时,就会自动调用这个处理器来添加租户条件。
@Configuration | |
public class MybatisPlusConfig { | |
@Bean | |
public PaginationInterceptor paginationInterceptor() { | |
PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); | |
List<ISqlParser> sqlParserList = new ArrayList<>(); | |
TenantSqlParser tenantSqlParser = new TenantSqlParser(); | |
tenantSqlParser.setTenantHandler(new CustomTenantLineHandler()); | |
sqlParserList.add(tenantSqlParser); | |
paginationInterceptor.setSqlParserList(sqlParserList); | |
return paginationInterceptor; | |
} | |
} |
详细解释
- getTenantId(boolean where): 这个方法用于获取当前租户的 ID。你可以从任何你认为合适的地方获取这个 ID,比如从 ThreadLocal、SecurityContext 或者其他任何存储租户信息的地方。这个方法返回一个
Expression
对象,它代表了一个 SQL 表达式,这个表达式会被插入到生成的 SQL 查询中。在这个示例中,我们简单地将租户 ID 转换为一个 Long 类型的值。 - getTenantIdColumn(): 这个方法返回包含租户 ID 的列名。在多租户数据库中,通常会有一个专门的列来存储租户 ID,用于标识数据的归属。你需要在这里返回这个列的名字。
- doTableFilter(String tableName): 这个方法用于过滤掉不需要添加租户条件的表。有些表可能是公共的,或者不属于任何租户,因此不应该在查询时加入租户条件。你可以在这个方法中实现自己的过滤逻辑。
- setProperties(Properties properties): 这是一个可选的方法,用于设置一些配置属性。你可以在这个方法中读取配置文件中的参数,或者执行其他初始化操作。
通过实现 TenantLineHandler
接口并配置 MyBatis Plus,你可以很容易地在多租户应用中实现数据的隔离和访问控制。这样,每个租户都只能看到和操作属于自己的数据,从而保证了数据的安全性和完整性。