mybatis整合springboot報BindingException:Invalid?bound?statement?(not?found)異常解決
一、前言
本文的mybatis是與springboot整合時出現(xiàn)的異常,若使用的不是基于springboot,解決思路也大體一樣的。
二、從整合mybatis的三個步驟排查問題
但在這之前,我們先要知道整合mybatis的三個重要的工作,如此才能排查,且往下看。
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目錄下的資源文件。我們的程序運行,都是執(zhí)行編譯好的taget目錄下的內(nèi)容,若taget里找不到xml文件資源就會報錯Invalid bound statement (not found)。
每個人的項目配置都可能有些區(qū)別,但在這里我們只需要關注<includes>標簽即可。還有對于不同的項目,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代碼中的所有文件。
上述,我們可以排查第一個可能拋出Invalid bound statement (not found)異常的情況,我們可以通過查看編譯好的taget目錄,如下:
情況一:
原代碼文件目錄:
編譯失敗的情況:
編譯成功的情況:
情況二:
源代碼文件目錄:
編譯失?。?/p>
編譯成功:
有時,一直編譯不成功,那就將taget重新刪除,再編譯。
2.2 配置mapper類的包掃描路徑
這個步驟與Invalid bound statement (not found)異常無關,但是它也是整合mybatis重要的步驟之一,這里也說明一下,有兩種方式實現(xiàn),可根據(jù)自己的項目情況使用。(兩者擇其一)
通過注解的方式掃描:
通過配置類方式掃描:
這個步驟的目的是將我們定義的mapper類裝配到我們的ioc容器中。
若沒有掃描,啟動時就會直接報找不到mapper的錯誤,無法運行項目。
2.3 application.yml文件中配置**Mapper.xml文件的掃描路徑
這個配置若不正確,也會導致Invalid bound statement (not found)異常。值得一說的是,這一步驟的掃描是建立在步驟一的基礎之上的,若編譯好的taget目錄都沒有目標文件,那這一步驟就更不用說了。
一:
這里的掃描路徑配置,還需要注意自己的項目使用的原始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,當xml和mapper類在同級目錄時可以省略這個掃描路徑的配置,所以我們看到的有些項目少了這個配置(mybatis應該做了默認的掃描操作,這里不做深究),但它并沒有錯,且能正常運行。(原始mybatis是否也可以,本人未做相關測試)
三:
還有一個需要注意的點,前面步驟一說了,mapper.xml文件可能存在于src/main/java代碼中,或存在于src/main/resources資源中,因此我們的配置路徑也有所不同,如下:
Invalid bound statement (not found)這個異常,在常規(guī)下,通過上述的三個步驟可以百分百解決。
三、其他情況的Invalid bound statement (not found)異常
3.1 文件名導致的異常
上述截圖的文件目錄,在運行過程中也出現(xiàn)了Invalid bound statement (not found)異常,仔細檢查了原代碼xml、targe下的xml目錄、yml中配置的掃描目錄,看似正確了但其實是有問題的。
源代碼目錄的"mybatis.mapper"這個展示沒問題,但target目錄下的"mybatis.mapper"這個展示有問題,正常編譯好的target文件目錄都會是按層級展示的,但是這里確是連在了一起。所以發(fā)現(xiàn)問題了,就是在創(chuàng)建mybatis/mapper層級目錄的時候,失誤創(chuàng)建了名字為"mybatis.mapper"目錄。
解決方案:刪除mybatis.mapper,重新建立,先建mybatis文件夾,再建立mapper文件夾,最后再建立.xml文件。
3.2 因為擴展的配置類導致yml掃描路徑配置不生效
這是另一種出現(xiàn)Invalid bound statement (not found)異常的情況,如下截圖
如圖所示,我們的各項步驟和配置都檢查,仍舊不發(fā)現(xiàn)任何問題,但一當運行時就會報錯,這很讓人百思不得其解。。。。。但其實問題肯定是出在配置里頭,是不是哪個地方出現(xiàn)了覆蓋,導致掃描路徑不生效?
有了這個想法,我們就可以檢查源代碼中的所有關于mybatis的配置類。最后,我們發(fā)現(xiàn)了一個類,如下:
源代碼:
@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; } }
問題就發(fā)現(xiàn)了,這個配置類中自定義了一個SqlSessionFactory ,里邊也配置了MybatisConfiguration相關的東西,因此我們yml里面的配置mybatis-plus. mapper-locations便失效了。
- 解決方案一:將這個配置類里相關的mybatis配置去掉。
- 解決方案二:將xml挪到mapper類的同級目錄下。(因為默認會掃描mapper類的同級xml)
3.3 方法名和statement ID需要一致
這個錯誤是比較沒水準,這里不做贅述。
總結(jié)
到此這篇關于mybatis整合springboot報BindingException:Invalid bound statement (not found)異常解決的文章就介紹到這了,更多相關BindingException:Invalid bound statement (not found)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
spring boot metrics監(jiān)控指標使用教程
這篇文章主要為大家介紹了針對應用監(jiān)控指標暴露spring boot metrics監(jiān)控指標的使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-02-02Java替換int數(shù)組中重復數(shù)據(jù)的方法示例
這篇文章主要介紹了Java替換int數(shù)組中重復數(shù)據(jù)的方法,涉及java針對數(shù)組的遍歷、轉(zhuǎn)換、判斷等相關操作技巧,需要的朋友可以參考下2017-06-06解決使用mybatis-plus時,生成的SQL大寫變小寫加下劃線問題
這篇文章主要介紹了解決使用mybatis-plus時,生成的SQL大寫變小寫加下劃線問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12Mybatis傳list參數(shù)調(diào)用oracle存儲過程的解決方法
怎么利用MyBatis傳List類型參數(shù)到數(shù)據(jù)庫存儲過程中實現(xiàn)批量插入數(shù)據(jù)?接下來通過本文給大家介紹Mybatis傳list參數(shù)調(diào)用oracle存儲過程,需要的朋友可以參考下2017-03-03