Mybatis中注册和获取mapper(动态代理)

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类执行的逻辑 功能

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容