MyBatis 的 mapper-locations 引发的

概要

MyBatis 的 mapper-locations 引发的。

博客

博客地址:IT老兵驿站

正文

之前做项目,用的是 eclipse,项目是 gradle 管理的 SpringMVC 的项目,使用到 MyBatis,Mapper 的 Java
文件和实现的 xml 文件放在一个目录下就可以,不需要做额外的工作。

最近使用 Idea 开发 Maven 管理的 SpringBoot 项目,发现 xml 文件和 Mapper 文件没有放在一起,xml 文件单独放在了 resources 目录下面,这种放置方式,让我感觉很不习惯,接口和实现放在了两个不同的地方。

于是,我把 xml 移动到了 Mapper 的目录下,这个时候,问题产生了,编译时找不到 xml 文件了,我觉得这可能是 SpringBoot 的问题,根据这个查找关键字,找到了 Mybatis 手册,这里面需要修改一项配置:

mapper-locations Locations of Mapper xml config file.

因为使用的文件是 application.properties,所以相对应的配置项就是 mybatis.mapper-locations,如果是别的配置文件(xml 或者 yml),配置项的名称又有区别。(这里其实就是 Java 项目的一个难点,发展的时间长了,太多沉淀下来的东西,原因已经不被人知道了)

将这个地方修改成 xml 所在的包,编译,发现仍然报告错误,这个时候,在网上没有了对于这个问题明确的答案了,只能自己尝试了。

参考这里,换了一种写法:
在这里插入图片描述
这种写法,说是 Ant-style, 从 Ant 借鉴过来的,可以扫描所有 sample.config.mappers 下面的包。

查了 Ant 的官网,Ant-style 好像仅仅是说 “*” 是会递归当前目录及子目录,而没有说“classpath” 的意思。

继续检索,在这里找到了说法:
在这里插入图片描述
这里的意思是说,classpath*:conf/appContext.xml 是指所有在 classpath 下面的 conf 目录下的 appContext.xml 都会被检索,并且合并为一个文件。

而 Spring 的官网的 resources 的介绍对此有很详细的讲解。

但是,哪怕使用了上面这样带有通配符的方式,还是找不到 xml 文件,这个时候,我开始怀疑 Idea 并没有把 xml 拷贝到被查找的目标位置,于是,我手动把 xml 拷贝到 target 下面相应的路径下,这时,编译成功。

带着这个结论,再去研究 Maven 的文档(而另外一篇对于 pom 的学习,刚好就忽略了对于 resources 的学习,认为不重要),大概就明白了,Idea 在执行 Maven 的编译,并没有拷贝 resources 目录之外的资源,需要手动配置一下,但是感觉 eclipse 是默认就会拷贝过去的。

总结

这个问题,大体搞明白了,还有一些细节,还需要进一步细化。发现,Java 的很多问题,有可能会牵扯到好几个框架,牵扯到一些历史原因,想找到原因,还真是不简单

参考

https://stackoverflow.com/questions/3294423/spring-classpath-prefix-difference
https://maven.apache.org/pom.html#Resources
https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/resources.html#resources-classpath-wildcards
https://mybatis.org/spring/factorybean.htmlhttps://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure