天天看点

Invalid bound statement (not found),对应mapper的某个方法(getUserInfo)未找到

转载转载转载:https://www.cnblogs.com/ewwwe/p/6181872.html

在mapper代理的开发中,程序员需要遵守一些规范,mybatis才能实现mapper接口的代理对象。 

它的规范如下:

  • mapper.xml的namespace要写所映射接口的全称类名。
  • mapper.xml中的每个statement的id要和接口方法的方法名相同
  • mapper.xml中定义的每个sql的parameterType要和接口方法的形参类型相同
  • mapper.xml中定义的每个sql的resultType要和接口方法的返回值的类型相同
  • mapper.xml要和对应的mapper接口在同一个包下
  • mapper.xml的命名规范遵守: 接口名+Mapper.xml

如果以上检查完毕,项目都遵守了上述的规范,而且你的项目是Maven项目。但是运行程序还是会出现Mybatis invalid bound statement(not found)的问题,这个时候就需要修改pom.xml文件了。在pom.xml中添加如下的代码:

<build>    
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <!-- 此配置不可缺,否则mybatis的Mapper.xml将会丢失 -->
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <!--指定资源的位置-->
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.yml</include>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>
           

这个连接里面讲的很全面,几乎 包含了所有要注意核对的点,请优先看这个链接。

对以上链接的补充:配置文件中 需要以下配置

mybatis:
  #com.chinacaring.jianhuoracleservice.dao.mapper
  mapper-locations: classpath:com/chinacaring/jianhuoracleservice/dao/mapper/**/*.xml
           

一、问题描述

项目使用多个模块构建,其中 B模块依赖于A模块,A模块中有mapper 和对应的xml用于查询数据。但是启动项目之后,报如下错误:Invalid bound statement (not found): com.chinacaring.user.dao.mapper.UserMapper.getUserInfo

开始以为 没有加上mapperscan 未扫描对应的mapper,后来加上后还是同样的问题。

二、原因和解决方法

原因在于 和mapper相互绑定的 .xml文件不是代码,无需编译,但是需要指定在编译时 将 指定的资源文件(此处为 .xml文件)拷贝到对应目录下(此处应当为 编译好之后 类文件的对应目录)

在 pom中加入:

<build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
          
    </build>
           

指定将 src/main/java目录下 匹配 **/*.xml格式的 文件 拷贝到 编译后的类文件相同目录下

不加之前 target的结构

Invalid bound statement (not found),对应mapper的某个方法(getUserInfo)未找到

加了拷贝资源的build之后

Invalid bound statement (not found),对应mapper的某个方法(getUserInfo)未找到

可见 指定的xml资源文件被 拷贝进来了,这样,再次运行 就可以找到mapper所绑定xml文件,并执行相应的操作了

最后贴一下项目完整的POM文件结构:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.16.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>

        <mybatisplus-spring-boot-starter.version>1.0.4</mybatisplus-spring-boot-starter.version>
        <mybatisplus.version>2.1-gamma</mybatisplus.version>
    </properties>

    <dependencies>

    </dependencies>

    <repositories>
        
    </repositories>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.yml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>


</project>
           

继续阅读