出現(xiàn)這個問題的根本原因就是mybatis 的mapper類和 mapper.xml文件對應不上竞思,可能是namespace找不到鲁捏,也可能是mapper文件找不到
- 檢查xml文件所在package名稱是否和Mapper interface所在的包名
<mapper namespace="com.xxx.xxx.dao.xxxx DAO">
檢查這里配置的namespace和代碼中定義的 mapper interface 是否一樣
package com.xxx.xxx.dao.;
public interface XXXDAO
- 如何第一步沒有問題价涝,檢查是否是mapper文件沒有掃描到導致的
單模塊項目:
檢查配置文件中的mybatis.mapper-locations是否配置正確
mybatis.mapper-locations=com.xxx.xxx.dao
多模塊項目:
在模塊A中曹动,只完成了mybatis mapper interface 的定義和 mapper的實現(xiàn)沒有定義mybatis的數(shù)據(jù)源隔嫡,和配置
在模塊B 中劝术,通過pom 引用A 模塊。
在這種結構下如果出現(xiàn)了Invalid bound statement, 我們就需要修改mapper-locations 的值為:
classpath*:mapper/*.xml
因為:A 模塊被引入后友浸,A 模塊的mapper文件不會被引入到resources/mapper目錄下峰尝,而是引入到了resources root目錄下,所以如果只配置classpath:mapper/.xml收恢,會導致mybatis在B模塊下讀取不到A模塊的mapper文件武学,因為 classpath:只會到你的class路徑中查找找文件,當有多個classpath路徑只會從第一個classpath中加載伦意。
classpath:不僅包含class路徑火窒,還包括jar文件中(class路徑)進行查找;當有多個classpath路徑驮肉,會從所有的classpath中加載熏矿;
【注】用classpath:需要遍歷所有的classpath,所以加載速度是很慢的离钝;因此票编,在規(guī)劃的時候,應該盡可能規(guī)劃好資源文件所在的路徑卵渴,盡量避免使用classpath
今天遇到了更怪的項目:
B模塊用的是mybatis plus, A模塊用的mybatis,
Step 1: 當時想的mybatis plus 底層就是mybatis慧域, 所以直接在配置文件中添加了如下配置:
mybatis.mapper-locations=com.xxx.xxx.dao
這樣application.properties的配置如下:
mybatis.mapper-locations= classpath:mapper/*xml
mybatis-plus.mapper-locations= classpath*: mapper/*.xml
啟動時發(fā)現(xiàn)還是報錯,所以猜想應該是mybatis, mybatis-plus沖突導致的奖恰。
Step2:只保留mybatis.mapper-locations一個吊趾,配置如下
mybatis.mapper-locations= classpath*:mapper/*xml
或只保留
mybatis-plus.mapper-locations= classpath*:mapper/*xml
啟動發(fā)現(xiàn),正確獲取了mapper文件