前言
1.Maven/Gradle默认的web目录结构
若我们没有在pom.xml/build.gradle中显示设置resources/sourceSets,则Maven/Gradle默认的项目目录结构:
src
main
java // source 根目录
resources // resources 根目录
test
java // test source 根目录
resources // test resources 根目录
在gradle中,等效于在build.gradle里有以下配置:
sourceSets {
main {
java {
srcDirs = ['src/main/java']
}
resources {
srcDirs = ['src/main/resources']
}
}
test {
java {
srcDirs = ['src/test/java']
}
resources {
srcDirs = ['src/test/resources']
}
}
}
当然,我们可以不使用默认的目录结构,这是就需要自定义sourceSets,譬如:
sourceSets {
main {
java {
srcDirs = ['src/java']
}
resources {
srcDirs = ['src/resources']
}
}
}
若我们只是想在默认的sourceSets的基础上新增一些目录,就可以这么写:
sourceSets {
main {
java {
srcDir 'otherDir/src/main/java'
}
}
}
问题
Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xx.dao.SysSettingMapper.findAll
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:189)
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:43)
at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:58)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:51)
at com.sun.proxy.$Proxy38.findAll(Unknown Source)
at com.xx.service.impl.SysSettingServiceImpl.findAllSysSetting(SysSettingServiceImpl.java:30)
原因
报错的原因时因为在编译输出目录没有找到mapper文件
mapper文件在源码中的src/main/java中:
那么我们的mapper文件为什么没有被编译输出呢?因为idea在构建Maven/Gradle项目时,默认只会编译src/main/java下的java文件和src/main/resource的资源文件。而src/main/java下的资源文件会被忽略!
解决
Maven中
[pom.xml]
<resources>
<resource>
<!--- 指定目录 ---->
<directory>src/main/java</directory>
<includes>
<!--- 指定xml文件---->
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
Gradle中
见Idea中Gradle插件的“Build and run“设置项,文章中名为"mapperXmlCopy"的task
总结
所以为了避免这个问题导致浪费时间,最好不要将mapper文件放在java目录下,而是放在resources目录下。
其它
参考https://blog.csdn.net/Icannotdebug/article/details/83081745
参考https://blog.csdn.net/qq_43519310/article/details/89388068