背景
最近搭建了一個簡單的springboot+mybatis+thymelaf的項目,但是項目寫了部分數據庫代碼後跑單元測試提示找不到Mapper中聲明的,即如下錯誤:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): xxx
之前測試的兩個mapper方法都是能跑成功的,但現在也不行了,更蛋疼的是打包也報這個錯誤,但是直接啓動項目,mapper裏面的sql語句是能工作的,詭異的問題。
檢查
確定以下配置沒問題:
- 在springboot 主類上加了@MapperScan 註解,並且設置了正確的包路徑。
- 在application.properties 中正確設置了xml文件的路徑和model包的別名。
- 將包含.xml mybatis的映射文件放在resource/mapper路徑下
- 打包後看到target/classes 下面有xx.xml文件
但是就是springboot junit單元測試時,報上面提到的錯誤
最後的解決辦法
其實最早玩Mybatis的時候,它要求xxxMapper.xml 和xxxMapper.java 需要在同一個包下面,但是我這個直接放在mapper文件下,導致打包後沒有和xxxMapper.java 在一個目錄下,所以我想是不是這個原因導致的,試了一下果然可以。
即解決辦法是: 將 resources下面的xxxMapper.xml的文件夾層次結構改爲和xxxMapper.java的包的層次結構相同,即如果xxxMapper.java的包路徑是com.sj.mapper, 那麼resources下面的xxxMapper.xml的文件夾路徑應該是com/sj/mapper/xxxMapper.xml。
猜測:
假如不按照上面的方面,直接改xxxMapper.xml 中的mapper 的namespace爲看一下。