首先这个异常的原因是系统根据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>
由于一个数据库只是查询,所以这边并没有配置事务。
原文地址:https://www.cnblogs.com/namelessmyth/p/9251870.html
时间: 2024-10-12 19:53:34