首先这个异常的原因是系统根据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>
由于一个数据库只是查询,所以这边并没有配置事务。 |