使用mybati-plus的条件构造器QueryWrapper的eq(boolean condition, R column, Object val) 容易踩的坑!

话不多说:代码容易踩的坑我来踩,免费的赞赞你来点。

先说一下这个eq函数三个参数的作用。

第一个参数boolean condition代表条件判断,也就是我们可以写条件判断,如果条件最终结果是true,那么sql就会有where条件;如果是false,那么sql就不会有where条件【注意:这里是该字段不会再sql语句中带上where,但无论条件成立与否,都会走后面的两个参数】

第二个参数R column 代表数据表中的列名。

第三个参数object val代表列名对应的值。

现在看一个具体例子:比如现在我有一个接口,查询数据库中一张数据表里面的所有数据,假如叫做sys_operation_log系统操作日志,并且搜索条件是时间范围,有开始时间和结束时间,然后现在前端说有一个vue组件是date-picker,该组件默认传数组,问我是否方便接收数组,我说可以。所以现在的接口就是这样子的。

@Autowired

SysOperationLogService sysOperationLogService ;

@GetMapping("/queryAll")

@ResponseBody

public SysOperationLogDTO queryAll(@RequestParam(value = "时间范围") , required = false) List datePicker){

        QueryWrapper queryWrapper = new QueryWrapper() ;

        queryWrapper.between(!CollectionUtils.isEmpty(datePicker) , datePicker.get(0),datePicker.get(1)) ;

//本来这个判断如果不成立,是不会走下面的,但是现在后面的datePicker.get(0),datePicker.get(1)还是会走到,这样就会导致空指针异常!所以我们最后用if去判断

if(!CollectionUtils.isEmpty(datePicker)){}。

所以以后谨慎使用这个判断,当然如果她是基本数据类型,而不是引用数据类型的话【数组,对象】我们还是可以用的。

        sysOperationLogService.list(queryWrapper) ;

}

总结:QueryWrapper的xx(boolean condition , R column , object val);第一个参数无论成不成立true or false最终还是会走后面的column 和 val,所以当遇到引用数据类型比如数组.get()、对象.getXXX(),如果此时为空的话,会报空指针异常!所以以后遇到引用数据类型不要使用condition,直接用if判断或者Optional.ofNullable(T val).ifPresent();如果是基本数据类型可以。

你可能感兴趣的:(数据库,mybatis,spring,boot,spring,cloud)