小白mybatis源码看这一遍就够了(4)| SqlSession.select调用到jdbc分析
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整个的初始化过程到调用过程我们就已经很明朗了

浙公网安备 33010602011771号