ennnn这个标题有点长,但是好像必须取这个长,关键词:IDEA、mybatis、接口、映射文件
我也是不小心掉进这个坑的,花了一下午搞定明白。
在写Mybatis项目中,我们知道在mybatis配置文件中需要加载mapper映射文件。
加载映射文件有四种方式:
1.resource方式加载映射文件
<mappers>
<!-- 这是resource方式加载配置文件 -->
<mapper resource="sqlmap/UserMapper.xml"/>
</mappers>
2,class方式:这里需要注意:接口类和映射文件放在同一个目录下,并文件名要一致
<mappers>
<!-- class方式加载配置文件:class指定的是 mapper接口的地址
但是这时候就需要将接口类 和映射文件放在同一个目录下-->
<mapper class="com.mo.mapper.UserMapper"/>
</mappers>
3.包扫描加载映射文件 : 接口类 和映射文件放在同一个目录下,并文件名要一致
<mappers>
<!-- 批量mapper的扫描 -->
<package name="com.mo.mapper"/>
</mappers>
4.使用本地文件(不推荐)
<mappers>
<mapper url="file:///c:/mapper/UserMapper.xml"/>
</mappers>
问题
一开始我是用第一种方式resource来加载映射文件的,一切都没有什么问题。
当我在整理笔记的时候,在使用java代码创建SqlSessionFactory时,实际上是用第二种方式来加载映射文件的。
问题就来了,使用class来加载映射文件的前提是,接口类和映射文件放在同一个目录下。(这又跟IDEA要求把配置文件放在resource目录下相矛盾,把java代码放在resource又不行)
当你使用IDEA编译器的时候,这样做其实是不行的,原因是IDEA编译后默认会把resource下的文件放到target的classpath下,但是src下的只有Java文件编译生成.class文件放入classpath下,其他文件会忽略的。
也就是说,放在mapper下的StudentMapper.xml是会被忽略的。
编译查看target/classes下的目录:
就可能会报这种错误,Invalid bound statement (not found): com.mapper.StudentMapper.getStudent
Exception in thread "main" org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.mapper.StudentMapper.getStudent
at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:196)
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:44)
at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:59)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:52)
at com.sun.proxy.$Proxy0.getStudent(Unknown Source)
at com.mybatis.Main.main(Main.java:59)
进程完成,退出码 1
解决方案
其实这些问题在eclipse中是不会出现的(我就记得我这样写过,还翻了之前的项目,网上的博客都可以我就不行,原来我用IDEA)解决方案就是让IDEA不要忽略src目录下的xml文件,在pom.xml文件中添加代码
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
在pom.xml加代码后,重新编译运行:
总结
这个问题是在上面网站得到解决的,他说的问题跟我一样,他最大的问题就是团队合作。如果团队用Git来管理项目,同步的时候就会出现问题。一个人eclipse一个人用IDEA的话,eclipse可以通过接口加载映射文件,而且Mapper类和Mapper.xml文件可以放在同一目录下。但是IDEA不行,IDEA需要在pom.xml再进行配置。这一方面也要注意,最好就是使用同一款编辑器,也可以避免其他的麻烦。