在SpringBoot整合MyBatis時,可能會出現掃描不到Mapper.xml文件的問題
常見的報錯是:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):接口方法的全限定名
一般出現這種錯誤,都是映射不到mapper.xml文件的問題:
排查方向:
1.mapper接口和對應的xml文件路徑是否在同一個目錄下?
比如說: mapper接口全限定名: com.xxx.mybatis.mapper.xxxMapper
那對應的xxxMapper.xml,是同樣的在java目錄下com.xxx.mybatis.mapper包下,如圖:
此時:
有一個隱藏的問題: maven項目運行時會打包,而java目錄下的xml資源在打包時會被忽略.
解決方案:
在pom.xml中配置如下:
1 <build> 2 <resources> 3 <resource> 4 <directory>src/main/java</directory> 5 <includes> 6 <include>**/*.xml</include> 7 </includes> 8 </resource> 9 <resource> 10 <directory>src/main/resources</directory> 11 </resource> 12 </resources> 13 </build>
2.如果不是在同一目錄下,而是xml文件是在resources目錄下,那要查看mapper接口和xml文件是否對應?
上圖中就是相對應的,此時是可以掃描到的
如果不對應,還可以通過自定義掃描路徑的方式:
在application.properties中,配置如下:
mybatis.mapper-locations=classpath:想要掃描的路徑,如com/xxx/mybatis/*.xml
到此:問題應該就可以解決了
有些小伙伴可能是從ssm轉過來的,很好奇以前配置的SqlSessionFactor和MapperScan都沒了,是不需要了嗎
了解一下SpringBoot的自動裝配原理,這里就不多贅述了.
mybatis-spring-boot-starter也提供了對應的自動裝配類