今日份雞湯:我掙的每一筆錢叔锐,都是自己的保障挪鹏,就算步伐很小,也步步前進(jìn)愉烙,千萬不要看不起這一分一厘讨盒,來路清白的自食其力!就是普通人最好的狀態(tài)~
最近在使用MybatisPlus查詢的時(shí)候步责,遇到一些使用不規(guī)范的返顺,導(dǎo)致查詢出錯(cuò)禀苦,今天整體整理一下。
QueryWrapper函數(shù)方法:
示例代碼:
private QueryWrapper<PushChannelPlanModel> buildPageQuery(PushChannelPlanQuery pushChannelPlanQuery) {
QueryWrapper<PushChannelPlanModel> query = new QueryWrapper<>();
if (StringUtils.isNotBlank(pushChannelPlanQuery.getPlanName())) {
query.like("plan_name", pushChannelPlanQuery.getPlanName());
}
if (pushChannelPlanQuery.getEnableStatus() != null) {
query.eq("enable_status", pushChannelPlanQuery.getEnableStatus());
}
if (pushChannelPlanQuery.getStartTime() != null) {
query.ge("start_time", pushChannelPlanQuery.getStartTime());
}
if (pushChannelPlanQuery.getEndTime() != null) {
query.le("end_time", pushChannelPlanQuery.getEndTime());
}
if (StringUtils.isNotBlank(pushChannelPlanQuery.getSelectType())) {
query.and(s -> s.likeRight("select_type", pushChannelPlanQuery.getSelectType() + ",")
.or().like("select_type", "," + pushChannelPlanQuery.getSelectType() + ",")
.or().like("select_type", pushChannelPlanQuery.getSelectType())
.or().likeLeft("select_type", "," + pushChannelPlanQuery.getSelectType()));
}
query.eq("deleted", 0);
query.orderByDesc("id");
return query;
}
對于上面的like其實(shí)想用的是sql中contans這個(gè)遂鹊,所以可以優(yōu)化成下面這樣:
query.apply(StringUtils.isNotBlank(pushChannelPlanQuery.getSelectType()),"FIND_IN_SET ("+pushChannelPlanQuery.getSelectType()+",select_type)");
(1)eq振乏、ne 使用說明:
eq表示相等,ne表示不等于秉扑,這里值得注意的是:多個(gè)eq連用慧邮,兩兩之間默認(rèn)為有一個(gè)and進(jìn)行連接。舉一個(gè)簡單的例子舟陆,對比一下:
QueryWrapper<UserEntity> userWrapper = new QueryWrapper<>();
userWrapper.eq("username", "test").eq("username", "test");
#select * from student WHERE username = ? and username = ?
(2)and與or 使用說明:
這個(gè)使用的時(shí)候一定要注意误澳,我在寫這個(gè)的時(shí)候剛開始也是寫錯(cuò)了,就是注意你的業(yè)務(wù)邏輯要怎樣連接 括號放在哪里秦躯。and的優(yōu)先級比or要高脓匿,它會(huì)把本應(yīng)該為 或者 的兩個(gè)選項(xiàng)搶過來一個(gè),因此我們需要使用上面的這種寫法宦赠,相當(dāng)于給 or 加了個(gè)小括號陪毡,把他們當(dāng)作了一個(gè) wrapper 整體。 可以看我上面的例子勾扭,也可以看下面這個(gè)簡單的例子:
QueryWrapper<UserEntity> userWrapper = new QueryWrapper<>();
userWrapper.and(wrapper->wrapper.eq("username", "test2").or().eq("username", "mytest"))
.and(wrapper -> wrapper.like("username", "mytest").or().like("username", "mytest"));
#SELECT id,username,pwd,date_u,time_u,u_num,img FROM student WHERE ( username = ? OR username = ? ) AND ( username LIKE ? OR username LIKE ? )
(3)ge毡琉、gt 使用說明:
ge表示大于等于,gt表示大于妙色,注意一下邏輯關(guān)系即可(注意別寫反了)桅滋,我這個(gè)當(dāng)時(shí)就寫反了。把上面示例中start_time使用le和end_time使用ge的寫反了身辨。
(4)le丐谋、lt 使用說明:
le表示小于等于,lt表示小于煌珊,注意一下邏輯關(guān)系即可(注意別寫反了)号俐。
(5)between 使用說明:
between表示查詢范圍值,舉個(gè)例子:
查詢年齡20-30范圍 1.代表字段 2.代表開始值 3.代表結(jié)束值
queryWrapper.between("age",20,30);
注意使用between時(shí)也要注意加括號保證or的結(jié)合定庵。
usersQueryWrapper.between("uptime", begin, end);
usersQueryWrapper.and(wrapper -> wrapper.eq("status", UsersResult.STATUS_EXIST)
.or()
.eq("status", UsersResult.BAN));
(6) clear 使用說明:
可以清除之前 QueryWrapper的所有設(shè)置吏饿,變成一個(gè)剛生成的QueryWrapper。
usersQueryWrapper.clear();
(7)可以優(yōu)化的點(diǎn):
按照我們的習(xí)慣蔬浙,平時(shí)我們寫代碼是下面這樣的:
if (StringUtils.isNotBlank(name)) {
query.like(Entity::getName, name)
}
if (age != null && age >= 0) {
query.eq(Entity::getAge, age)
}
就是如果沒有傳name參數(shù), 其實(shí)是沒有必要添加這個(gè)條件的. 滿足一定條件才會(huì)把查詢條件加上去. 寫的多了, 就很麻煩, 而用MyBatis-Plus的構(gòu)造器, 你就可以這么寫:
query.like(StringUtils.isNotBlank(name), Entity::getName, name)
.eq(age!=null && age >= 0, Entity::getAge, age)
這第一個(gè)參數(shù)就叫做condition猪落。這樣的話就不用反復(fù)的用if條件判斷, 還可以把條件串聯(lián)著寫。
(8)orderByDesc畴博、orderByAsc 使用說明
orderByDesc表示降序笨忌,orderByAsc表示升序,示例:
queryWrapper.orderByDesc("id");
(9)last 使用說明:
last 表示sql語句最后拼接俱病,示例:
queryWrapper.last("limit 1");
(10) select 使用說明:
select表示查詢指定的列官疲,示例:
queryWrapper.select("id","name");