springboot注意事项org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
xml和properties文件不包含在target中,想要包括在target则需要在Pom文件
<build>标签中加入下面的配置
<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.*</include> </includes> <filtering>false</filtering> </resource> </resources>
<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.*</include> </includes> <filtering>false</filtering> </resource> </resources>
今天搭建springMVC+spring+mybatis maven项目,总是出现
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)错误,调试了好久都没解决问题,新手的心酸也只有新手才能体会了。最后我去target目录下看了下,发现自己写的mapper.xml,原来maven项目的约定配置文件必须放resources里,src目录下的xml文件默认不会编译到target。由于我把mapper.xml放在了src目录里,才导致了错误的发生,该问题的实质是,idea对classpath的规定。在eclipse中,把资源文件放在src文件夹下,是可以找到的;但是在idea中,直接把资源文件放在src文件夹下,如果不进行设置,是不能被找到的。
原来Maven 为我们提供了一致的项目目录配置(源文件夹、资源文件夹等),在自动构建项目时, Maven 会按照这个配置来执行操作(编译源文件、拷贝资源文件),Maven 默认的源文件夹及资源文件夹的配置代码如下:
<build>
<sourceDirectory>src/main/java</sourceDirectory >
<testSourceDirectory>src/test/java</testSourceDirectory >
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
</testResources>
</build>
解决方案有2种:
1、可以把xml文件放到resource目录下,这样项目构建的时候会加载到target。
2、在pom.xml文件build添加resource资源列表。
<!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。-->
<resources>
<resource>
<!-- 描述存放资源的目录,该路径相对POM路径-->
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
问题
在使用idea做springboot开发的时候,遇到Invalid bound statement (not found): com.example.springbootssmtest.mapper.UsersMapper.insertUser,但是mybaits、xml文件语法无误,接口和xml文件的路径对应无误,主程序也使用@MapperScan(“com.example.springbootssmtest.mapper”)对接口进行了扫描。idea提示上述异常,说明接口方法没问题,问题在于xml文件
原因
通过查阅相关资料发现,IDEA对xml文件处理的方式不同,在Eclipse中dao文件与mapper.xml文件只要在同一级目录下即可,但是在IDEA中,mapper.xml要放在resources目录下,且还有一个关键的地方是什么吧?就是resources下不能创建package,只能创建Directory,文件夹下面要想创建文件夹,就不能以(.)的形式,例如com.example.springbootssmtest.mapper,在src目录下可以创建package这样连着写包名,但是在resources下面就不能这样写了,这样写的话,就相当于这个文件夹的名称是“com.example.springbootssmtest.mapper”
,而不是com/example/springbootssmtest/mapper
。
解决办法1
在resources下一级一级的创建directory,先建com,然后在com下创建example,然后在example下创建。。。
创建完成directory后,在里面添加xml文件便可。
解决办法2
将接口方法和xml文件放到一起,在mapper接口上添加@mapper注解
主程序添加接口扫描@MapperScan(“com.example.springbootssmtest.mapper”)
解决办法3
直接在resources下创建一个名字为mapper的directory,然后在配置文件里添加mybatis.mapper.locations配置