执行流程图(不包含缓存)
1:使用Mapper接口调用具体方法,会调用到Mapper接口的代理实现类MapperProxy.invok方法
2:MapperProxy.invok根据method信息找到MapperMethod(每一个mapper.xml文件的方法都会对应一个MapperMethod),MapperMethod执行mapperMethod.execute(sqlSession, args),参数sqlSession是sqlSessionTemplate对象
3:MapperMethod.execute方法中调用sqlSession.selectOne(举例),sqlSession实际是sqlSessionTemplate对象,因此会调用到SqlSessionTemplate的selectOne()方法
4:SqlSessionTemplate.selectOne()方法会调用它的实例变量SqlSession sqlSessionProxy的selectOne方法
5:sqlSessionProxy对象执行selectOne时会调用代理对象的invok方法,在invok方法里会重新获取SqlSession对象(如果有事务,并且已经存在了sqlsession对象会复用,否则创建新的对象)
6:执行SqlSession对象(默认DefaultSqlSession)的selectOne方法,最后执行DefaultSqlSession的selectList方法
7:DefaultSqlSession.selectList,先获取MappedStatement对象,对应到mapper.xml文件的方法,调用Executor.query方法,Executor对象是从哪里来的,是在创建DefaultSqlSession时根据ExecutorType创建,插件部分单独开一篇来说明
8:之后调用到SimpleExecutor.query(MappedStatement ms, Object parameter, RowBounds rowBounds, BoundSql boundSql)方法,
9:之后获取StatementHandler(也有插件逻辑),通过StatementHandler获取真正的statement,这一步咱们可以看下getConnection时参数参入了statementLog,看看作用是什么
可以看到如果日志级别是debug,它会创建一个connection的代理类
不难猜测返回的代理类在执行方法附近应该是做了日志的输出。
10:通过statementHandler执行查询,实际是调用了statement的execute方法,最后通过resultSetHandler处理数据查询的返回值。