Type interface org.apache.ibatis.dao.UserMapper is not known to the MapperRegistry.
今天来聊聊type interface org.apache.ibatis.dao.UserMapper is not known to the MapperRegistry.
这个错误
完整错误
没有找到具体的MapperRegistry。
解决方案
- 查看一下自己的mappers 是否正确,如果配置正确了可以看看mapper.xml文件和自己的dao接口是否在同一目录(两种配置方式)
- 如果配置的目录在resource上,那么检查一下生成的target classes文件是否有加载到配置的mapper.xml,(注意配置的文件夹也需要和对应的dao在同一层)
如果没有加载到的话我们可以在maven配置上
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
问什么要这么做呢?我们去看看源码
这是mybatis用来读取我们标签配置的方法,我们现在主要关注configuration.addMappers,通过读取我们配置的标签比如匹配到了mapper里面的配置的package属性就会走到configuration.addMappers这个方法的注册我们的mapper。
接下来继续看,后面走到了addMappers这个方法中,可以看到resolverUtil.find(new ResolverUtil.IsA(superType), packageName);
我们走进这个方法看看。
这个方法其实主要做的事情就是根据我们 标签读取这个包下面所有的文件
底层其实就是通过**classLoader().getResource()**方法获取资源信息
parent其实就是我们的ClassLoader,这边就在递归获取下面的资源,可以看到他获取到了我们mapper文件下面所有的资源了,由于我的dao接口文件不在这个目录下以
导致了在knownMappers中获取不到具体的dao文件所以就发生了报错,所以这就是为什么配置mapper.xml和dao接口需要再同一个文件夹下面了。