跳到主要内容

自定义规则

当 dbVisitor 内置规则无法满足需要时,可以通过实现 SqlRule 接口来拓展自定义规则。

实现步骤

1. 实现 SqlRule 接口
import net.hasor.dbvisitor.dynamic.QueryContext;
import net.hasor.dbvisitor.dynamic.SqlArgSource;
import net.hasor.dbvisitor.dynamic.SqlBuilder;
import net.hasor.dbvisitor.dynamic.rule.SqlRule;
import net.hasor.dbvisitor.internal.OgnlUtils;
import net.hasor.cobble.StringUtils;

public class MyRule implements SqlRule {
@Override
public boolean test(SqlArgSource data, QueryContext context, String activeExpr) {
// activeExpr 为 @{规则名, 激活条件, 规则内容} 中的"激活条件"
// 返回 true 表示该规则应该执行
return StringUtils.isBlank(activeExpr) || Boolean.TRUE.equals(OgnlUtils.evalOgnl(activeExpr, data));
}

@Override
public void executeRule(SqlArgSource data, QueryContext context,
SqlBuilder sqlBuilder, String activeExpr, String ruleValue) {
// ruleValue 为 @{规则名, 激活条件, 规则内容} 中的"规则内容"
// 通过 sqlBuilder 拼接生成的 SQL 片段
sqlBuilder.appendSql("my_custom_value");
}
}
2. 注册规则(二选一)
// 方式 1:通过 Configuration 注册(推荐)
Configuration config = new Configuration();
config.addSqlRule("myrule", new MyRule());

// 方式 2:注册到全局默认注册表
RuleRegistry.DEFAULT.register("myrule", new MyRule());
3. 使用规则
select * from users where id = @{myrule, true, xxxx}

接口说明

SqlRule 接口定义了两个方法:

方法说明
test(data, context, activeExpr)判断规则是否应执行。返回 false 时整个 @{...} 会被跳过。
executeRule(data, context, sqlBuilder, activeExpr, ruleValue)执行规则逻辑,通过 sqlBuilder 拼接 SQL 片段和参数。

参数解析规则@{ruleName, activeExpr, ruleValue} 中第一个逗号前为规则名,第二个逗号前为 activeExpr,之后的所有内容为 ruleValue

提示

规则名不区分大小写,注册为 "myrule" 的规则可以通过 @{MyRule}@{MYRULE} 等方式调用。