前言
在mybatis_plus的封裝中的Wrapper<T>接口參數(shù)就是用于封裝查詢條件?
?在測(cè)試類中啟動(dòng)如上一個(gè)簡(jiǎn)單的查詢,然后控制臺(tái)運(yùn)行會(huì)輸出一大堆無關(guān)日志,這里先把這些日志關(guān)閉
?去除無關(guān)日志文件
先新建一個(gè)XML配置文件?
?然后變成如下,這里configuration標(biāo)簽里面什么都沒有配置就是取消所有日志文件了
然后再次啟動(dòng)就只剩下spring和mybatis的圖標(biāo)了
?
這兩個(gè)圖標(biāo)也可以消去,在application.yml中關(guān)閉mybatis的banner的顯示,選擇false
?再設(shè)置spring的banner-mode為off就可以把spring的banner一起關(guān)掉了
?再次運(yùn)行就可以看見一個(gè)沒有多余日志輸出的界面了
?按條件查詢的三種方式
?要實(shí)現(xiàn)按條件查詢,進(jìn)入到selectlist的源碼里面看見需要一個(gè)wrapper的對(duì)象,在wrapper源碼中可以看見wrapper<T>是一個(gè)抽象類如下。
?在Wrapper這個(gè)抽象類下面還有一系列的實(shí)現(xiàn)類,這里要用到的是QueryWrapper這個(gè)實(shí)現(xiàn)類,專門用于做查詢封裝操作的,下面還有一些諸如updatewrapper用于更新操作的?
設(shè)置查詢條件(and關(guān)系)
方式一
如下所示新建了一個(gè)QueryWrapper對(duì)象,然后設(shè)置了兩個(gè)條件
@Test
void contextLoads() {
//方式一:按條件查詢
QueryWrapper qw=new QueryWrapper();
//age小于25
qw.lt("age",25);
//age大于17
qw.gt("age",17);
List<mpdb> userlist=userDao.selectList(qw);
System.out.println(userlist);
}
?然后輸出正常
?方式二
//方式二:lambda格式按條件查詢
QueryWrapper<mpdb> qw=new QueryWrapper<mpdb>();
qw.lambda().lt(mpdb::getAge,25);
qw.lambda().gt(mpdb::getAge,17);
List<mpdb> userlist=userDao.selectList(qw);
System.out.println(userlist);
同樣正常輸出 ,并且防止了因?yàn)樽侄蚊麑戝e(cuò)而找不到出錯(cuò)地方
?方式三
在方式二上簡(jiǎn)化了
// 方式三:lambda格式按條件查詢
LambdaQueryWrapper<mpdb> lqw=new LambdaQueryWrapper<mpdb>();
lqw.lt(mpdb::getAge,25);
lqw.gt(mpdb::getAge,17);
List<mpdb> userlist=userDao.selectList(lqw);
System.out.println(userlist);
輸出結(jié)果依舊正確
三種方式大部分都推薦用第三種?,第一種在特殊情況下才使用。
如果過條件過多可以采用這種鏈?zhǔn)骄幊痰姆绞?
設(shè)置查詢條件(or關(guān)系)
條件語句里面加上一個(gè).or()
lqw.lt(mpdb::getAge,25).or().gt(mpdb::getAge,17);
NULL值處理
應(yīng)用場(chǎng)景如下,有空值到后臺(tái)時(shí)要有對(duì)應(yīng)的處理?
這里到先到pojo層或者說domain層下面新建一個(gè)實(shí)體類mpdbQuery用于封裝條件查詢的條件
,這里直接繼承mpdb實(shí)體類即可
??然后要分析可能有哪些字段有范圍,比如日期型有范圍,數(shù)值型也有范圍,在該表中只有age有限制,所以新建一個(gè)age2用于描述年齡的上限,收集來的age屬性用于描述下限。
準(zhǔn)備好后在測(cè)試類中如下
正常輸出
?如果有一個(gè)為空的話會(huì)有如下,查詢失敗
?在lt方法還有第二種實(shí)現(xiàn),傳一個(gè)boolean類型?
?lt的代碼變成如下,如果的判斷不成立就不加入該條件。原本上面的都是無條件加入條件
lqw.lt(null!=mq.getAge2(),mpdb::getAge,mq.getAge2());
?當(dāng)然,也可以用if判斷,但是每個(gè)都要加的話就太多了
查詢投影
所謂查詢投影就是設(shè)置查詢出來的結(jié)果是什么樣,達(dá)成只顯示其中的某一些字段
使用如下的一個(gè)select方法,參數(shù)就是要投影的字段名
LambdaQueryWrapper<mpdb> lqw=new LambdaQueryWrapper<mpdb>();
lqw.select(mpdb::getId,mpdb::getName,mpdb::getAge);
List<mpdb> userlist=userDao.selectList(lqw);
System.out.println(userlist);
輸出如下,只有那三個(gè)字段
?上面這個(gè)是lambda格式專用。
如果是用第一種方法的話就要變成如下
//非lambda格式的投影
QueryWrapper<mpdb> lqw=new QueryWrapper<mpdb>();
lqw.select("id","name","age","tel");
List<mpdb> userlist=userDao.selectList(lqw);
System.out.println(userlist);
輸出如下
?針對(duì)count(*)的查詢投影
查詢投影只能用這個(gè)方式來做,不能用lambda方式
如果要查詢count(*)的話因?yàn)閷?shí)體類沒有對(duì)應(yīng)的用于接收count(*)的字段,所以這里換一個(gè)方式接收,改成如下,String就是字段名,object就是值
這里as count的作用是起別名?
?輸出如下
?分組查詢
使用groupBy方法
?輸出如下,每一組tel都有對(duì)應(yīng)的數(shù)量
?小結(jié)
文章來源:http://www.zghlxwxcb.cn/news/detail-801090.html
?如果有不支持的格式的話就要恢復(fù)最早寫mybatis的格式來寫這了,在DAO層中使用@Select注解的方式文章來源地址http://www.zghlxwxcb.cn/news/detail-801090.html
到了這里,關(guān)于Mybatis-puls——條件查詢的三種格式+條件查詢null判定+查詢投影的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!