首页 资讯 社群 我的社区 搜索

关于org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 提示错误的问题

高大上
2019-07-21 13:07:21

最近遇到一个问题,一段逻辑执行时提示

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)问题。

开始我以为的sql语句返回值的问题,或者xml文件的resultType设置错误,或者中间携带了不可见的空格。

检查了很久也没发现问题。网上帖子大部分的都说时resultType设置的问题。

--------------------------------------------------------------

我测试过了,springboot在启动时就会扫描全部的xml文件。如果你的resultType设置为不存在的bean,项目会直接报错,无法启动。如图

传统的ssm框架下会不会有这个错误,我没测试。我估计应该也是有的。所以BindingException: Invalid bound statement (not found)不会是resultType的问题。

当我点开mybatis源码时发现如下代码:

public SqlCommand(Configuration configuration, Class<?> mapperInterface, Method method) {
      final String methodName = method.getName();
      final Class<?> declaringClass = method.getDeclaringClass();
      MappedStatement ms = resolveMappedStatement(mapperInterface, methodName, declaringClass,
          configuration);
      if (ms == null) {
        if (method.getAnnotation(Flush.class) != null) {
          name = null;
          type = SqlCommandType.FLUSH;
        } else {//该异常在这里抛出。该异常发生在sqlCommand阶段。MappedStatement为null时
          throw new BindingException("Invalid bound statement (not found): "
              + mapperInterface.getName() + "." + methodName);
        }
      } else {
        name = ms.getId();
        type = ms.getSqlCommandType();
        if (type == SqlCommandType.UNKNOWN) {
          throw new BindingException("Unknown execution method for: " + name);
        }
      }
    }

我们可以分析一下:当resultType映射无效bean无效时,项目不能启动。resultType映射有效bean时,映射赋值动作发生在sqlCommand之后。因此不可能是resultType映射的问题。

而MappedStatement 为空,意味着spring无法扫描到对应的这个sql语句。

我这里的问题是:spring可以完成对dao的初始化,但是无法发现接口对应的sql语句映射。检查后发现,我的mybatis全局配置xml文件位置为:

mybatis.mapper-locations=classpath:mybatis/mappers/*Mapper.xml
可是我新加的xml文件却不是以Mapper.xml结尾的(粗心大意忘记了)。结果就是用注解直接写在接口上的语句时正常的,在xml中的sql语句就会提示无效的绑定语句。

----------------------------------------
感觉我的观念要转变一下了,以前遇到问题就喜欢百度。发现好多帖子都是互相抄袭,都没自己验证过。感觉现在已经有阅读源码的能力了,是时候提升下英语能力,让后放弃百度了

 

用户评论