在使用mybatis的时候,发现了一个诡异的问题,调用dao层方法时一直报异常
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.example.dao.UserDao.select
异常解释为:mybatis找不到UserDao中select方法对应的sql文件
经过测试,发现所有dao的所有方法都是这个异常,由此判定应该是xml文件加载有问题。继续排查,发现项目src/main目录下有2个文件夹,一个是java文件夹,一个是resources文件夹。而恰好:
项目的dao接口放在java文件夹下的com/example/dao/目录。
对应的xml文件放在resources文件夹下的com/example/目录。
此时对应的mybatis.mapper-locations配置为:
mybatis.mapper-locations = classpath:com/example/*.xml
本意是想加载resources目录下的com/example/下的所有xml文件,但是由于java和resources目录都有com/example目录,而上述配置在有相同目录的情况下,默认扫描的是java目录下的文件,从而导致xml文件加载不到。
解决办法:
1、修改xml位置,避免上述情况发生
2、修改mybatis.mapper-locations配置,使用classpath*
mybatis.mapper-locations = classpath*:com/example/*.xml
classpath各种写法及区别:
1、classpath:xxx 和 classpath:/xxx 是一样的
2、classpath:xxx 和 classpath*:xxx 是不一样的,前者表示引入一个,后者表示引入多个。
当项目中有多个classpath路径时,如果不加*则表示仅加载第一个classpath路径,加了*则加载所有(包含jar包中的)