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整個的初始化過程到調用過程我們就已經很明朗了