mybatis执行器

MyBatis就是针对JDBC做了一层封装,关于JDBC执行流程,详见:JDBC执行流程

主要涉及四部分:

  • 动态代理 MapperProxy
  • Sql会话 SqlSession
  • mybatis执行器 Executor
  • JDBC处理器 StatementHandler

MyBatis执行流程:

MyBatis执行流程

MyBatis执行器

sqlsession与excutor

BaseExecutor

  • 公共功能:

    • 一级缓存
    • 获取连接
  • 方法:

    • query -> doQuery(接口)
    • update -> doUpdate(接口)
      BaseExecutorquery,update是具体方法,可以进行一级缓存操作,然后调用具体实现类的doQuerydoUpdate方法查询

SimpleExecutor

doQuery/doUpdate:
使用SimpleExecutor,无论执行的SQL是否一样每次都会进行预编译,每次都创建一个新的PrepareStatement

ReuseExecutor

doQuery/doUpdate:
使用ReuseExecutor,多次执行,若执行的SQL一样则会预编译一次

ReuseExecutor内部维护了一个HashMap(statementMap,以执行的sql为key,以Statement为value),如果执行的sql相同,则会命中statementMap中的数据,不会构建新的PrepareStatement,进而减少编译

BatchExecutor

doUpdate:
BatchExecutor只针对非查询语句(doUpdate)才有编译优化,若执行的sql与前一条执行的sql一致且与前一条对应的MapperStatement一致,才会开启编译优化
否则执行几次就会编译几次,创建新的PrepareStatement