报错详情:
Spring+Mybatis项目,正常启动没问题,在使用Junit测试的时候,Mybatis找不到对应的SQL的XML文件。报错信息如下
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
解决方法:
- 原Mybatis扫描XML的配置
<property name="mapperLocations" >
<list>
<value>classpath:com/modules/**/mapper/*.xml</value>
</list>
</property>
- 更改之后Mybatis扫描XML的配置
<property name="mapperLocations" >
<list>
<value>classpath*:com/modules/**/mapper/*.xml</value>
</list>
</property>
即:classpath
改为 classpath*
原因:
classpath本质是jvm的根路径,jvm获取资源都是从该根路径下找的,注意这个根路径是个逻辑路径,并不是磁盘路径。比如两个jar包的路径是/a/a.jar和/b/b.jar,但是用classpath*:就可以找到这两个jar包中的资源。
一般classpath指向的是classes,也就是编译路径的根路径,而一般classes中放着这些文件:
1.java文件编译好的class文件。
2.properties配置文件。
3.xml配置文件。
4.一些模版文件,如*.ftl。
5.其他需要用classpath获取到的文件。
搞懂了classpath指向的classes里放的东西,我们再来看看classpath: 和classpath*:的区别。
1.classpath:只会到你的classes路径中查找找文件。
2.classpath*:不仅会到classes路径,还包括jar文件中(classes路径)进行查找。