国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MyBatis理解與掌握(原理分析)

keelii / 1834人閱讀

摘要:理解與掌握原理分析框架功能架構(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

相關(guān)文章

  • 70 個(gè) Spring 最常見(jiàn)面試題,Java 晉升必會(huì)

    摘要:容器自動(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 道...

    Ashin 評(píng)論0 收藏0
  • 帶你深入淺出MyBatis技術(shù)原理實(shí)戰(zhàn)(PDF實(shí)戰(zhàn)實(shí)踐)

    摘要:目錄其中每個(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í)...

    MoAir 評(píng)論0 收藏0
  • Java深入-框架技巧

    摘要:從使用到原理學(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)題列表 -...

    chengtao1633 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<