欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

背景

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

問(wèn)題分析

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

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

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

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

解決

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如果出現(xiàn)這個(gè)問(wèn)題,我們需要排查一下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 接口包中。如果不在,說(shuō)明指定了目錄(目前一般都是在resource 資源目錄下新建文件夾) 如果指定了目錄 需要在配置文件中配置指定的目錄。

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

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

下面來(lái)說(shuō)說(shuō)第二種情況:key 值不正確

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

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

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

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

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

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

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

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

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

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

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

總結(jié)

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

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

相關(guān)文章

  • Spring服務(wù)注解有哪些

    Spring服務(wù)注解有哪些

    這篇文章主要介紹了Spring服務(wù)注解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2016-11-11
  • @CacheEvict + redis實(shí)現(xiàn)批量刪除緩存

    @CacheEvict + redis實(shí)現(xiàn)批量刪除緩存

    這篇文章主要介紹了@CacheEvict + redis實(shí)現(xiàn)批量刪除緩存方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 全面匯總SpringBoot和SpringClould常用注解

    全面匯總SpringBoot和SpringClould常用注解

    Java注解是附加在代碼中的一些元信息,用于一些工具在編譯、運(yùn)行時(shí)進(jìn)行解析和使用,起到說(shuō)明、配置的功能,這篇文章就帶你來(lái)了解一下
    2021-08-08
  • 使用注解進(jìn)行Spring開發(fā)的全過(guò)程

    使用注解進(jìn)行Spring開發(fā)的全過(guò)程

    使用注解(Annotation)是一種在代碼級(jí)別進(jìn)行說(shuō)明和標(biāo)記的技術(shù),它從JDK 5.0開始引入,并在現(xiàn)代Java開發(fā)中得到了廣泛應(yīng)用,本文將詳細(xì)介紹Spring框架中常用的注解及示例,幫助開發(fā)者快速掌握Spring注解開發(fā)的要點(diǎn)和技巧,需要的朋友可以參考下
    2023-11-11
  • java8實(shí)現(xiàn)List中對(duì)象屬性的去重方法

    java8實(shí)現(xiàn)List中對(duì)象屬性的去重方法

    這篇文章主要介紹了java8實(shí)現(xiàn)List中對(duì)象屬性的去重方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Maven解決jar包版本沖突的4種方法詳解

    Maven解決jar包版本沖突的4種方法詳解

    這篇文章主要給大家介紹了關(guān)于Maven解決jar包版本沖突的4種方法代碼,maven工程要導(dǎo)入jar包的坐標(biāo),就必須要考慮解決jar包沖突,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 淺談JAVA設(shè)計(jì)模式之代理模式

    淺談JAVA設(shè)計(jì)模式之代理模式

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之代理模式的的相關(guān)資料,文中代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 使用Runnable實(shí)現(xiàn)數(shù)據(jù)共享

    使用Runnable實(shí)現(xiàn)數(shù)據(jù)共享

    這篇文章主要為大家詳細(xì)介紹了如何使用Runnable實(shí)現(xiàn)數(shù)據(jù)共享,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java8函數(shù)式編程應(yīng)用小結(jié)

    Java8函數(shù)式編程應(yīng)用小結(jié)

    Java8非常重要的就是引入了函數(shù)式編程的思想,使得這門經(jīng)典的面向?qū)ο笳Z(yǔ)言有了函數(shù)式的編程方式,彌補(bǔ)了很大程度上的不足,函數(shù)式思想在處理復(fù)雜問(wèn)題上有著更為令人稱贊的特性,本文給大家介紹Java8函數(shù)式編程應(yīng)用小結(jié),感興趣的朋友一起看看吧
    2023-12-12
  • Jetty啟動(dòng)項(xiàng)目中引用json-lib相關(guān)類庫(kù)報(bào)錯(cuò)ClassNotFound的解決方案

    Jetty啟動(dòng)項(xiàng)目中引用json-lib相關(guān)類庫(kù)報(bào)錯(cuò)ClassNotFound的解決方案

    今天小編就為大家分享一篇關(guān)于Jetty啟動(dòng)項(xiàng)目中引用json-lib相關(guān)類庫(kù)報(bào)錯(cuò)ClassNotFound的解決方案,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12

最新評(píng)論