mybatis的神奇之处在于,你只用提供一个mapper接口以及一个对应的xml文件。mybatis就能自动的完成映射,并根据xml文件的描述,生成接口的实现类(代理)。本文就来看看mytatis怎么替我们完成这项工作。
1. Configuration相关属性
读过我这篇文章 SqlSessionFactory构建过程 的人应该知道,在SqlSessionFactory的构建过程中,完成了对配置类Configuration的组装。其中一个相当重要的过程就是解析配置文件中的mapper子节点。在解析mapper节点时,mybatis会将配置文件注册的接口或者映射文件信息封装到configuration中。我们先看看与这个过程相关的一些属性
public class Configuration {
// 这是一个HashMap ,存放的是已经解析过的sql声明,
//键存放的是接口接口的方法的全类名,值存放的是MappedStatement对象
//MappedStatement由映射文件解析得到
protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection");
//这里存放的是已经加载解析过的 映射文件的文件名
protected final Set<String> loadedResources = new HashSet<String>();
//MapperRegistry其中维护了一个 Map<Class<?>, MapperProxyFactory<?>> knownMappers
//我们的mapper接口被注册到这里,Class<?>就是我们接口的类型
//MapperProxyFactory<?>是生成这个接口代理对象的一个工厂
protected MapperRegistry mapperRegistry = new MapperRegistry(this);
}
2. mapper配置的解析
接下来看看mapper配置的解析过程
private void mapperElement(XNode parent) throws Exception {
if (parent != null) {
//遍历 mappers节点下的子节点
for (XNode child : parent.getChildren()) {
//解析 package 子节点
if ("package".equals(child.getName())) {
String mapperPackage = child.getStringAttribute("name");