1.在configuration中构建mapperRegistry对象,扫描mapper包,以mappper.class作为参数构造MapperProxyFactory
2.注册MapperProxyFactory到MapperRegistry中的Map, MapperProxyFactory> knownMappers
3.从mapperRegistry中getMapper(sqlsession中调用)
从knownMappers获取MapperProxyFactory
4.调用MapperProxyFactory.newInstance获得mapper返回
#1 绑定target到代理类(sqlsession才是真实代理对象(最后方法还是到它里面来执行),下文的代理对象指的是proxy代理对象)
#2 构造并且返回代理对象
5. 当代理对象mapper调用相应的数据库操作方法时,调用代理对象的invoke方法
代理对象对真实执行方法进行了优化缓存,缓存到了MapperMethod类中,每个方法被调用的时候,会调用代理类的cachedMapperMethod方法获取MapperMethod对象,如果是第一次调用方法,则会构造MapperMethod对象,并且缓存到代理对象中的private final Map<Method,MapperMethod> methodCache中;(单例模式)
6. 数据库操作方法的真实执行 真实代理发生在mapperMethod.execute(sqlSession,args);
接下来让我们看一下MapperMethod类 属性和构造方法
分为两部分(内部类),SQL命令(对应mapperXML文件中的<insert><update><delete><select>)和方法声明
真实执行方法
判断对应的操作类型和返回 传入参数调用sqlsession相应的方法
如果是select还得根据返回类型多做一层处理(判断执行sqlsession中的哪一个方法),
最后调用到的方法
逻辑
#1 通过命令名字在配置对象中获取MappedStatement对象(依赖SqlSource类----->BoundSql类(包含我们在xml写的sql语句和sql配置))
#2 传入参数向下层调用executor的方法
executor将处理真正的数据库逻辑。
将会在下一篇文章中总结executor类执行的逻辑 功能