MyBatis源码分析(二)-----具体SQL执行逻辑源码分析

直接看获取SQL时调用的方法

首先看入口

-->org.apache.ibatis.session.defaults.DefaultSqlSession#getMapper

继续深入可以看到调用的mapperRegistry.getMapper(type,sqlSession)这个函数,

在MapperRegistry这个类中,getMapper的实现:

可以看到如下代码是通过动态代理获取的,SqlSession作为被代理的对象,type作为key去Map中拿MapperProxyFactory来生产代理类所需要的参数

点进mapperProxyFactory.newInstance(sqlSession)方法内部可以看到一个动态代理的方法

进入MapperProxy构造函数,看到有一个invoke方法,这个是动态代理的执行方法(这个应该都知道),继续看invoke方法:

invoke中有两个方法,cachedMapperMethod和execute

cachedMapperMethod通过名字可以知道,是查找缓存的方法,如下:

如果缓存已经存在,就返回该mapperMethod,如果不存在就放入缓存

这里要敲竹杠,划重点,最终sql是由mapperMethod.execute执行数据库操作,源码如下:

看着代码很多,其实就是对CRUD进行判断,执行相应的操作逻辑,

在这是就能看到sqlSession.selectOne方法,点进该方法,发现底层是调用的selectList方法,也能发现一点,selectOne和selectList是没有本质区别的

顺着进入selectList源码,在DefaultSqlSession中有如下实现,实际上CRUD的操作是交给Excetor去实现的

顺着代码一步步深入到org.apache.ibatis.executor.BaseExecutor,从这里获得了sql,query去执行

扒开层层关系,追踪到了simpleExecutor.doQuery中:

BaseExecutor.query --> BaseExecutor.queryFromDatabase --> SimpleExecutor.doQuerydoQuery代码如下:在这里StatementHandler封装了Statement, 让 StatementHandler 去处理在这里终于找到了执行的源头PreparedStatement,而且结果由resultSetHandler去处理

到这里mybatis执行sql语句的源发就分析完成了,如果文章有错误,请就是留言,我会验证后及时改正,谢谢!

猜你喜欢

转载自blog.csdn.net/rongshisuo/article/details/89638431