MyBatis原理分析


參考博客: 深入理解mybatis原理: http://blog.csdn.net/luanlouis/article/details/40422941

一 . JDBC的工作流程:

加載數據庫的驅動程序->創建數據連接對象->創建Statement對象->執行SQL語句->處理返回結果集->關閉數據庫連接

二 . mybatis和數據庫交互的方式

1 . 使用傳統的mybatis提供的API:此方式創建一個SqlSession對象,根據傳入的StatementId和參數操作數據庫

2 . 使用Mapper接口:將配置文件中的每一個<mapper>節點抽象為一個Mapper接口,這個接口中聲明的方法對應<mapper>中節點的id值,parameterType 為方法的入參,resultMap為返回值。根據MyBatis 的配置規范配置好后,通過SqlSession.getMapper(XXXMapper.class)方法,MyBatis 會根據相應的接口聲明的方法信息,通過動態代理機制生成一個Mapper 實例,我們使用Mapper 接口的某一個方法時,MyBatis 會根據這個方法的方法名和參數類型,確定StatementId,底層還是通過SqlSession.select("statementId",parameterObject)或者SqlSession.update("statementId",parameterObject)等來實現對數據庫的操作。

三 . SqlSession的工作過程分析

1.開啟一個數據庫訪問會話---創建SqlSession對象:MyBatis使用SQLSession對象來封裝一次數據庫的會話訪問。通過該對象實現對事務的控制和數據查詢。
SqlSession sqlSession = factory.openSession();

2.為SqlSession傳遞一個配置的Sql語句 的StatementId和參數params,然后返回結果:
List<User> result = sqlSession.selectList("com.pepper.dao.UserMapper.selectByName",params);
SqlSession的職能是:SqlSession根據Statement Id, 在mybatis配置對象Configuration中獲取到對應的MappedStatement對象,然后調用mybatis執行器來執行具體的操作。

3.MyBatis執行器Executor根據SqlSession傳遞的參數執行query()方法。Executor.query()方法會創建一個StatementHandler對象,然后將必要的參數傳遞給StatementHandler,使用StatementHandler來完成對數據庫的查詢,最終返回List結果集。
Executor的功能和作用是:
(1)、根據傳遞的參數,完成SQL語句的動態解析,生成BoundSql對象,供StatementHandler使用;
(2)、為查詢創建緩存,以提高性能;
(3)、創建JDBC的Statement連接對象,傳遞給StatementHandler對象,返回List查詢結果。

4.StatementHandler對象負責設置Statement對象中的查詢參數、處理JDBC返回的resultSet,將resultSet加工為List 集合返回:StatementHandler對象主要完成兩個工作:
(1). 對於JDBC的PreparedStatement類型的對象,創建的過程中,SQL語句字符串會包含 若干個`?` 占位符,之后再對占位符進行設值。StatementHandler通過parameterize(statement)方法對Statement進行設值;
(2).StatementHandler通過List<E> query(Statement statement, ResultHandler resultHandler)方法來完成執行Statement,和將Statement對象返回的resultSet封裝成List;

5.StatementHandler 的parameterize(statement) 方法調用了 ParameterHandler的setParameters(statement)方法,
6.ParameterHandler的setParameters(Statement)方法負責 根據我們輸入的參數,對statement對象的` ? `占位符處進行賦值。

StatementHandler 的List<E> query(Statement statement, ResultHandler resultHandler)方法調用了ResultSetHandler的handleResultSets(Statement) 方法。ResultSetHandler的handleResultSets(Statement) 方法會將Statement語句執行后生成的resultSet 結果集轉換成List<E> 結果集.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM