# xxIfNull 方法使用
# 功能介绍
xxIfNull 系列方法提供了一种便捷的方式来处理条件查询中的空值情况。当值为空时,对应的条件不会被添加到查询语句中。
# 支持的方法
目前支持以下方法:
eqIfNull- 等于(值不为空时)neIfNull- 不等于(值不为空时)gtIfNull- 大于(值不为空时)geIfNull- 大于等于(值不为空时)ltIfNull- 小于(值不为空时)leIfNull- 小于等于(值不为空时)likeIfNull- 模糊查询(值不为空时)notLikeIfNull- 不包含(值不为空时)likeLeftIfNull- 左模糊(值不为空时)likeRightIfNull- 右模糊(值不为空时)notLikeLeftIfNull- 不以什么开头(值不为空时)notLikeRightIfNull- 不以什么结尾(值不为空时)betweenIfNull- 范围查询(两个值都不为空时)notBetweenIfNull- 不在范围内(两个值都不为空时)
# 使用示例
// 构建查询条件
wrapper.eqIfNull(User::getStatus, status)           // status不为空时才会加入条件
       .likeIfNull(User::getName, name)             // name不为空时才会加入条件
       .betweenIfNull(User::getAge, minAge, maxAge) // minAge和maxAge都不为空时才会加入条件
       .geIfNull(User::getCreateTime, startTime);   // startTime不为空时才会加入条件
// 等价于以下代码
wrapper.eq(ObjectUtils.isNotEmpty(status), User::getStatus, status)
       .like(ObjectUtils.isNotEmpty(name), User::getName, name)
       .between(ObjectUtils.isNotEmpty(minAge) && ObjectUtils.isNotEmpty(maxAge), User::getAge, minAge, maxAge)
       .ge(ObjectUtils.isNotEmpty(startTime), User::getCreateTime, startTime);
# 实际应用场景
- 处理搜索表单
 
public List<User> searchUsers(UserQuery query) {
    return Joins.of(User.class)
            .eqIfNull(User::getGender, query.getGender())
            .likeIfNull(User::getName, query.getName())
            .likeIfNull(User::getEmail, query.getEmail())
            .geIfNull(User::getCreateTime, query.getStartTime())
            .leIfNull(User::getCreateTime, query.getEndTime())
            .list();
}
- 动态查询条件
 
wrapper.eqIfNull(User::getStatus, status)    // 状态条件
       .likeIfNull(User::getName, keyword)    // 关键字搜索
       .inIfNull(User::getType, typeList);    // 类型过滤
# 注意事项
- 空值判断
 
- 使用 ObjectUtils.isNotEmpty() 进行判断
 - null、空字符串、空集合都被视为空值
 - 数值类型的 0 不被视为空值
 
- 使用建议
 
- 适合处理可选查询参数
 - 可以减少代码中的显式判空逻辑
 - 建议在查询条件比较多的场景使用
 
- 性能考虑
 
- 空值条件不会加入SQL,可以提高查询效率
 - 减少了无效条件的拼接
 
