MybatisPlus只取一條記錄的兩種方法實現(xiàn)
不管是用MP2.X版本的還是MP3.X版本的小伙伴都會發(fā)現(xiàn),在其IService接口中 并沒有一個可以直接獲取一條記錄的方法。
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方法上多了一個布爾值,意思就是如果為true,則就是查詢多條記錄就會拋異常,如果為false,則查詢多條記錄后,取get(0)第一個位置記錄返回。
不難看出,不管是selectOne還是getOne 底層調用的是selectList,有些人會說了,正常情況下,自己調用selectOne的數(shù)據(jù),基本也是唯一。 但是在有些情況下,通過selectOne調用再由selectList的一些sql獲取到的結果其實是多條甚至是成百上千條(有時候真的會遇到),可是你只會看到第一條數(shù)據(jù)。雖然說業(yè)務上并不會影響你們,但是你想過沒有,如果稍有不慎你的sql查詢的結果在數(shù)據(jù)庫里是10000條,而這個查詢經(jīng)常被調用,也就是說10000條數(shù)據(jù)返回被加載在內存,然后就給了你一條,你是爽了,服務器有負擔了。所以我們需要一個在sql語句階段就能限制查詢一條的結果的東西,那毋庸置疑就是LIMIT 1,那如何使用LIMIT 1 有以下兩種常用寫法。
第一種寫法
mapper.xml中寫一個關于本次查詢的sql ,尾部加上 limit 1
SELECT colum1,colum2,colum3 FROM table1 WHERE 條件 LIMIT 1
這種寫法有一個不好的地方在哪里呢,對于單表查詢來說的話,不友善,幾乎你條件一變,要么你用if標簽,要么你就得再寫一次sql語句。反正個人就覺得挺丑的。
第二種寫法
在MP提供的 Wrapper接口的實現(xiàn)類中都存在一個 last方法 用來最后拼接一個sql片段,在這里我們加一個limit 1。
public Children last(boolean condition, String lastSql) { if (condition) { this.lastSql.setStringValue(" " + lastSql); } return this.typedThis; }
日常開發(fā)的時候基本就這么寫
2.x寫法
xxService.selectOne(new EntityWrapper().eq().eq().last("limit 1"));
3.x寫法
xxService.selectOne(new QueryWrapper().eq().eq().last("limit 1"));
但是這也有一個挺惡心人的地方,就是這last放這 加上 limit 1 還是魔法值,挺難看的。所以可以變成以下封裝。
你創(chuàng)建Service接口的時候一定會集成MP中的IService接口,所以就在這里利用java 8的新特性(接口的默認實現(xiàn)方法)來完成封裝.
這里的xxx指的是你業(yè)務中的某個實體類,懂的都懂。
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方法 無縫替換了。
到此這篇關于MybatisPlus如何只取一條記錄的文章就介紹到這了,更多相關MybatisPlus只取一條記錄內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Mybatis-plus中QueryWrapper的多種用法小結
本文主要介紹了Mybatis-plus中QueryWrapper的多種用法小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04AsyncHttpClient的ConnectionSemaphore方法源碼流程解讀
這篇文章主要為大家介紹了AsyncHttpClient的ConnectionSemaphore方法源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12