条件构造器

郭胜凯2025/11/21

Smart Mybatis的条件构造器允许你以编程方式构建复杂的SQL查询条件,而无需手动编写SQL语句。通过条件构造器,你可以动态地添加各种查询条件, 如等于不等于大于小于模糊匹配等,从而实现灵活的数据查询。

建议

但在实际开发过程中, 我们不建议用这种方式, 这种方式会让代码变得冗长且难以维护. 但作为学习和理解Smart Mybatis的查询机制, 了解条件构造器是有帮助的.

实际开发过程中, 我们建议使用DSL 查询来构建查询条件, 这种方式更简洁且易于维护.

您可以通过Where对象来构建一个查询器, 同时, 你可以append多个条件表达式来实现更复杂的查询条件.

创建Where对象

要创建一个Where对象,可以使用以下代码:

Where where = new Where();

添加条件

你可以使用appendExpression方法添多个查询条件

@Service
public class StudentServiceImpl implements StudentService {

    @Resource
    private StudentMapper studentMapper;

    @Override
    public List<Student> searchStudent(String name, Integer minAge, Integer maxAge, Sex sex) {
        Where where = new Where();
        where.appendExpression(new ComparisonExpression<Student>(Student::getName, C.LIKE, name, null));
        where.appendExpression(new ComparisonExpression<Student>(Student::getAge, C.GTE, minAge, Link.AND));
        where.appendExpression(new ComparisonExpression<Student>(Student::getAge, C.LTE, maxAge, Link.AND));
        where.appendExpression(new ComparisonExpression<Student>(Student::getSex, C.EQ, sex, Link.AND));
        return studentMapper.select(where);
    }
}

从上面的代码可以看到, 我们通过appendExpression方法添加了多个查询条件, 每个条件都是一个ComparisonExpression对象, 其中包含了字段、操作符、值和连接符.

可用的操作符

Smart Mybatis支持以下操作符:

操作符描述注意事项
EQ等于当值为null时, 会生成IS NULL条件
NE不等于当值为null时, 会生成IS NOT NULL条件
GT大于
LT小于
GTE大于等于
LTE小于等于
LIKE模糊匹配
IN包含于取值必须是Array或者Collection的子类, 例如List, Set
NOT_IN不包含于取值必须是Array或者Collection的子类, 例如List, Set
equals等于当值为null时, 会生成IS NULL条件
notEquals不等于当值为null时, 会生成IS NOT NULL条件
greaterThan大于
lessThan小于
greaterThanOrEqual大于等于
lessThanOrEqual小于等于
like模糊匹配
in包含于取值必须是Array或者Collection的子类, 例如List, Set
notIn不包含于取值必须是Array或者Collection的子类, 例如List, Set

Smart Mybatis 将比较符枚举封装了两种命名风格, 你可以任选其一使用, 甚至可以直接混用, 这取决于你的个人喜好或者你的团队编码规范.

Smart Mybatis 不会强制约束你的代码风格, 你可以根据自己的喜好选择使用哪种命名风格.

连接符

在添加多个条件时, 你可以指定连接符来决定条件之间的关系:

连接符描述
AND
OR

示例

下面是一个完整的示例, 展示了如何使用条件构造器来查询学生信息:

@Service
public class StudentServiceImpl implements StudentService {

    @Resource
    private StudentMapper studentMapper;

    @Override
    public List<Student> searchStudent(String name, Integer minAge, Integer maxAge, Sex sex) {
        Where where = new Where();
        if(StringUtil.isNotBlank(name)){
            where.appendExpression(new ComparisonExpression<Student>(Student::getName, C.LIKE, name, Link.AND));
        }
        if(minAge != null){
            where.appendExpression(new ComparisonExpression<Student>(Student::getAge, C.GTE, minAge, Link.AND));
        }
        if(maxAge != null){
            where.appendExpression(new ComparisonExpression<Student>(Student::getAge, C.LTE, maxAge, Link.AND));
        }
        if(sex != null){
            where.appendExpression(new ComparisonExpression<Student>(Student::getSex, C.EQ, sex, Link.AND));
        }
        return studentMapper.select(where);
    }
}

在上面的示例中, 我们根据传入的参数动态地构建了查询条件, 并使用studentMapper.select(where)方法执行查询, 最终返回符合条件的学生列表。

建议

但是, 正如前面提到的, 这段代码显得非常臃肿, 且用到了大量的枚举和泛型, 所以会变得非常不利于阅读, 我们更推荐使用DSL 查询来实现相同的功能, 这样代码会更加简洁和易于维护。