本篇文章,我们来讲mybatis中最核心的配置mappers.
先来看看mappers标签的用法:
<mappers><mapperresource="org/mybatis/builder/AuthorMapper.xml"/><mapperurl="file:///var/mappers/AuthorMapper.xml"/><mapperclass="org.mybatis.builder.AuthorMapper"/><packagename="org.mybatis.builder"/></mappers>
我们直接来看mapperElement(root.evalNode(“mappers”))方法:
privatevoidmapperElement(XNode parent)throws Exception {if (parent !=null) {// 遍历mappers下所有子标签for (XNode child : parent.getChildren()) {if ("package".equals(child.getName())) {// 当子标签为package时,使用configuration的addMappers方法添加mapper
String mapperPackage = child.getStringAttribute("name");
configuration.addMappers(mapperPackage);
}else {
String resource = child.getStringAttribute("resource");
String url = child.getStringAttribute("url");
String mapperClass = child.getStringAttribute("class");if (resource !=null && url ==null && mapperClass ==null) {// 在mapper标签中使用resource时,使用XMLMapperBuilder的parse方法解析
ErrorContext.instance().resource(resource);
InputStream inputStream = Resources.getResourceAsStream(resource);
XMLMapperBuilder mapperParser =new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments());
mapperParser.parse();
}elseif (resource ==null && url !=null && mapperClass ==null) {// 在mapper标签中使用url时,使用XMLMapperBuilder的parse方法解析
ErrorContext.instance().resource(url);
InputStream inputStream = Resources.getUrlAsStream(url);
XMLMapperBuilder mapperParser =new XMLMapperBuilder(inputStream, configuration, url, configuration.getSqlFragments());
mapperParser.parse();
}elseif (resource ==null && url ==null && mapperClass !=null) {// 在mapper标签中使用class时,使用configuration的addMappers方法解析
Class<?> mapperInterface = Resources.classForName(mapperClass);
configuration.addMapper(mapperInterface);
}else {thrownew BuilderException("A mapper element may only specify a url, resource or class, but not more than one.");
}
}
}
}
}
从上述代码中我们可以看出,最终是使用Configuration的addMappers方法或者XMLMapperBuilder的parse方法去解析.
可以看出,当mapper引用的是一个类时,会使用Configuration的addMappers方法进行加载,当mapper引用的是一个xml文件时,会使用XMLMapperBuilder的parse方法进行加载.
接下来我们将单独来讲讲这两个方法的加载过程.