Mybatis-Plus: QueryWrapper的使用
在使用 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 = newQueryWrapper<>(); 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。