一、问题描述
上班第一天同事新拉的代码报了mybaits 映射不到 xml文件,报错如下
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
com.pubinfo.smart.script.dao.ScriptMapper
二、问题分析
出现这种错误,首先检查一下自己的xml文件中的namespace、id、resultMap等属性有没有写错,我检查了一下,应该都是正确的。
然后再检查下配置文件中的mybatis配置中的mapper-locations、type-handlers-package、typeAliasesPackage相关配置也是没问题。
最后我突然想到了是否是编译的时候出问题,然后就去查看了target文件,看到mapper.xml没有编译进去。
这下问题就找到了。
三、错误原因
这个错误是maven默认加载机制造成的问题。maven加载时候,把java文件夹里面.java类型文件进行编译,如果是其他类型文件,则不会被加载。dao层编译后只有class文件,没有mapper.xml,因为maven工程在默认情况下src/main/java目录下的所 有资源文件是不发布到target目录下的。
四、解决方法
1、把mybatis的xml文件直接复制到target目录中
该方法可以解决问题,不过太麻烦了,每次都要手动复制,不太推挤使用。
2、把xml文件放在resources目录下
虽然该方法会在编译时会编译resources下的文件,但是会破坏代码的整体结果,维护相对比较麻烦,所以同样不太推荐。
3、通过配置解决(推荐使用)
在pom.xml 中进行如下配置:
<build>
<resources>
<resource>
<directory>${basedir}/src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
通过以上方法即可解决mybaits 映射不到 xml文件的问题,有什么不对的欢迎补充。