mybatis條件構(gòu)造器(EntityWrapper)的使用方式
mybatis條件構(gòu)造器(EntityWrapper)使用
基本的 CRUD 操作,我們僅僅需要繼承一個(gè) BaseMapper 即可實(shí)現(xiàn)大部分單表 CRUD 操作。BaseMapper 提供了多達(dá) 17 個(gè)方法供使用, 可以極其方便的實(shí)現(xiàn)單一、批量、分頁(yè)等操作,極大的減少開(kāi)發(fā)負(fù)擔(dān)。
但是mybatis-plus的強(qiáng)大不限于此,請(qǐng)看如下需求該如何處理:
需求
我們需要分頁(yè)查詢 tb_employee 表中,年齡在 18~50 之間性別為男且姓名為 xx 的所有用戶,這時(shí)候我們?cè)撊绾螌?shí)現(xiàn)上述需求呢?
使用MyBatis : 需要在 SQL 映射文件中編寫(xiě)帶條件查詢的 SQL,并用PageHelper 插件完成分頁(yè). 實(shí)現(xiàn)以上一個(gè)簡(jiǎn)單的需求,往往需要我們做很多重復(fù)單調(diào)的工作。
使用MP: 依舊不用編寫(xiě) SQL 語(yǔ)句,MP 提供了功能強(qiáng)大的條件構(gòu)造器 ------ EntityWrapper。
直接看幾個(gè)案例體會(huì)EntityWrapper的使用
1、分頁(yè)查詢年齡在18 - 50且gender為0、姓名為tom的用戶:
List<Employee> employees = emplopyeeDao.selectPage(new Page<Employee>(1,3), ? ? ?new EntityWrapper<Employee>() ? ? ? ? .between("age",18,50) ? ? ? ? .eq("gender",0) ? ? ? ? .eq("last_name","tom") );
注:由此案例可知,分頁(yè)查詢和之前一樣,new 一個(gè)page對(duì)象傳入分頁(yè)信息即可。至于分頁(yè)條件,new 一個(gè)EntityWrapper對(duì)象,調(diào)用該對(duì)象的相關(guān)方法即可。between方法三個(gè)參數(shù),分別是column、value1、value2,該方法表示column的值要在value1和value2之間;eq是equals的簡(jiǎn)寫(xiě),該方法兩個(gè)參數(shù),column和value,表示column的值和value要相等。注意column是數(shù)據(jù)表對(duì)應(yīng)的字段,而非實(shí)體類屬性字段。
2、查詢gender為0且名字中帶有老師、或者郵箱中帶有a的用戶:
List<Employee> employees = emplopyeeDao.selectList( ? ? ? ? ? ? ? ? new EntityWrapper<Employee>() ? ? ? ? ? ? ? ?.eq("gender",0) ? ? ? ? ? ? ? ?.like("last_name","老師") ? ? ? ? ? ? ? ? //.or()//和or new 區(qū)別不大 ? ? ? ? ? ? ? ?.orNew() ? ? ? ? ? ? ? ?.like("email","a") );
注:未說(shuō)分頁(yè)查詢,所以用selectList即可,用EntityWrapper的like方法進(jìn)行模糊查詢,like方法就是指column的值包含value值,此處like方法就是查詢last_name中包含“老師”字樣的記錄;“或者”用or或者orNew方法表示,這兩個(gè)方法區(qū)別不大,用哪個(gè)都可以,可以通過(guò)控制臺(tái)的sql語(yǔ)句自行感受其區(qū)別。
3、查詢gender為0,根據(jù)age排序,簡(jiǎn)單分頁(yè):
List<Employee> employees = emplopyeeDao.selectList( ? ? ? ? ? ? ? ? new EntityWrapper<Employee>() ? ? ? ? ? ? ? ? .eq("gender",0) ? ? ? ? ? ? ? ? .orderBy("age")//直接orderby 是升序,asc ? ? ? ? ? ? ? ? .last("desc limit 1,3")//在sql語(yǔ)句后面追加last里面的內(nèi)容(改為降序,同時(shí)分頁(yè)) );
注:簡(jiǎn)單分頁(yè)是指不用page對(duì)象進(jìn)行分頁(yè)。orderBy方法就是根據(jù)傳入的column進(jìn)行升序排序,若要降序,可以使用orderByDesc方法,也可以如案例中所示用last方法;last方法就是將last方法里面的value值追加到sql語(yǔ)句的后面,在該案例中,最后的sql語(yǔ)句就變?yōu)閟elect ······ order by desc limit 1, 3,追加了desc limit 1,3所以可以進(jìn)行降序排序和分頁(yè)。
4、分頁(yè)查詢年齡在18 - 50且gender為0、姓名為tom的用戶:
條件構(gòu)造器除了EntityWrapper,還有Condition。用Condition來(lái)處理一下這個(gè)需求:
?List<Employee> employees = emplopyeeDao.selectPage( ? ? ? ? ? ? ? ? new Page<Employee>(1,2), ? ? ? ? ? ? ? ? Condition.create() ? ? ? ? ? ? ? ? ? ? ? ? .between("age",18,50) ? ? ? ? ? ? ? ? ? ? ? ? .eq("gender","0") ?);
注:Condition和EntityWrapper的區(qū)別就是,創(chuàng)建條件構(gòu)造器時(shí),EntityWrapper是new出來(lái)的,而Condition是調(diào)create方法創(chuàng)建出來(lái)。
5、根據(jù)條件更新:
@Test public void testEntityWrapperUpdate(){ ? ? ? ? Employee employee = new Employee(); ? ? ? ? employee.setLastName("蒼老師"); ? ? ? ? employee.setEmail("cjk@sina.com"); ? ? ? ? employee.setGender(0); ? ? ? ? emplopyeeDao.update(employee, ? ? ? ? ? ? ? ? new EntityWrapper<Employee>() ? ? ? ? ? ? ? ? .eq("last_name","tom") ? ? ? ? ? ? ? ? .eq("age",25) ? ? ? ? ); }
注:該案例表示把last_name為tom,age為25的所有用戶的信息更新為employee中設(shè)置的信息。
6、根據(jù)條件刪除:
emplopyeeDao.delete( ? ? ? ? new EntityWrapper<Employee>() ? ? ? ? .eq("last_name","tom") ? ? ? ? .eq("age",16) );
注:該案例表示把last_name為tom、age為16的所有用戶刪除
Wrappers使用的坑點(diǎn)
假設(shè)param對(duì)象中存在一個(gè)list集合,如果list集合不為空是時(shí),取list集合最后一條的數(shù)據(jù)作為條件
public void test(Param param){ ? ? LambdaQueryWrapper<TeacherModel> wrapper = Wrappers.lambdaQuery(); ? ? wrapper.eq(collUtil.isNotEmpty(param.getList()), Entity::condition, param.getList().get(param.getList().size() - 1); // 編譯通過(guò),執(zhí)行時(shí),如果param中的list為null,則報(bào)null pointer異常,這是因?yàn)閙p在拼接條件時(shí),會(huì)將三個(gè)參數(shù)帶入到eq方法,因此param.getList()為null時(shí),param.getList().get(param.getList().size() - 1) 變成了 null..get(param.getList().size() - 1),所以導(dǎo)致了空指針 ? ? list(wrapper); }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring中@Controller和@RestController的區(qū)別詳解
這篇文章主要介紹了Spring中@Controller和@RestController的區(qū)別詳解,@RestController?是?@Controller?和?@ResponseBody?的結(jié)合體,單獨(dú)使用?@RestController?的效果與?@Controller?和?@ResponseBody?二者同時(shí)使用的效果相同,需要的朋友可以參考下2023-10-10jsp頁(yè)面中獲取servlet請(qǐng)求中的參數(shù)的辦法詳解
在JAVA WEB應(yīng)用中,如何獲取servlet請(qǐng)求中的參數(shù),本文講解了jsp頁(yè)面中獲取servlet請(qǐng)求中的參數(shù)的辦法2018-03-03Netty分布式ByteBuf使用的底層實(shí)現(xiàn)方式源碼解析
這篇文章主要為大家介紹了Netty分布式ByteBuf使用底層實(shí)現(xiàn)方式源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03SpringBoot項(xiàng)目啟動(dòng)時(shí)預(yù)加載操作方法
Spring Boot是一種流行的Java開(kāi)發(fā)框架,它提供了許多方便的功能來(lái)簡(jiǎn)化應(yīng)用程序的開(kāi)發(fā)和部署,這篇文章主要介紹了SpringBoot項(xiàng)目啟動(dòng)時(shí)預(yù)加載,需要的朋友可以參考下2023-09-09淺談web服務(wù)器項(xiàng)目中靜態(tài)請(qǐng)求和動(dòng)態(tài)請(qǐng)求處理
這篇文章主要介紹了淺談web服務(wù)器項(xiàng)目中靜態(tài)請(qǐng)求和動(dòng)態(tài)請(qǐng)求處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07