小白mybatis源碼看這一遍就夠了(4)| SqlSession.select調用到jdbc分析

mybatis源碼分析系列:

  1. mybatis源碼看這一遍就夠了(1)| 前言
  2. mybatis源碼看這一遍就夠了(2)| getMapper
  3. mybatis源碼看這一遍就夠了(3)| Configuration及解析配置文件
  4. mybatis源碼看這一遍就夠了(4)| SqlSession.select調用分析
  5. 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整個的初始化過程到調用過程我們就已經很明朗了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章