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