最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決java報(bào)錯(cuò):使用mybatis?plus查詢一個(gè)只返回一條數(shù)據(jù)的sql,卻報(bào)錯(cuò)返回了1000多條問(wèn)題

 更新時(shí)間:2026年04月09日 16:41:38   作者:svygh123  
文章解釋了一個(gè)系統(tǒng)問(wèn)題,盡管SQL寫(xiě)了limit?1且MyBatis的debug日志顯示total為1,但仍返回了1805條數(shù)據(jù),原因是selectOne方法只查詢一條記錄,若有多條則報(bào)錯(cuò),而非智能篩選,文章還分析了MyBatisPlus和MyBatis中selectOne方法的不同實(shí)現(xiàn)

今天遇到一個(gè)問(wèn)題

系統(tǒng)線上問(wèn)題

  • 經(jīng)常出現(xiàn)這樣的問(wèn)題,剛重啟系統(tǒng)時(shí)不報(bào)錯(cuò)了,可是運(yùn)行一段時(shí)間又會(huì)出現(xiàn)。
  • sql已經(jīng)寫(xiě)了limit 1,mybatis的debug日志也返回total為1,可是卻報(bào)錯(cuò)返回了1805條數(shù)據(jù)

 

 

乍一看,感覺(jué)太不可思議了 

其實(shí)還是被默認(rèn)的東西給坑到了,也不能說(shuō)是坑,就是不理解里面的原理,拿來(lái)就用,以為是這個(gè)功能,其實(shí)還有隱藏的內(nèi)幕在里面。

這個(gè)里面的東西就是selectOne方法,這個(gè)方法,我們以為的查詢方式是這樣的:

select code,username,sex,age,birth from t_user where code=#[code] limit 1

但是它里面并沒(méi)有那么智能,就像它的名字selectOne一樣,你想查詢一條記錄,那么我就幫你查一條記錄,如果有多條記錄,那么我報(bào)錯(cuò)也是合情合理的吧,畢竟你只查一條記錄,也沒(méi)有說(shuō)要查哪一條是吧。

實(shí)際上

MyBatis Plus(com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne)是這樣的:

/**
     * 根據(jù) entity 條件,查詢一條記錄,現(xiàn)在會(huì)根據(jù){@code throwEx}參數(shù)判斷是否拋出異常,如果為false就直接返回一條數(shù)據(jù)
     * <p>查詢一條記錄,例如 qw.last("limit 1") 限制取一條記錄, 注意:多條數(shù)據(jù)會(huì)報(bào)異常</p>
     *
     * @param queryWrapper 實(shí)體對(duì)象封裝操作類(可以為 null)
     * @param throwEx      boolean 參數(shù),為true如果存在多個(gè)結(jié)果直接拋出異常
     */
    default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper, boolean throwEx) {
        List<T> list = this.selectList(queryWrapper);
        // 抄自 DefaultSqlSession#selectOne
        int size = list.size();
        if (size == 1) {
            return list.get(0);
        } else if (size > 1) {
            if (throwEx) {
                throw new TooManyResultsException("Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
            }
            return list.get(0);
        }
        return null;
    }

而MyBatis(org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne)是這樣的:

@Override
  public <T> T selectOne(String statement, Object parameter) {
    // Popular vote was to return null on 0 results and throw exception on too many.
    List<T> list = this.selectList(statement, parameter);
    if (list.size() == 1) {
      return list.get(0);
    }
    if (list.size() > 1) {
      throw new TooManyResultsException(
          "Expected one result (or null) to be returned by selectOne(), but found: " + list.size());
    } else {
      return null;
    }
  }

是吧,拿來(lái)的東西固然好,但是也要花點(diǎn)時(shí)間學(xué)習(xí)里面的精髓。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Netty分布式固定長(zhǎng)度解碼器實(shí)現(xiàn)原理剖析

    Netty分布式固定長(zhǎng)度解碼器實(shí)現(xiàn)原理剖析

    這篇文章主要為大家介紹了Netty分布式固定長(zhǎng)度解碼器原理剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • 將15位身份證補(bǔ)全為18位身份證的算法示例詳解

    將15位身份證補(bǔ)全為18位身份證的算法示例詳解

    這篇文章主要給大家介紹了關(guān)于將15位身份證補(bǔ)全為18位身份證算法的相關(guān)資料,文中通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2017-06-06
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(13)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(13)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-07-07
  • 理解Java面向?qū)ο缶幊淘O(shè)計(jì)

    理解Java面向?qū)ο缶幊淘O(shè)計(jì)

    這篇文章主要介紹了理解Java面向?qū)ο缶幊淘O(shè)計(jì),面向?qū)ο缶幊淌且环N編程思維方式和編碼架構(gòu)。下面詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-01-01
  • SWT(JFace)體驗(yàn)之打開(kāi)多個(gè)Form

    SWT(JFace)體驗(yàn)之打開(kāi)多個(gè)Form

    SWT(JFace)體驗(yàn)之打開(kāi)多個(gè)Form的實(shí)現(xiàn)代碼。
    2009-06-06
  • Java中GUI工具包AWT和Swing用法介紹

    Java中GUI工具包AWT和Swing用法介紹

    這篇文章介紹了Java中GUI工具包AWT和Swing用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Java關(guān)鍵字final的實(shí)現(xiàn)原理分析

    Java關(guān)鍵字final的實(shí)現(xiàn)原理分析

    這篇文章主要介紹了Java關(guān)鍵字final的實(shí)現(xiàn)原理分析,在JDK8之前,如果在匿名內(nèi)部類中需要訪問(wèn)局部變量,那么這個(gè)局部變量一定是final修飾的,但final關(guān)鍵字可以省略,需要的朋友可以參考下
    2024-01-01
  • MyBatis的通俗理解:SqlSession.getMapper()源碼解讀

    MyBatis的通俗理解:SqlSession.getMapper()源碼解讀

    這篇文章主要介紹了MyBatis的通俗理解:SqlSession.getMapper()源碼解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Spring Boot如何使用httpcomponents實(shí)現(xiàn)http請(qǐng)求

    Spring Boot如何使用httpcomponents實(shí)現(xiàn)http請(qǐng)求

    這篇文章主要介紹了Spring Boot使用httpcomponents實(shí)現(xiàn)http請(qǐng)求的示例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • Java項(xiàng)目中防止SQL注入的四種方法推薦

    Java項(xiàng)目中防止SQL注入的四種方法推薦

    sql注入是web開(kāi)發(fā)中最常見(jiàn)的一種安全漏洞,這篇文章為大家整理了四種Java項(xiàng)目中防止SQL注入的方法,有需要的小伙伴可以參考一下
    2025-03-03

最新評(píng)論

陇川县| 乌兰浩特市| 宁陵县| 林口县| 区。| 绍兴县| 安顺市| 安平县| 罗田县| 阳春市| 璧山县| 剑川县| 逊克县| 建湖县| 廉江市| 湟源县| 迁西县| 博客| 嘉峪关市| 黑龙江省| 浮梁县| 宾阳县| 尤溪县| 绥化市| 巩留县| 潞西市| 明水县| 边坝县| 齐齐哈尔市| 鹰潭市| 望都县| 钟山县| 怀远县| 喀喇| 饶阳县| 乐业县| 东乌珠穆沁旗| 武强县| 贵溪市| 茶陵县| 钟山县|