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

mybatis Invalid bound statement(not found)排坑記錄

 更新時(shí)間:2024年06月13日 11:38:52   作者:heling_m6ss  
這篇文章主要介紹了mybatis Invalid bound statement(not found)排坑記錄,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

背景

之前幫同事解決mybatis Invalid bound statement (not found):這個(gè)問題,最近看到很多人也遇到這樣的問題,所以就記錄一下出現(xiàn)這種情況的幾種情況。

問題分析

出現(xiàn) Invalid bound statement (not found) 這個(gè)錯(cuò)誤的原因:

是根據(jù) mapper接口的全路徑 以"."(點(diǎn)號(hào))與方法名拼接成字符串,作為唯一key(下面將以key代替 ) 到 Map<String, MappedStatement> mappedStatements (后續(xù)已map 代替該對象)中去獲取對應(yīng)的MappedStatement, 如果獲取不到就報(bào)這個(gè)錯(cuò)誤。

根據(jù)上面的流程,也就解釋了為什么mapper 中的方法不能重載的原因。因?yàn)楂@取MappedStatement 是根類和方法名有關(guān),與參數(shù)無關(guān)。所以不能重載。

繼續(xù)分析Invalid bound statement 這個(gè)錯(cuò)誤,出現(xiàn)這個(gè)錯(cuò)誤是因?yàn)楂@取不到MappedStatement,也就是說在map 容器中根據(jù)key 去獲取值,沒有獲取到。

解決

那么問題來了,什么情況下在map中根據(jù)key 獲取不到值呢?

其實(shí)獲取不到就兩種情況。

  • 第一種情況: 就是map 是一個(gè)空集合。
  • 第二種情況:map中沒有這個(gè)key (也就是說key值不對)

什么情況下mappedStatements 這個(gè)map 為空呢?

回答這個(gè)問題要明白mybatis 的原理。

在項(xiàng)目啟動(dòng)的過程中,會(huì)掃描并解析掃描到的mapper.xml 文件,將xml文件的namespace 與select 、update 、insert、delete 標(biāo)簽的id 以 namespace.id 的形式組成一個(gè)唯一的key ,將sql語句封裝成一個(gè)MappedStatement 對象作為value存儲(chǔ)在mappedStatements 這個(gè)map 集合中。

所以當(dāng)map集合為空,說明mapper.xml 沒有被容器掃描到。

那什么情況下項(xiàng)目中有mapper.xml 文件卻沒有被掃描到呢?

回答這個(gè)問題,要清楚mybatis mapper.xml 文件的加載目錄。

當(dāng)我們沒有在配置文件中配置指定目錄或者配置配置錯(cuò)誤的文件地址。

 mybatis:
  mapper-locations: classpath:mybatis/mapper/*.xml

在容器啟動(dòng)的時(shí)候會(huì)到配置文件指定的目錄和mapper 接口所在的包中查找,如果查找不到map集合就是空的。

這時(shí)候有的人該問

配置文件配置的mapper.xml 文件地址沒有錯(cuò)誤,為什么map 還是空的?

如果出現(xiàn)這個(gè)問題,我們需要排查一下target 目錄中是否有mapper.xml 文件 因?yàn)閙aven 編譯打包 會(huì)將代碼編譯打包成target文件中,程序運(yùn)行也是讀取加載該目錄下的文件,而不是我們項(xiàng)目目錄。

這時(shí)需要在pom 文件build中添加如下配置

<resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.yml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>`

map為空總結(jié)

1、 檢查mapper的xml文件 是否在mapper 接口包中。如果不在,說明指定了目錄(目前一般都是在resource 資源目錄下新建文件夾) 如果指定了目錄 需要在配置文件中配置指定的目錄。

注意:在resource 目錄下創(chuàng)建多級(jí)目錄時(shí),要一層一層創(chuàng)建,不要像創(chuàng)建Java目錄一下以"."隔開,這樣是不對的。

2、項(xiàng)目配置沒有問題,還出現(xiàn)這個(gè)問題,排查一下target 目錄中是否有mapper.xml 。沒有則說明maven 打包的時(shí)候沒有將xml 文件打包進(jìn)jar中,需要在pom中添加resource配置信息。

下面來說說第二種情況:key 值不正確

1、這種情況 需要排查mapper 接口全路徑 與 mapper xml 文件中的namespace 配置是否一致。

這里有個(gè)驗(yàn)證技巧:

按住Ctrl 鍵 鼠標(biāo)點(diǎn)擊接口名 看看是否能正常跳轉(zhuǎn)到接口中,如果能正常跳轉(zhuǎn),則說明映射成功,如果不能跳轉(zhuǎn),則說明namespace 配置的不正確,需要修改。

2、隱射成功,下一步拷貝接口中的方法名 到xml 文件中查找是否有對應(yīng)的sql,排查xml sql 的id值是否與方法名一致。(注意空格)

這里也有一個(gè)排錯(cuò)技巧:

在idea 上安裝 Free Mybatis plugin插件,這樣 按住Ctrl 鍵 點(diǎn)擊id 看是否能跳轉(zhuǎn)到接口中對應(yīng)的方法上。如果不能則說明id 的值不對,修改成方法名即可。

看到這里估計(jì)有人又該問了

我怎么知道m(xù)ap中是否為空呢?怎么知道key是不正確呢?

如果有看源碼能力的,可以debug項(xiàng)目 追源碼。

如果不想看源碼的,我這里給一個(gè)很直接的方式。debug模式啟動(dòng)項(xiàng)目后,記住是在項(xiàng)目啟動(dòng)后,在mybatis 源碼中打斷點(diǎn),然后請求 debug查看。

千萬別在啟動(dòng)項(xiàng)目前打斷點(diǎn),因?yàn)轫?xiàng)目啟動(dòng)加載也會(huì)走這里,這樣會(huì)看迷糊的。記住是啟動(dòng)項(xiàng)目后,訪問前 打斷點(diǎn)

總結(jié)

這是我目前能找到錯(cuò)誤的原因和解決的方式方法。

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

相關(guān)文章

  • SpringBoot集成 Prometheus進(jìn)行高效監(jiān)控的實(shí)現(xiàn)

    SpringBoot集成 Prometheus進(jìn)行高效監(jiān)控的實(shí)現(xiàn)

    Prometheus作為一個(gè)開源的監(jiān)控和告警工具,以其強(qiáng)大的數(shù)據(jù)采集、存儲(chǔ)和查詢能力,受到了眾多開發(fā)者的青睞,本文主要介紹了SpringBoot集成 Prometheus進(jìn)行高效監(jiān)控的實(shí)現(xiàn),感興趣的可以了解一下
    2024-07-07
  • Java 方法遞歸的思路詳解

    Java 方法遞歸的思路詳解

    程序調(diào)用自身的編程技巧稱為遞歸( recursion)。遞歸做為一種算法在程序設(shè)計(jì)語言中廣泛應(yīng)用。但是如果沒終止條件會(huì)造成死循環(huán),所以遞歸代碼里要有結(jié)束自調(diào)自的條件,接下來講解一下學(xué)習(xí)遞歸的思路
    2022-04-04
  • MyBatis中批量插入的三個(gè)關(guān)鍵優(yōu)化技巧與避坑指南

    MyBatis中批量插入的三個(gè)關(guān)鍵優(yōu)化技巧與避坑指南

    這篇文章主要為大家詳細(xì)介紹了MyBatis中批量插入的三個(gè)關(guān)鍵優(yōu)化技巧與避坑指南,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2026-01-01
  • MyBatis discriminator標(biāo)簽原理實(shí)例解析

    MyBatis discriminator標(biāo)簽原理實(shí)例解析

    這篇文章主要為大家介紹了MyBatis discriminator標(biāo)簽實(shí)現(xiàn)原理實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 基于UDP協(xié)議實(shí)現(xiàn)聊天系統(tǒng)

    基于UDP協(xié)議實(shí)現(xiàn)聊天系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于UDP協(xié)議實(shí)現(xiàn)聊天系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Java使用icepdf將pdf文件按頁轉(zhuǎn)成圖片

    Java使用icepdf將pdf文件按頁轉(zhuǎn)成圖片

    這篇文章主要為大家詳細(xì)介紹了Java使用icepdf將pdf文件按頁轉(zhuǎn)成圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • SpringBoot集成Milvus和deeplearning4j實(shí)現(xiàn)圖搜圖功能

    SpringBoot集成Milvus和deeplearning4j實(shí)現(xiàn)圖搜圖功能

    Milvus?是一種高性能、高擴(kuò)展性的向量數(shù)據(jù)庫,可在從筆記本電腦到大型分布式系統(tǒng)等各種環(huán)境中高效運(yùn)行,Deeplearning4j(DL4J)是一個(gè)開源的深度學(xué)習(xí)框架,專門為Java和Scala開發(fā),本文給大家介紹了SpringBoot集成Milvus和deeplearning4j實(shí)現(xiàn)圖搜圖功能
    2024-10-10
  • java 注解實(shí)現(xiàn)一個(gè)可配置線程池的方法示例

    java 注解實(shí)現(xiàn)一個(gè)可配置線程池的方法示例

    這篇文章主要介紹了java 注解實(shí)現(xiàn)一個(gè)可配置線程池的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • 解決TreeSet類的排序問題

    解決TreeSet類的排序問題

    本文介紹TreeSet支持兩種排序方法:自然排序和定制排序。TreeSet默認(rèn)采用自然排序。詳細(xì)請看下文
    2015-09-09
  • mybatis plus自動(dòng)生成器解析(及遇到的坑)

    mybatis plus自動(dòng)生成器解析(及遇到的坑)

    這篇文章主要介紹了mybatis-plus自動(dòng)生成器及遇到的坑,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論

桐庐县| 凉城县| 龙口市| 新建县| 邓州市| 烟台市| 西吉县| 平舆县| 乌拉特前旗| 汝州市| 新安县| 门头沟区| 农安县| 武夷山市| 紫云| 光山县| 姚安县| 沁水县| 文安县| 正镶白旗| 伽师县| 旺苍县| 长岛县| 虹口区| 伊吾县| 体育| 晋州市| 防城港市| 遵义市| 缙云县| 江华| 沙湾县| 景德镇市| 朝阳区| 兖州市| 通化县| 巫山县| 辽中县| 革吉县| 大港区| 谷城县|