在使用 Mybatis 时,Mapper 的配置文件一定要在全局配置文件中注册,否则Mybatis 无法完成 Mapper 接口的实现。不管是用何种方式注册,可以单独一个个
<!-- 注册 UserRepository.xml -->
<mappers>
<mapper resource="com/southwind/repository/UserRepository.xml"/>
</mappers>
也能扫描整个包的方式。
但为什么要做这样注册呢?
其实是为了jdk代理时,根据目标对象(接口),获取对应的 mapper.xml 。
比如 UserDao.java 获取对应的 UserDao.xml ,获取原理如下:
public static String getMapperXml(String className){
String xml = "";
SAXReader reader = new SAXReader();
Document document;
try {
document = reader.read("src/config.xml");
Element root = document.getRootElement();
Iterator iter = root.elementIterator();
while(iter.hasNext()){
Element mappersElement = (Element) iter.next();
if("mappers".equals(mappersElement.getName())){
Iterator iter2 = mappersElement.elementIterator();
while(iter2.hasNext()){
Element mapperElement = (Element) iter2.next();
//com.southwin.dao.UserDAO . 替换 #
className = className.replace(".", "#");
//获取接口结尾名
String classNameEnd = className.split("#")[className.split("#").length-1];
String resourceName = mapperElement.attributeValue("resource");
//获取resource结尾名
String resourceName2 = resourceName.split("/")[resourceName.split("/").length-1];
//UserDAO.xml . 替换 #
resourceName2 = resourceName2.replace(".", "#");
String resourceNameEnd = resourceName2.split("#")[0];
if(classNameEnd.equals(resourceNameEnd)){
xml="src/"+resourceName;
}
}
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
return xml;
}
因为 split 不能传「.」作为参数,所以将「.」替换成「#」
简单来说就是,循环遍历所有注册的Mapper.xml,然后将传入的接口名和 Mapper 名比较,如果一致就返回对应的 Mapper.xml 地址。
以上代码笔记内容来自付费专栏:案例上手 Spring 全家桶
PS:并没有透露关键内容,纯粹是零碎笔记。如果侵犯版权,请联系我。
本文由老郭种树原创,转载请注明:https://guozh.net/spring-mybatis-mapper/