摘要:理解與掌握原理分析框架功能架構接口層提供給外部使用的接口,開發人員通過這些本地來操作數據庫。流程分析數據處理過程根據的查找相應的對象。預處理對象,得到對象。傳入和結果處理對象,通過的方法來執行,并對執行結果進行處理。
MyBatis理解與掌握(原理分析)
@(MyBatis)[Java, 框架, MyBatis]
功能架構(1)API接口層:提供給外部使用的接口API,開發人員通過這些本地API來操作數據庫。接口層一接收到調用請求就會調用數據處理層來完成具體的數據處理
(2)數據處理層:負責具體的SQL查找、SQL解析、SQL執行和執行結果處理等。它主要的目的是根據調用的請求來完成一次數據庫操作。
(3)基礎支撐層:負責最基礎的功能支撐,包括連接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎的組件。為上層數據處理層提供最基礎的支撐。
(4)引導層:配置和啟動MyBatis配置信息的方法。
數據處理過程:
(1)根據SQL的ID查找相應的MappedStatement對象。
(2)根據傳入參數對象解析MappedStatement對象,得到最終要執行的SQL和執行傳入參數。
(3)獲取數據庫連接,根據得到的最終SQL語句和執行傳入參數到數據庫執行,并得到執行結果
(4)根據MappedStatement對象中的結果映射對得到的執行結果進行轉換處理,并得到最終的處理結果
(5)釋放連接資源
通過調用DefaultSqlSessionFactory的openSession方法返回一個SqlSession實例,我們看一下具體是怎么得到一個SqlSession實例的。
public SqlSession openSession() { return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false); } private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { Connection connection = null; try { //獲取配置信息里面的環境信息,這些環境信息都是包括使用哪種數據庫,連接數據庫的信息,事務 final Environment environment = configuration.getEnvironment(); //根據環境信息關于數據庫的配置獲取數據源 final DataSource dataSource = getDataSourceFromEnvironment(environment); //根據環境信息關于事務的配置獲取事務工廠 TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment); connection = dataSource.getConnection(); if (level != null) { //設置連接的事務隔離級別 connection.setTransactionIsolation(level.getLevel()); } //對connection進行包裝,使連接具備日志功能,這里用的是代理。 connection = wrapConnection(connection); //從事務工廠獲取一個事務實例 Transaction tx = transactionFactory.newTransaction(connection, autoCommit); //從配置信息中獲取一個執行器實例 Executor executor = configuration.newExecutor(tx, execType); //返回SqlSession的一個默認實例 return new DefaultSqlSession(configuration, executor, autoCommit); } catch (Exception e) { closeConnection(connection); throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e); } finally { ErrorContext.instance().reset(); } } }
總結一下上面的過程,總共有三個步驟:
步驟一:讀取MyBatis的主配置文件,并將文件讀成文件流形式(InputStream)。 步驟二:從主配置文件中讀取文件的各個節點信息并存放到Configuration對象中。讀取mappers節點的引用文件,并將這些文件的各個節點信息存放到Configuration對象。 步驟三:根據Configuration對象的信息獲取數據庫連接,并設置連接的事務隔離級別等信息,將經過包裝數據庫連接對象SqlSession接口返回,DefaultSqlSession是SqlSession的實現類,所以這里返回的是DefaultSqlSession,SqlSession接口里面就是對外提供的各種數據庫操作。SQL查詢的源碼
SqlSession session = sessionFactory.openSession(); session.update("updateUser", 1);
------------------------源碼-----------------------------------------
private SqlSession openSessionFromDataSource(...) { ....... //從配置信息中獲取一個執行器實例 Executor executor = configuration.newExecutor(tx, execType); //返回SqlSession的一個默認實例 return new DefaultSqlSession(configuration, executor, autoCommit); ...... } DefaultSqlSession實現了SqlSession接口,里面有各種各樣的SQL執行方法,主要用于SQL操作的對外接口,它會的調用執行器來執行實際的SQL語句。 public class DefaultSqlSession implements SqlSession { private Configuration configuration; private Executor executor ; ....... @Override (1)根據SQL的ID到配置信息中找對應的MappedStatement,在之前配置被加載初始化的時候我們看到了系統會把配置文件中的SQL塊解析并放到一個MappedStatement里面,并將MappedStatement對象放到一個Map里面進行存放,Map的key值是該SQL塊的ID。 (2)調用執行器的update方法,傳入MappedStatement對象、SQL參數對象、范圍對象(此處為空)和結果處理方式。 public int update(String statement, Object parameter) { try { dirty = true; MappedStatement ms = configuration.getMappedStatement(statement); return executor .update(ms, wrapCollection(parameter)); } catch (Exception e) { throw ExceptionFactory.wrapException("Error updating database. Cause: " + e, e); } finally { ErrorContext.instance().reset(); } } ...... } public class SimpleExecutor extends BaseExecutor { ........ @Override (1) 獲取配置信息對象。 (2)通過配置對象獲取一個新的StatementHandler,該類主要用來處理一次SQL操作。 (3)預處理StatementHandler對象,得到Statement對象。 (4)傳入Statement和結果處理對象,通過StatementHandler的update方法來執行SQL,并對執行結果進行處理。 public int doUpdate(MappedStatement ms, Object parameter) throws SQLException { Statement stmt = null; try { Configuration configuration = ms.getConfiguration(); StatementHandler handler = configuration.newStatementHandler(this, ms, parameter, RowBounds.DEFAULT, null, null); stmt = prepareStatement(handler, ms.getStatementLog()); return handler.update(stmt); } finally { closeStatement(stmt); } } ......... }
根據 MappedStatement對象的StatementType來創建不同的StatementHandler,這個跟前面執行器的方式類似。StatementType有STATEMENT、PREPARED和CALLABLE三種類型,跟JDBC里面的Statement類型一一對應。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77086.html
摘要:容器自動完成裝載,默認的方式是這部分重點在常用模塊的使用以及的底層實現原理。 對于那些想面試高級 Java 崗位的同學來說,除了算法屬于比較「天方夜譚」的題目外,剩下針對實際工作的題目就屬于真正的本事了,熱門技術的細節和難點成為了主要考察的內容。 這里說「天方夜譚」并不是說算法沒用,不切實際,而是想說算法平時其實很少用到,甚至面試官都對自己出的算法題一知半解。 這里總結打磨了 70 道...
摘要:目錄其中每個章節知識點都是相關連由淺入深的一步步全面分析了技術原理以及實戰由于文案較長想深入學習以及對于該文檔感興趣的朋友們可以加群免費獲取。這些場景在大量的編碼中使用,具備較強的實用價值,這些內容都是通過實戰得來的,供讀者們參考。 前言系統掌握MyBatis編程技巧已經成了用Java構建移動互聯網網站的必要條件 本文主要講解了Mybatis的應用,解析了其原理,從而形成一個完整的知識...
摘要:從使用到原理學習線程池關于線程池的使用,及原理分析分析角度新穎面向切面編程的基本用法基于注解的實現在軟件開發中,分散于應用中多出的功能被稱為橫切關注點如事務安全緩存等。 Java 程序媛手把手教你設計模式中的撩妹神技 -- 上篇 遇一人白首,擇一城終老,是多么美好的人生境界,她和他歷經風雨慢慢變老,回首走過的點點滴滴,依然清楚的記得當初愛情萌芽的模樣…… Java 進階面試問題列表 -...
閱讀 2689·2023-04-25 17:21
閱讀 2550·2021-11-23 09:51
閱讀 2837·2021-09-24 10:32
閱讀 3769·2021-09-23 11:33
閱讀 1974·2019-08-30 15:44
閱讀 3452·2019-08-30 11:18
閱讀 3519·2019-08-30 10:53
閱讀 623·2019-08-26 13:25