Mybatis配置问题解决Invalid bound statement (not found)

Posted 如果你不按照想的方式去活,那你终将按照活的方式去想

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis配置问题解决Invalid bound statement (not found)相关的知识,希望对你有一定的参考价值。

首先这个异常的原因是系统根据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>

由于一个数据库只是查询,所以这边并没有配置事务。

以上是关于Mybatis配置问题解决Invalid bound statement (not found)的主要内容,如果未能解决你的问题,请参考以下文章

spring boot配置mybatis出现Invalid bound statement (not found)报错的解决办法

解决Mybatis的invalid bound statement (not found)异常

mybatis plus Invalid bound statement (not found) 解决方案

mybatis错误:Invalid bound statement (not found)

MyBatis 诡异的Invalid bound statement not found 错误

SpringBoot 整合Mybatis报错(Invalid bound statement (not found))