SqlSession有一个默认的实现DefaultSqlSession, 在DefaultSqlSession中有一个Executor对象,对象数据的操作都是由这个Executor来完成。Executor中有三个对象来帮助他完成MappedStatement的执行工作。
StatementHandler负责从连接中获取一个Statement对象
ParameterHandler负责对Statement设置参数
ResultHandler负责生成查询语句的结果集
重点介绍两个属性:
protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection");
protected final Map<String, ResultMap> resultMaps = new StrictMap<ResultMap>("Result Maps collection");
mappedStatements属性,保存了所有Mapper配置文件中的select/update/insert/delete节点信息。属性类型为一个Map,key为sql对应的ID,MappedSatement为一个java对象,保存了一个select/update/insert/delete的节点信息。
resultMaps属性,保存了所有Mapper配置文件中的resultMap节点,Mapper配置文件也主要是配置select/update/insert/delete/resultMap这几个节点。
SQL执行过程:
- DefaultSqlSession根据id在configuration中找到MappedStatement对象(要执行的语句)
- Executor调用MappedStatement对象的getBoundSql得到可执行的sql和参数列表
- StatementHandler根据Sql生成一个Statement
- ParameterHandler为Statement设置相应的参数
- Executor中执行sql语句
- 如果是更新(update/insert/delete)语句,sql的执行工作得此结束
- 如果是查询语句,ResultSetHandler再根据执行结果生成ResultMap相应的对象返回。
具体详情如下图:
也可以参照结构图, 便于理解.
其他:
sql执行时, 几个主要对象调用关系可以参考下图:
调用堆栈
org.apache.ibatis.executor.BaseExecutor#queryFromDatabase
org.apache.ibatis.executor.SimpleExecutor#doQuery
org.apache.ibatis.session.Configuration#newStatementHandler
java.sql.PreparedStatement#execute
参照: https://blog.youkuaiyun.com/ashan_li/article/details/50425901