欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一篇文章帶你學(xué)習(xí)JAVA MyBatis底層原理

 更新時(shí)間:2021年09月02日 10:20:48   作者:令狐前生  
近來想寫一個(gè)mybatis的分頁插件,但是在寫插件之前肯定要了解一下mybatis具體的工作原理吧,本文就詳細(xì)總結(jié)了MyBatis工作原理,,需要的朋友可以參考下

一、傳統(tǒng)JDBC的弊端

  • jdbc沒有連接池、操作數(shù)據(jù)庫需要頻繁創(chuàng)建和關(guān)聯(lián)鏈接,消耗資源很大。
  • 在java中,寫原生jdbc代碼,硬編碼不易維護(hù)(比如修改sql、或傳遞參數(shù)類型時(shí)、解析結(jié)果)。

二、mybatis介紹

        MyBatis是一款優(yōu)秀的持久層框架,它支持自定義SQL、存儲過程以及高級映射。MyBatis免除了幾乎所有的JDBC代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作。MyBatis可以通過簡單的XML或注解來配置和映射原始類型、接口和JavaPOJO(PlainOldJavaObjects,普通老式Java對象)為數(shù)據(jù)庫中的記錄

三、MyBatis架構(gòu)圖

核心類解釋

SqlSessionFactoryBuilder:

這個(gè)類可以被實(shí)例化、使用和丟棄,一旦創(chuàng)建了 SqlSessionFactory,就不再需要它了。因此SqlSessionFactoryBuilder實(shí)例的最佳作用域是方法作用域(也就是局部方法變量)。你可以重用SqlSessionFactoryBuilder來創(chuàng)建多個(gè) SqlSessionFactory實(shí)例,但最好還是不要一直保留著它,以保證所有的 XML 解析資源可以被釋放給更重要的事情。

SqlSessionFactory:

SqlSessionFactory一旦被創(chuàng)建就應(yīng)該在應(yīng)用的運(yùn)行期間一直存在,沒有任何理由丟棄它或重新創(chuàng)建另一個(gè)實(shí)例。使用SqlSessionFactory的最佳實(shí)踐是在應(yīng)用運(yùn)行期間不要重復(fù)創(chuàng)建多次,多次重建SqlSessionFactory被視為一種代碼“壞習(xí)慣”。因此SqlSessionFactory的最佳作用域是應(yīng)用作用域。有很多方法可以做到,最簡單的就是使用單例模式或者靜態(tài)單例模式。

SqlSession:

每個(gè)線程都應(yīng)該有它自己的SqlSession實(shí)例。SqlSession的實(shí)例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。絕對不能將SqlSession實(shí)例的引用放在一個(gè)類的靜態(tài)域,甚至一個(gè)類的實(shí)例變量也不行。也絕不能將SqlSession實(shí)例的引用放在任何類型的托管作用域中,如Servlet框架中的HttpSession。如果你現(xiàn)在正在使用一種Web框架,考慮將SqlSession放在一個(gè)和HTTP請求相似的作用域中。換句話說,每次收到HTTP請求,就可以打開一個(gè)SqlSession,返回一個(gè)響應(yīng)后,就關(guān)閉它。這個(gè)關(guān)閉操作很重要,為了確保每次都能執(zhí)行關(guān)閉操作,你應(yīng)該把這個(gè)關(guān)閉操作放到finally塊中。

Executor:

Executor(執(zhí)行器)接口有兩個(gè)實(shí)現(xiàn)類,其中BaseExecutor有三個(gè)繼承類分別是BatchExecutor(重用語句并執(zhí)行批量更新),ReuseExecutor(重用預(yù)處理語句prepared statement,跟Simple的唯一區(qū)別就是內(nèi)部緩存statement),SimpleExecutor(默認(rèn),每次都會創(chuàng)建新的statement)。

Mapped Statement:

用來存放我們SQL映射文件中的信息包括sql語句,輸入?yún)?shù),輸出參數(shù)等等。一個(gè)SQL節(jié)點(diǎn)對應(yīng)一個(gè)MappedStatement對象。

工作流程

首先解釋下兩個(gè)文件

mybatis-config.xml:全局配置文件,引入了數(shù)據(jù)源、事務(wù)等mybatis運(yùn)行環(huán)境;

Mapper.xml:配置映射文件,配置sql結(jié)果集封裝類型、傳參類型;

1.解析配置文件(MyBatis-config.xml、Mapper.xml),MyBatis基于XML配置文件生成Configuration,和一個(gè)個(gè)MappedStatement(包括了參數(shù)映射配置、動態(tài)SQL語句、結(jié)果映射配置),其對應(yīng)著<select | update | delete | insert>標(biāo)簽項(xiàng)。

2.SqlSessionFactoryBuilder創(chuàng)建會話工廠SqlSessionFactory。

3.SqlSessionFactory創(chuàng)建會話SqlSession;

4.執(zhí)行器將MappedStatement對象進(jìn)行解析,sql參數(shù)轉(zhuǎn)化、動態(tài)sql拼接,生成jdbc Statement對象,使用Paramterhandler填充參數(shù),使用statementHandler綁定參數(shù)。

5.JDBC執(zhí)行sql,借助MappedStatement中的結(jié)果映射關(guān)系,使用ResultSetHandler將返回結(jié)果轉(zhuǎn)化成HashMap、JavaBean等存儲結(jié)構(gòu)并返回。

6.關(guān)閉sqlsession會話。

四、自己通過加載xml配置走mybais流程實(shí)現(xiàn)例子

獲得代理映射器代碼(在MapperProxyFactory<T>):

    protected T newInstance(MapperProxy<T> mapperProxy) {
        return Proxy.newProxyInstance(this.mapperInterface.getClassLoader(), new Class[]{this.mapperInterface}, mapperProxy);
    }

參考資料:https://baijiahao.baidu.com/s?id=1666562082269776543&wfr=spider&for=pc

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Java單例模式的8種寫法(推薦)

    Java單例模式的8種寫法(推薦)

    這篇文章主要介紹了Java單例模式的8種寫法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • redisson.tryLock()參數(shù)的使用及理解

    redisson.tryLock()參數(shù)的使用及理解

    這篇文章主要介紹了redisson.tryLock()參數(shù)的使用,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Springboot實(shí)現(xiàn)通用Auth認(rèn)證的幾種方式

    Springboot實(shí)現(xiàn)通用Auth認(rèn)證的幾種方式

    本文主要介紹了Springboot實(shí)現(xiàn)通用Auth認(rèn)證的幾種方式,主要介紹了4種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • java中Redisson的看門狗機(jī)制的實(shí)現(xiàn)

    java中Redisson的看門狗機(jī)制的實(shí)現(xiàn)

    本文主要介紹了java中Redisson的看門狗機(jī)制的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Java利用Jackson序列化實(shí)現(xiàn)數(shù)據(jù)脫敏

    Java利用Jackson序列化實(shí)現(xiàn)數(shù)據(jù)脫敏

    這篇文章主要介紹了利用Jackson序列化實(shí)現(xiàn)數(shù)據(jù)脫敏,首先在需要進(jìn)行脫敏的VO字段上面標(biāo)注相關(guān)脫敏注解,具體實(shí)例代碼文中給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10
  • 如何基于SpringMVC實(shí)現(xiàn)斷點(diǎn)續(xù)傳(HTTP)

    如何基于SpringMVC實(shí)現(xiàn)斷點(diǎn)續(xù)傳(HTTP)

    這篇文章主要介紹了如何基于SpringMVC實(shí)現(xiàn)斷點(diǎn)續(xù)傳(HTTP),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java如何實(shí)現(xiàn)HTTP斷點(diǎn)續(xù)傳功能

    Java如何實(shí)現(xiàn)HTTP斷點(diǎn)續(xù)傳功能

    其實(shí)斷點(diǎn)續(xù)傳的原理很簡單,就是在Http的請求上和一般的下載有所不同而已,本文將詳細(xì)介紹Java如何實(shí)現(xiàn)HTTP斷點(diǎn)續(xù)傳功能,需要的朋友可以參考下
    2012-11-11
  • 解讀@Transactional失效的幾種情況

    解讀@Transactional失效的幾種情況

    這篇文章主要介紹了@Transactional失效的幾種情況,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • java如何自動補(bǔ)齊數(shù)值至指定位數(shù)

    java如何自動補(bǔ)齊數(shù)值至指定位數(shù)

    這篇文章主要介紹了java如何自動補(bǔ)齊數(shù)值至指定位數(shù)問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • SpringBoot Controller中的常用注解

    SpringBoot Controller中的常用注解

    這篇文章主要介紹了SpringBoot Controller中的常用注解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09

最新評論