Mybatis Sql执行流程

执行流程图(不包含缓存)

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处理数据查询的返回值。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值