首先這個異常的原因是系統根據Mapper類的方法名找不到對應的映射文件。
網上也搜索了到了類似的文章,一般可以從以下幾個點排查:
- mapper.xml的namespace要寫所映射接口的全稱類名,而且要和Mapper類對應好!
- mapper.xml中的每個statement的id要和接口方法的方法名相同
- mapper.xml中定義的每個sql的parameterType要和接口方法的形參類型相同
- mapper.xml中定義的每個sql的resultType要和接口方法的返回值的類型相同
- mapper.xml要和對應的mapper接口在同一個包下
- mapper.xml的命名規范遵守: 接口名+Mapper.xml
原文鏈接:https://www.cnblogs.com/ewwwe/p/6181872.html
悲催的是筆者的項目把以上都排查過了還是不行。於是再去檢查配置文件。
這里要特別說明的一下是,我們的項目要連接2個數據源。1個數據源只是查詢,另1個數據庫要進行更新。
經過檢查,原來是2個Mybatis的掃描包路徑存在了包含關系導致的!
<property name="basePackage" value="com.kedacom.scm.dao.mes.mybatis" />
然后我把1個數據源的mapper類從原來的路徑底下剝離開來,問題終於解決!!!
順便放一下2個數據源的完整配置,以供參考。數據源一的Mybatis配置。
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean" lazy-init="true"> <property name="dataSource" ref="dataSource" /> <!-- 自動掃描entity目錄, 省掉Configuration.xml里的手工配置 --> <property name="typeAliasesPackage" value="com.kedacom.scm.model" /> <!-- 顯式指定Mapper文件位置 --> <property name="mapperLocations"> <list> <value>classpath:/mapper/*.map.xml</value> <value>classpath*:/security/map/*.map.xml</value> </list> </property> <property name="configLocation" value="classpath:/conf/mybatis-configuration.xml" /> <property name="plugins"> <array> <bean class="com.kedacom.mybatis.ext.PageHelper"> <property name="properties"> <value> dialect=${jdbc.dbType} offsetAsPageNum=true rowBoundsWithCount=true pageSizeZero=true reasonable=true firstPageIsZero=true sortNamingStrategy=default </value> </property> </bean> </array> </property> </bean> <!-- 掃描basePackage下所有以@MyBatisRepository標識的 接口--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 如果有多個數據源,這邊的掃描包路徑不能重合--> <property name="basePackage" value="com.kedacom.security.dao,com.kedacom.scm.dao.mybatis" /> <property name="annotationClass" value="com.kedacom.core.annotion.MyBatisRepository"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean" /> </bean>
另一個數據源配置:
1 <bean id="sqlSessionFactoryBean4Mes" class="org.mybatis.spring.SqlSessionFactoryBean" lazy-init="true"> 2 <property name="dataSource" ref="dataSourceMes" /> 3 <!-- 自動掃描entity目錄, 省掉Configuration.xml里的手工配置 --> 4 <property name="typeAliasesPackage" value="com.kedacom.scm.model" /> 5 <!-- 顯式指定Mapper文件位置 --> 6 <property name="mapperLocations"> 7 <list> 8 <value>classpath*:/mapper/mes/*.map.xml</value> 9 </list> 10 </property> 11 <property name="configLocation" value="classpath:/conf/mybatis-configuration.xml" /> 12 <property name="plugins"> 13 <array> 14 <bean class="com.kedacom.mybatis.ext.PageHelper"> 15 <property name="properties"> 16 <value> 17 dialect=${jdbc.dbType} 18 offsetAsPageNum=true 19 rowBoundsWithCount=true 20 pageSizeZero=true 21 reasonable=true 22 firstPageIsZero=true 23 sortNamingStrategy=default 24 </value> 25 </property> 26 </bean> 27 </array> 28 </property> 29 </bean> 30 31 <!-- 掃描basePackage下所有以@MyBatisRepository標識的 接口--> 32 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 33 <!-- 如果有多個數據源,這邊的掃描包路徑不能重合--> 34 <property name="basePackage" value="com.kedacom.scm.dao.mes.mybatis" /> 35 <property name="annotationClass" value="com.kedacom.core.annotion.MyBatisRepository"/> 36 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean4Mes" /> 37 </bean>
由於一個數據庫只是查詢,所以這邊並沒有配置事務。