MybatisPlus只取一條記錄的兩種方法實(shí)現(xiàn)
不管是用MP2.X版本的還是MP3.X版本的小伙伴都會(huì)發(fā)現(xiàn),在其IService接口中 并沒有一個(gè)可以直接獲取一條記錄的方法。
MP2.x提供selectOne方法
@Override
public T selectOne(Wrapper<T> wrapper){
return SqlHelper.getObject(baseMapper.selectList(wrapper));
}
查詢多條記錄,如果存在則返回List.get(0)位置上的數(shù)據(jù)。
MP3.x提供getOne方法
T getOne(Wrapper<T> queryWrapper,boolean throwEx){
return throwEx?this.baseMapper.selectOne(queryWrapper):SqlHelper.getObject(this.log,this.baseMapper.selectList(queryWrapper));
}
getOne方法只不過是在2.x的selectOne方法上多了一個(gè)布爾值,意思就是如果為true,則就是查詢多條記錄就會(huì)拋異常,如果為false,則查詢多條記錄后,取get(0)第一個(gè)位置記錄返回。
不難看出,不管是selectOne還是getOne 底層調(diào)用的是selectList,有些人會(huì)說了,正常情況下,自己調(diào)用selectOne的數(shù)據(jù),基本也是唯一。 但是在有些情況下,通過selectOne調(diào)用再由selectList的一些sql獲取到的結(jié)果其實(shí)是多條甚至是成百上千條(有時(shí)候真的會(huì)遇到),可是你只會(huì)看到第一條數(shù)據(jù)。雖然說業(yè)務(wù)上并不會(huì)影響你們,但是你想過沒有,如果稍有不慎你的sql查詢的結(jié)果在數(shù)據(jù)庫(kù)里是10000條,而這個(gè)查詢經(jīng)常被調(diào)用,也就是說10000條數(shù)據(jù)返回被加載在內(nèi)存,然后就給了你一條,你是爽了,服務(wù)器有負(fù)擔(dān)了。所以我們需要一個(gè)在sql語(yǔ)句階段就能限制查詢一條的結(jié)果的東西,那毋庸置疑就是LIMIT 1,那如何使用LIMIT 1 有以下兩種常用寫法。
第一種寫法
mapper.xml中寫一個(gè)關(guān)于本次查詢的sql ,尾部加上 limit 1
SELECT colum1,colum2,colum3 FROM table1 WHERE 條件 LIMIT 1
這種寫法有一個(gè)不好的地方在哪里呢,對(duì)于單表查詢來說的話,不友善,幾乎你條件一變,要么你用if標(biāo)簽,要么你就得再寫一次sql語(yǔ)句。反正個(gè)人就覺得挺丑的。
第二種寫法
在MP提供的 Wrapper接口的實(shí)現(xiàn)類中都存在一個(gè) last方法 用來最后拼接一個(gè)sql片段,在這里我們加一個(gè)limit 1。
public Children last(boolean condition, String lastSql) {
if (condition) {
this.lastSql.setStringValue(" " + lastSql);
}
return this.typedThis;
}
日常開發(fā)的時(shí)候基本就這么寫
2.x寫法
xxService.selectOne(new EntityWrapper().eq().eq().last("limit 1"));
3.x寫法
xxService.selectOne(new QueryWrapper().eq().eq().last("limit 1"));
但是這也有一個(gè)挺惡心人的地方,就是這last放這 加上 limit 1 還是魔法值,挺難看的。所以可以變成以下封裝。
你創(chuàng)建Service接口的時(shí)候一定會(huì)集成MP中的IService接口,所以就在這里利用java 8的新特性(接口的默認(rèn)實(shí)現(xiàn)方法)來完成封裝.
這里的xxx指的是你業(yè)務(wù)中的某個(gè)實(shí)體類,懂的都懂。
2.x寫法
public interface xxxService extends IService<xxx>{
/**
* 僅有一條數(shù)據(jù)
* @param wrapper
* @return
*/
default xxx getOnly(EntityWrapper<xxx> wrapper){
wrapper.last("limit 1");
return this.selectOne(wrapper);
};
}
3.x寫法
public interface xxxService extends IService<xxx>{
/**
* 僅有一條數(shù)據(jù)
* @param wrapper
* @return
*/
default xxx getOnly(QueryWrapper<xxx> wrapper){
wrapper.last("limit 1");
return this.getOne(wrapper);
};
}
這樣,你就可以將代碼中的selectOne方法 無縫替換了。
到此這篇關(guān)于MybatisPlus如何只取一條記錄的文章就介紹到這了,更多相關(guān)MybatisPlus只取一條記錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot解決循環(huán)調(diào)用問題
作者在將SpringBoot從1.5版本升級(jí)至2.6版本,并遷移至阿里云上運(yùn)行后,遇到了循環(huán)調(diào)用問題,在Jetty容器中運(yùn)行沒問題,但在Tomcat容器中就出現(xiàn)了循環(huán)引用問題,原因是SpringBoot 2.6不鼓勵(lì)循環(huán)引用,暴露出該問題,作者提供了兩種解決思路2024-10-10
mybatis中bind標(biāo)簽和concat的使用說明
這篇文章主要介紹了mybatis中bind標(biāo)簽和concat的使用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
springboot項(xiàng)目實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能
這篇文章主要介紹了springboot項(xiàng)目實(shí)現(xiàn)斷點(diǎn)續(xù)傳,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
解決JdbcTemplate查詢時(shí)報(bào)錯(cuò)Incorrect column count: ex
文章描述了在使用JdbcTemplate執(zhí)行查詢時(shí)遇到的`IncorrectResultSetColumnCountException`錯(cuò)誤,原因是`queryForList`方法返回的是`List<Map<String, Object>>`類型,不能直接轉(zhuǎn)換成對(duì)象,解決方法是將代碼修改為適當(dāng)?shù)牟樵兎绞?以避免錯(cuò)誤2026-01-01
Spring中的@ExceptionHandler注解詳解與應(yīng)用示例
本文詳細(xì)介紹了Spring框架中的@ExceptionHandler注解的用法,包括基本用法、全局異常處理、結(jié)合@ResponseStatus注解以及返回值類型,通過示例展示了如何使用@ExceptionHandler注解處理不同類型的異常,并提供定制化的異常處理響應(yīng),需要的朋友可以參考下2024-11-11
Java ArrayList底層方法的實(shí)現(xiàn)深度解析
ArrayList是Java集合框架中List接口的動(dòng)態(tài)數(shù)組實(shí)現(xiàn),可以方便的存儲(chǔ)和操作數(shù)據(jù),這篇文章是進(jìn)行ArrayList的一個(gè)自我實(shí)現(xiàn),讓我們從底層更深度地理解ArrayList(順序表),感興趣的朋友跟隨小編一起看看吧2025-10-10
Java虛擬機(jī)調(diào)用Java主類的main()方法
這篇文章主要介紹了Java虛擬機(jī)調(diào)用Java主類的main()方法,前一篇文章我們介紹了關(guān)于Java虛擬機(jī)HotSpot2021-11-11

