Skip to content

玩转运算符

v3.3.0 起,Bean Searcher 的 字段运算符 支持高度扩展与自定义。

添加新的字段运算符

在 SpringBoot / Grails 项目中,若使用 bean-searcher-boot-starter 依赖,则只需实现 FieldOp 接口,并将之声明为一个 Spring Bean 即可。

例如,定义一个名为 IsOne 的字段运算符:

java
public class IsOne implements FieldOp {
    @Override
    public String name() { return "IsOne"; }
    @Override
    public boolean isNamed(String name) {
        return "io".equals(name) || "IsOne".equals(name);
    }
    @Override
    public boolean lonely() { return true; } // 返回 true 表示该运算符不需要参数值
    @Override
    public List<Object> operate(StringBuilder sqlBuilder, OpPara opPara) {
        SqlWrapper<Object> fieldSql = opPara.getFieldSql();
        sqlBuilder.append(fieldSql.getSql()).append(" = 1");
        return fieldSql.getParas();
    }
}

接着将其声明为 Spring 的 Bean:

java
@Bean
public FieldOp myOp() { return new IsOne(); }

然后就可以使用它了:

  • /user/index ? age-op=io (套用 起步 > 使用 章节中的例子)
  • /user/index ? age-op=IsOne (等效请求)
  • 或者在参数构建器里使用:
java
Map<String, Object> params = MapUtils.builder()
        .field(User::getAge).op(IsOne.class)    // 推荐写法,since v3.3.1
        .field(User::getAge).op(new IsOne())    // 等效写法,since v3.3.0
        .field(User::getAge).op("io")           // 等效写法
        .field(User::getAge).op("IsOne")        // 等效写法
        .build();
List<User> list = beanSearcher.searchList(User.class, params);

它们最后执行的 SQL 中将会有这样的一个条件:

sql
... where (age = 1) ...

定义全新运算符体系

如果你 不喜欢 Bean Searcher 内置的一套字段运算符,你可以轻松的将它们 都换掉

SpringBoot / Grails 项目(使用 bean-searcher-boot-starter 依赖)

只需声明一个 FieldOpPool 类型的 Bean 即可:

java
@Bean
public FieldOpPool myFieldOpPool() { 
    List<FieldOp> ops = new ArrayList<>();
    // 添加自己喜欢的字段运算符全部 add 进去即可
    // 这里没添加的运算符将不可用
    ops.add(new MyOp1());
    ops.add(new MyOp2());
    ops.add(new MyOp3());
    // ...
    return new FieldOpPool(ops); 
}

如果你只是想添加一个自己的运算符,系统内置的运算符也想用,则看上一章节就可以了。

非 Boot 的 Spring 项目

xml
<bean id="fieldOpPool" class="cn.zhxu.bs.FieldOpPool">
    <property name="fieldOps">
        <list>
            <bean class="com.demo.MyOp1">
            <bean class="com.demo.MyOp2">
            <bean class="com.demo.MyOp3">
            <!-- 需要使用的自定义运算符都放在这里,也可以添加 Bean Searcher 自带的运算符 -->
            <bean class="cn.zhxu.bs.operator.Equal">
        </list>
    </property>
</bean>
<bean id="paramResolver" class="cn.zhxu.bs.implement.DefaultParamResolver">
    <property name="fieldOpPool" ref="fieldOpPool" />
</bean>
<bean id="mapSearcher" class="cn.zhxu.bs.implement.DefaultMapSearcher">
    <!-- 省略其它属性配置,BeanSearcher 检索器也同此配置 -->
    <property name="paramResolver" ref="paramResolver" />
</bean>

其它项目

java
List<FieldOp> ops = new ArrayList<>();
// 添加自己喜欢的字段运算符全部 add 进去即可
ops.add(new MyOp1());   
ops.add(new MyOp2());
ops.add(new MyOp3());
FieldOpPool fieldOpPool = new FieldOpPool(ops);
DefaultParamResolver paramResolver = new DefaultParamResolver();
paramResolver.setFieldOpPool(fieldOpPool);
MapSearcher mapSearcher = SearcherBuilder.mapSearcher()
        // 省略其它属性配置,BeanSearcher 检索器也同此配置
        .paramResolver(paramResolver)
        .build();

基于 Apache 许可发布