在使用 BaseMapper提供的 CRUD接口时,我们为了使功能更强大,可以使用 QueryMapper来构造SQL语句。
1. 使用 eq
QueryWrapper<Train> trainQueryWrapper = new QueryWrapper<>(); trainQueryWrapper.eq("id", trainId) .eq("status", TrainResult.STATUS_EXIST); Train train = trainMapper.selectOne(trainQueryWrapper);
eq表示相等,这里值得注意的是:多个eq连用,两两之间默认为有一个and进行连接。上面的语句表示:在train表中找出一个Train对象(selectOne方法可以根据提供的QueryWrapper,在表中找到一个对应的对象,如果找不到就返回null),它的 id 与 trainId 相等,status与 TrainResult.STATUS_EXIST 相等。注意双引号里是数据库里的字段名称,因此如果有属性为公司id,对应的是 company_id,而不是 companyId。
2. and与or连用
QueryWrapper<Users> usersQueryWrapper = new QueryWrapper<>(); usersQueryWrapper.eq("id", tokenDto.getId()); usersQueryWrapper.and(wrapper -> wrapper.eq("status", UsersResult.STATUS_EXIST) .or() .eq("status", UsersResult.BAN)); //根据id找到对应的用户 Users users = usersMapper.selectOne(usersQueryWrapper);
我们本来的意图是:找到一个 user,它的id与 tokenDto.getId() 相同,并且它的 status为 EXIST 或者 BAN。但如果我们直接写 eq,就会变成:找一个 user,它的 id 与tokenDto.getId()相同,并且它的status为 EXIST。或者 user的status为BAN。也就是说,and的优先级比or要高,它会把本应该为 或者 的两个选项抢过来一个。
因此我们需要使用上面的这种写法,相当于给 or 加了个小括号,把他们当作了一个 wrapper 整体。
3. 使用ge
QueryWrapper<Train> trainQueryWrapper = new QueryWrapper<>(); trainQueryWrapper.eq("company_id", users.getCompanyId()) .eq("status", TrainResult.STATUS_EXIST) .ge("end_time", System.currentTimeMillis()); //trainList为空不报错 List<Train> trainList = trainMapper.selectList(trainQueryWrapper);
ge表示大于等于,注意一下逻辑关系即可,这里的语句表示 "end_time"里的内容要 大于等于 当前的时间(注意别写反了)。selectList方法可以根据提供的 QueryWrapper,在数据库中搜索符合的对象,并返回一个List。
4. 使用between
usersQueryWrapper.between("uptime", begin, end); usersQueryWrapper.and(wrapper -> wrapper.eq("status", UsersResult.STATUS_EXIST) .or() .eq("status", UsersResult.BAN));
begin <= uptime <= end,注意使用between时也要注意加括号保证or的结合。
5. clear方法
usersQueryWrapper.clear();
可以清除之前 QueryWrapper的所有设置,变成一个刚生成的QueryWrapper。