MyBatis就是针对JDBC做了一层封装,关于JDBC执行流程,详见:JDBC执行流程
主要涉及四部分:
- 动态代理 MapperProxy
- Sql会话 SqlSession
- mybatis执行器 Executor
- JDBC处理器 StatementHandler
MyBatis执行流程:
MyBatis执行器
BaseExecutor
公共功能:
- 一级缓存
- 获取连接
方法:
- query -> doQuery(接口)
- update -> doUpdate(接口)
BaseExecutor中query,update是具体方法,可以进行一级缓存操作,然后调用具体实现类的doQuery与doUpdate方法查询
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

