mybatis整合springboot報(bào)BindingException:Invalid?bound?statement?(not?found)異常解決
一、前言
本文的mybatis是與springboot整合時(shí)出現(xiàn)的異常,若使用的不是基于springboot,解決思路也大體一樣的。
二、從整合mybatis的三個(gè)步驟排查問(wèn)題
但在這之前,我們先要知道整合mybatis的三個(gè)重要的工作,如此才能排查,且往下看。
2.1 pom.xml配置**Mapper.xml文件的構(gòu)建路徑
我們打開pom文件如下:
<build> <resources> <resource> <directory>src/main/java</directory> <filtering>false</filtering> <includes> <include>**/*.xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <includes> <include>*</include> <include>**/*.xml</include> </includes> </resource> </resources> </build>
這部分代碼的作用是指定需要編譯到taget目錄下的資源文件。我們的程序運(yùn)行,都是執(zhí)行編譯好的taget目錄下的內(nèi)容,若taget里找不到xml文件資源就會(huì)報(bào)錯(cuò)Invalid bound statement (not found)。
每個(gè)人的項(xiàng)目配置都可能有些區(qū)別,但在這里我們只需要關(guān)注<includes>標(biāo)簽即可。還有對(duì)于不同的項(xiàng)目,xml的存放位置也可能不同,有的存在于src/main/java代碼下,有的存在于src/main/resources。
<include>**/*.xml</include>
這行代碼是用于構(gòu)建存在于src/main/java代碼中的xml文件。
<include></include>
<include>**/.xml</include>
這行代碼是用于構(gòu)建存在于src/main/resources代碼中的所有文件。
上述,我們可以排查第一個(gè)可能拋出Invalid bound statement (not found)異常的情況,我們可以通過(guò)查看編譯好的taget目錄,如下:
情況一:
原代碼文件目錄:
編譯失敗的情況:
編譯成功的情況:
情況二:
源代碼文件目錄:
編譯失?。?/p>
編譯成功:
有時(shí),一直編譯不成功,那就將taget重新刪除,再編譯。
2.2 配置mapper類的包掃描路徑
這個(gè)步驟與Invalid bound statement (not found)異常無(wú)關(guān),但是它也是整合mybatis重要的步驟之一,這里也說(shuō)明一下,有兩種方式實(shí)現(xiàn),可根據(jù)自己的項(xiàng)目情況使用。(兩者擇其一)
通過(guò)注解的方式掃描:
通過(guò)配置類方式掃描:
這個(gè)步驟的目的是將我們定義的mapper類裝配到我們的ioc容器中。
若沒有掃描,啟動(dòng)時(shí)就會(huì)直接報(bào)找不到mapper的錯(cuò)誤,無(wú)法運(yùn)行項(xiàng)目。
2.3 application.yml文件中配置**Mapper.xml文件的掃描路徑
這個(gè)配置若不正確,也會(huì)導(dǎo)致Invalid bound statement (not found)異常。值得一說(shuō)的是,這一步驟的掃描是建立在步驟一的基礎(chǔ)之上的,若編譯好的taget目錄都沒有目標(biāo)文件,那這一步驟就更不用說(shuō)了。
一:
這里的掃描路徑配置,還需要注意自己的項(xiàng)目使用的原始mybatis還是mybatis-plus,它們的配置也有區(qū)別的,如下:
原始mybatis:
mybatis: mapper-locations: classpath:/cn/anycase/demo/mapper/xml/*Mapper.xml
mybatis-plus:
mybatis-plus: mapper-locations: classpath:cn/anycase/demo/mapper/xml/*.xml
本例用的是mybatis-plus:
二:
使用mybatis-plus,當(dāng)xml和mapper類在同級(jí)目錄時(shí)可以省略這個(gè)掃描路徑的配置,所以我們看到的有些項(xiàng)目少了這個(gè)配置(mybatis應(yīng)該做了默認(rèn)的掃描操作,這里不做深究),但它并沒有錯(cuò),且能正常運(yùn)行。(原始mybatis是否也可以,本人未做相關(guān)測(cè)試)
三:
還有一個(gè)需要注意的點(diǎn),前面步驟一說(shuō)了,mapper.xml文件可能存在于src/main/java代碼中,或存在于src/main/resources資源中,因此我們的配置路徑也有所不同,如下:
Invalid bound statement (not found)這個(gè)異常,在常規(guī)下,通過(guò)上述的三個(gè)步驟可以百分百解決。
三、其他情況的Invalid bound statement (not found)異常
3.1 文件名導(dǎo)致的異常
上述截圖的文件目錄,在運(yùn)行過(guò)程中也出現(xiàn)了Invalid bound statement (not found)異常,仔細(xì)檢查了原代碼xml、targe下的xml目錄、yml中配置的掃描目錄,看似正確了但其實(shí)是有問(wèn)題的。
源代碼目錄的"mybatis.mapper"這個(gè)展示沒問(wèn)題,但target目錄下的"mybatis.mapper"這個(gè)展示有問(wèn)題,正常編譯好的target文件目錄都會(huì)是按層級(jí)展示的,但是這里確是連在了一起。所以發(fā)現(xiàn)問(wèn)題了,就是在創(chuàng)建mybatis/mapper層級(jí)目錄的時(shí)候,失誤創(chuàng)建了名字為"mybatis.mapper"目錄。
解決方案:刪除mybatis.mapper,重新建立,先建mybatis文件夾,再建立mapper文件夾,最后再建立.xml文件。
3.2 因?yàn)閿U(kuò)展的配置類導(dǎo)致yml掃描路徑配置不生效
這是另一種出現(xiàn)Invalid bound statement (not found)異常的情況,如下截圖
如圖所示,我們的各項(xiàng)步驟和配置都檢查,仍舊不發(fā)現(xiàn)任何問(wèn)題,但一當(dāng)運(yùn)行時(shí)就會(huì)報(bào)錯(cuò),這很讓人百思不得其解。。。。。但其實(shí)問(wèn)題肯定是出在配置里頭,是不是哪個(gè)地方出現(xiàn)了覆蓋,導(dǎo)致掃描路徑不生效?
有了這個(gè)想法,我們就可以檢查源代碼中的所有關(guān)于mybatis的配置類。最后,我們發(fā)現(xiàn)了一個(gè)類,如下:
源代碼:
@Configuration public class MybatisPlusConfig implements EnvironmentAware { Environment env; @Bean("primary") @Primary public DataSource dataSource() throws ClassNotFoundException { return DataSourceBuilder.create() .url(env.getProperty("spring.datasource.url")) .type((Class<? extends DataSource>) Class.forName(env.getProperty("spring.datasource.type"))) .driverClassName(env.getProperty("spring.datasource.driverClassName")) .username(env.getProperty("spring.datasource.username")) .password(env.getProperty("spring.datasource.password")) .build(); } @Bean("mainsf") public SqlSessionFactory sqlSessionFactory(@Qualifier("primary") DataSource dataSource, GlobalConfiguration globalConfiguration) throws Exception { MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean(); sqlSessionFactory.setDataSource(dataSource); MybatisConfiguration configuration = new MybatisConfiguration(); configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class); configuration.setJdbcTypeForNull(JdbcType.NULL); configuration.setMapUnderscoreToCamelCase(true); sqlSessionFactory.setConfiguration(configuration); Interceptor[] plugins; plugins = new Interceptor[]{new PaginationInterceptor()}; sqlSessionFactory.setPlugins(plugins); sqlSessionFactory.setGlobalConfig(globalConfiguration); return sqlSessionFactory.getObject(); } @Bean public GlobalConfiguration globalConfiguration() { GlobalConfiguration conf = new GlobalConfiguration(); conf.setIdType(1); return conf; } @Override public void setEnvironment(Environment environment) { this.env = environment; } }
問(wèn)題就發(fā)現(xiàn)了,這個(gè)配置類中自定義了一個(gè)SqlSessionFactory ,里邊也配置了MybatisConfiguration相關(guān)的東西,因此我們yml里面的配置mybatis-plus. mapper-locations便失效了。
- 解決方案一:將這個(gè)配置類里相關(guān)的mybatis配置去掉。
- 解決方案二:將xml挪到mapper類的同級(jí)目錄下。(因?yàn)槟J(rèn)會(huì)掃描mapper類的同級(jí)xml)
3.3 方法名和statement ID需要一致
這個(gè)錯(cuò)誤是比較沒水準(zhǔn),這里不做贅述。
總結(jié)
到此這篇關(guān)于mybatis整合springboot報(bào)BindingException:Invalid bound statement (not found)異常解決的文章就介紹到這了,更多相關(guān)BindingException:Invalid bound statement (not found)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC中RequestParam注解的簡(jiǎn)單理解
@RequestMapping RequestMapping是一個(gè)用來(lái)處理請(qǐng)求地址映射的注解,可用于類或方法上,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中RequestParam注解的簡(jiǎn)單理解,需要的朋友可以參考下2022-03-03spring boot metrics監(jiān)控指標(biāo)使用教程
這篇文章主要為大家介紹了針對(duì)應(yīng)用監(jiān)控指標(biāo)暴露spring boot metrics監(jiān)控指標(biāo)的使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02子線程任務(wù)發(fā)生異常時(shí)主線程事務(wù)回滾示例過(guò)程
這篇文章主要為大家介紹了子線程任務(wù)發(fā)生了異常時(shí)主線程事務(wù)如何回滾的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03Java替換int數(shù)組中重復(fù)數(shù)據(jù)的方法示例
這篇文章主要介紹了Java替換int數(shù)組中重復(fù)數(shù)據(jù)的方法,涉及java針對(duì)數(shù)組的遍歷、轉(zhuǎn)換、判斷等相關(guān)操作技巧,需要的朋友可以參考下2017-06-06解決使用mybatis-plus時(shí),生成的SQL大寫變小寫加下劃線問(wèn)題
這篇文章主要介紹了解決使用mybatis-plus時(shí),生成的SQL大寫變小寫加下劃線問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12Mybatis傳list參數(shù)調(diào)用oracle存儲(chǔ)過(guò)程的解決方法
怎么利用MyBatis傳List類型參數(shù)到數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程中實(shí)現(xiàn)批量插入數(shù)據(jù)?接下來(lái)通過(guò)本文給大家介紹Mybatis傳list參數(shù)調(diào)用oracle存儲(chǔ)過(guò)程,需要的朋友可以參考下2017-03-03