org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.dao.XxxMapper
?Invalid bound statement
這個(gè)異常相信有點(diǎn)開(kāi)發(fā)經(jīng)驗(yàn)的人都不陌生吧,尤其是整天跟Mybatis打交道的,或多或少都會(huì)遇到過(guò).
然后請(qǐng)教同事或者自己百度, 找到癥結(jié)所在, 也都邁過(guò)去了.?
不幸的是, 我今天又掉到這個(gè)坑里去了,?而且爬了一晚上沒(méi)爬出來(lái)
該異常能百度出來(lái)的解決方案就不說(shuō)了, 大家隨便一搜就能找見(jiàn),?
還是說(shuō)一下吧, 免得你們?cè)偃グ俣攘?/p>
如果是Spring + MyBatis, 檢查Spring配置文件中org.mybatis.spring.SqlSessionFactoryBean的mapperLocations屬性是否配置正確, 以及org.mybatis.spring.mapper.MapperScannerConfigurer的basePackage屬性是否配置正確.
SpringBoot + MyBatis, 檢查 配置文件中的mybatis.mapper-locations配置項(xiàng)(多個(gè)路徑可用","隔開(kāi)), 以及程序入口類上的@MapperScan注解是否包含了需要被掃描到的Mapper接口所在的包名
XxxMapper.xml文件中namespace屬性是否對(duì)應(yīng) XxxMapper接口的全類名,?XxxMapper.xml文件中的resultType是都對(duì)應(yīng)相應(yīng)實(shí)體Bean的全類名??
以上配置項(xiàng)配置正確, 應(yīng)該可以解決90%的Invalid bound statement
除非 像我遇到的坑一樣 心血來(lái)潮, 非要把Mapper.xml和Mapper接口放在同一個(gè)包下,?
源碼跟蹤的細(xì)節(jié)就不細(xì)細(xì)展開(kāi)了, 有興趣的可以在PathMatchingResourcePatternResolver這個(gè)類的doFindPathMatchingFileResources方法的try代碼塊中打個(gè)斷點(diǎn)跟蹤一下.
說(shuō)解決辦法. 項(xiàng)目的pom文件中的<build>節(jié)點(diǎn)內(nèi)添加<resources>節(jié)點(diǎn), 節(jié)點(diǎn)內(nèi)容如下
主要起什么作用解釋一下:
如果XxxMapper.xml和XxxMapper.java放置在同包下, 不加上述配置, 則在項(xiàng)目編譯XxxMapper.java后生成的XxxMapper.class路徑下是不存在XxxMapper.xml的,
也即上面的配置項(xiàng)即使是配置的準(zhǔn)確無(wú)誤, 最后也會(huì)在PathMatchingResourcePatternResolver這個(gè)類的doFindPathMatchingFileResources方法中報(bào)Mapper接口映射文件找不到的IO異常
由于只掃到了Mapper接口, 沒(méi)有掃到Mapper.xml配置文件,?最終導(dǎo)致報(bào)出文章開(kāi)頭的異常
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.dao.XxxMapper