论 Resources.getResourceAsStream("mybatis-config.xml") 是如何寻址的
本文最后更新于:2022年9月9日 下午
单刀直入
大家在学MyBatis的时候肯定用到了Resources.getResourceAsStream("mybatis-config.xml")这行代码
(in SqlSessionUtil)
但是有没有想过,为什么这个参数只需要写文件名就能定位呢
- 有人可能说了:这相对路径,那肯定是在同一个文件夹下嘛
非也,非也

诸君请看,他俩相隔十万八千里
猜想
首先,第一个比较莽撞的猜想,难道是根据resources的文件夹标记定位根目录的吗
非也,非也
去掉标记仍能运行
真相(Maybe)
诸君请看

观察编译后的target文件夹
java文件夹和resources文件夹 合并了
统一归并在classes文件夹下
诶,好像有那么点接近真相了,但又没有完全接近…
- 有华生可能发现盲点了:你这
SqlSessionUtil类在utils文件夹下,和mybatis-config.xml也不同级啊,怎么能相对引用
咳咳,这个呢,主要是
上代码
1 | |
这是Resources.getResourceAsStream的深层实现
1 | |
观察这几行可以发现,在获取文件失败后,会自动加上”/“再进行尝试(非常滴人性化呀)
大家都知道,加上”/“之后,就意味着从根目录进行寻址,也就找到了mybatis-config.xml(我猜根目录是classes)
咳咳,就是这样啦(maybe)
补充
其实这个知识点还可用于mybatis-config.xml的mappers配置
1 | |
一般来说,每一个映射文件都要这样写入核心配置
但是,这未免太过麻烦,因为每一个映射就要写一行
所以经常写为
1 | |
这样就可以把mapper下的所有映射文件自动写入啦
但是这么写是有两个要求的
- mapper接口和映射文件所在包一致
- mapper接口和映射文件的文件名一致
那么有人就要问了,诶,为什么包要一致啊
你这一个在java文件夹下,一个在resources文件夹下,就算内部包一致,父文件夹也不一致呀

但是结合上面的知识点,可以发现,编译后他俩就会合并

这样一来,他俩就在一个文件夹里了,寻址非常方便