直接看获取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.doQuery
doQuery代码如下:在这里StatementHandler封装了Statement, 让 StatementHandler 去处理
在这里终于找到了执行的源头PreparedStatement,而且结果由resultSetHandler去处理
到这里mybatis执行sql语句的源发就分析完成了,如果文章有错误,请就是留言,我会验证后及时改正,谢谢!