使用IDEA创建的mybatis通过mapper接口加载映射文件

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加代码后,重新编译运行:

总结

https://www.v2ex.com/t/377927

这个问题是在上面网站得到解决的,他说的问题跟我一样,他最大的问题就是团队合作。如果团队用Git来管理项目,同步的时候就会出现问题。一个人eclipse一个人用IDEA的话,eclipse可以通过接口加载映射文件,而且Mapper类和Mapper.xml文件可以放在同一目录下。但是IDEA不行,IDEA需要在pom.xml再进行配置。这一方面也要注意,最好就是使用同一款编辑器,也可以避免其他的麻烦。

  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值