解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
作为新手在学习SpringBoot时,为了用复杂sql语句去使用xml配置sql的参数,结果遇到了这样的异常,网上搜索到原因是Mapper.java文件与Mapper.xml文件对应信息不在这里插入代码片一致,解决方案如下:
1:检查两个文件是否在同一个包中(如果有指定xml文件,则不需要考虑这点)
2:检查xml文件的namespace是否和xml文件的package名称一一对应
3:检查函数名称与xml文件中的id能否对应上
4:检查函数的参数类型以及返回类型与xml文件能否对应上
5:去掉xml文件中的中文注释
6:随意在xml文件中加一个空格或者空行然后保存
上述方法都排除了之后,搜到其他解决方案。因为我是将xml文件放在resources目录下的,可能是因为IDEA没有扫描到resources目录中*Mapper.xml文件,同时无法将配置文件加载到classes目录下,这种情况的解决方案:
<build>
<resources>
<!-- maven项目中src源代码下的xml等资源文件编译进classes文件夹,
注意:如果没有这个,它会自动搜索resources下是否有mapper.xml文件,
如果没有就会报org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.pet.mapper.PetMapper.selectByPrimaryKey-->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!--将resources目录下的配置文件编译进classes文件 -->
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
然而上面各种方法试了都没有用,target的dao文件下面还是只有class文件,没有xml文件
调了两天,走投无路,去pom.xml中看了下配置,发现有一个依赖的配置是这样的:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
发现其他依赖大多没有<scope>
,而这里多出了一个<scope>runtime</scope>
(当初是在spring官网生成的包,就没想着要改)于是去查它是什么意思:
scope标签参数:
- compile
默认的scope,表示 dependency 都可以在生命周期中使用。而且,这些dependencies 会传递到依赖的项目中。适用于所有阶段,会随着项目一起发布 - provided
跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。这个scope 只能作用在编译和测试时,同时没有传递性。 - runtime
表示dependency不作用在编译时,但会作用在运行和测试时,如JDBC驱动,适用运行和测试阶段。 - test
表示dependency作用在测试时,不作用在运行时。 只在测试时使用,用于编译和运行测试代码。不会随项目发布。 - system
跟provided 相似,但是在系统中要以外部JAR包的形式提供,maven不会在repository查找它。
说实话,没看懂,以后再说吧,把<scope>
这个标签删掉,更新Maven工程,重新编译,xml文件神奇的出来了,问题解决: