mybatis源码分析系列:
- mybatis源码看这一遍就够了(1)| 前言
- mybatis源码看这一遍就够了(2)| getMapper
- mybatis源码看这一遍就够了(3)| Configuration及解析配置文件
- mybatis源码看这一遍就够了(4)| SqlSession.select调用分析
- mybatis源码看这一遍就够了(5)| 与springboot整合
前面mybatis源码看这一遍就够了(2)我们还遗留了个问题是sqlSession.selectList这一步究竟做了啥,这和jdbc又有什么关系?
我们这一章来讲一讲这个sqlSession.selectList他和jdbc究竟是什么不正当关系,是不是真有一腿
我们拿第一章的mybatis例子来分析
List<User> users = sqlSession.selectList("com.cwh.test.dao.UserDao.select");
这里调用DefaultSqlSession.selectList:
configuration.getMappedStatement获取在上一章mybatis源码看这一遍就够了(3)configuration注册进去到Map<String, MappedStatement> mappedStatements的MappedStatement,其实就是从map里拿出来:
接着调用(CachingExecutor)executor.query:
初始化BoundSql:
接着继续调用query:
然后delegate.query,其实就是调用BaseExecutor.query,query方法里继续调用queryFromDatabase:
然后接着SimpleExecutor.doQuery:
stmt = prepareStatement(handler, ms.getStatementLog());
prepareStatement执行前准备,也就是在这里进行getConnection就如我们第一章mybatis源码看这一遍就够了(1)jdbc例子的第二步,不信我们跟进去看下:
到下面这一步就到了jdbc相关的JdbcTransaction 类中的getConnection
我们就不在继续往里走了,到这里是不是可以确定mybatis和jdbc扯上关系了吧。
获取完connection之后接着构造PreparedStatement也就是第一章mybatis源码看这一遍就够了(1)例子jdbc的第三步:
往里走就是调用如下,这不就是我们第一章mybatis源码看这一遍就够了(1)jdbc例子第三步嘛PreparedStatement statement = connection.prepareStatement("select * from user"):
获取到PreparedStatement接着执行sql,也就是第四步statement.execute啦,我们回到如下:
handler.query调用:
到这里调用的就是PreparedStatement.execute,是不是和第一章mybatis源码看这一遍就够了(1)jdbc例子的第四步一样。往下就是第五步statement.getResultSet()获取结果啦,下面我就不再继续刨了。
至此mybatis整个的初始化过程到调用过程我们就已经很明朗了