最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解MyBatis工作原理

 更新時(shí)間:2021年05月31日 11:36:45   作者:明了LM  
近來(lái)想寫(xiě)一個(gè)mybatis的分頁(yè)插件,但是在寫(xiě)插件之前肯定要了解一下mybatis具體的工作原理吧,本文就詳細(xì)總結(jié)了MyBatis工作原理,,需要的朋友可以參考下

一、Mybatis工作原理

Mybatis分層框架圖

在這里插入圖片描述

Mybatis工作原理圖

示例:pandas 是基于NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。

源碼分析:一般都是從helloworld入手

1、根據(jù)xml配置文件(全局配置文件mybatis-config.xml)創(chuàng)建一個(gè)SqlsessionFactory對(duì)象,mybatis-config.xml有數(shù)據(jù)源一些環(huán)境信息

2、sql映射文件EmployeeMapper.xml配置了每一個(gè)sql,以及sql的封裝規(guī)則等。

3、將sql映射文件注冊(cè)在全局配置文件中

4、寫(xiě)代碼:

  • 根據(jù)全局配置文件得到sqlsessionFactory
  • 使用SqlSession工程進(jìn)行crud、sqlseesion就代表和數(shù)據(jù)庫(kù)進(jìn)行會(huì)話(huà),用完close
  • 使用sql標(biāo)識(shí)告知mybatis來(lái)執(zhí)行哪個(gè)sql,sql都是保存在sql映射文件中

測(cè)試類(lèi)SqlSessionFactoryBuilder處打斷點(diǎn)

 /**
     * 1、根據(jù)xml配置文件(全局配置文件mybatis-config.xml)創(chuàng)建一個(gè)SqlsessionFactory對(duì)象,mybatis-config.xml有數(shù)據(jù)源一些環(huán)境信息
     * 2、sql映射文件EmployeeMapper.xml配置了每一個(gè)sql,以及sql的封裝規(guī)則等。
     * 3、將sql映射文件注冊(cè)在全局配置文件中
     * 4、寫(xiě)代碼:
     * 4.1.根據(jù)全局配置文件得到sqlsessionFactory
     * 4.2.使用SqlSession工程進(jìn)行crud,sqlseesion就代表和數(shù)據(jù)庫(kù)進(jìn)行會(huì)話(huà),用完close
     * 4.3.使用sql標(biāo)識(shí)告知mybatis來(lái)執(zhí)行哪個(gè)sql,sql都是保存在sql映射文件中
     *
     * @throws IOException
     */
    @Test
    public void test() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //2、獲取SqlSession實(shí)例,能直接執(zhí)行已經(jīng)映射了的sql語(yǔ)句,selectOne:sql唯一標(biāo)識(shí),執(zhí)行sql要用到的參數(shù)
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            Employee employee = openSession.selectOne("com.ming.dao.EmployeeMapper.getEmpByID", 1);
            System.out.println(employee);
        } finally {
            openSession.close();
        }
    }

1、獲取SqlsessionFactory對(duì)象

XPathParser作用:用dom解析mybatis-config.xml標(biāo)簽的configuration標(biāo)簽

public Configuration parse() {
    if (parsed) {
      throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    }
    parsed = true;
    parseConfiguration(parser.evalNode("/configuration"));
    return configuration;
  }

在這里插入圖片描述

一個(gè)MappedStatement對(duì)象代表一個(gè)增刪改查標(biāo)簽的詳細(xì)信息(id sqlResource等)

在這里插入圖片描述

全局configuation的一個(gè)重要屬性MappedStatement

在這里插入圖片描述

KonwnMappers生成一個(gè)Mapper接口的代理工廠(chǎng)

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

總結(jié):

第一步:根據(jù)mybatis-config.xml全局配置文件創(chuàng)建SqlSessionFactory對(duì)象、就是把配置文件的詳細(xì)信息解析保存在了configuration對(duì)象中,返回包含了configuration的defaultSqsessionFactory對(duì)象

注意:mappedSatement對(duì)象代表一個(gè)增刪改查的詳細(xì)標(biāo)簽

2、獲取sqlsession對(duì)象

mybatis-openSession

在這里插入圖片描述

總結(jié):

返回sqlsession的實(shí)現(xiàn)類(lèi)defaultSqlsession對(duì)象,defaultSqlsession對(duì)象包含了executor和configuration,Executor(四大對(duì)象)對(duì)象會(huì)在這一步被創(chuàng)建

3、獲取Mapper接口代理對(duì)象(MapperProxy)

在這里插入圖片描述

返回getMapper接口的代理對(duì)象、包含了SqlSession對(duì)象

在這里插入圖片描述

4、執(zhí)行增刪改查方法

查詢(xún)流程

  @Test
    public void testInterface() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
            Employee employee = employeeMapper.getEmpByID(1);
            System.out.println(employee);
            Employee employee2 = employeeMapper.getEmpByID(5);
            System.out.println(employee2);
            System.out.println(employee==employee2);

        }finally {
            sqlSession.close();
        }
    }

在這里插入圖片描述
在這里插入圖片描述

二、Mybatis運(yùn)行原理總結(jié)

1、根據(jù)配置文件(全局、SQL映射文件)初始化出configuration對(duì)象

2、創(chuàng)建一個(gè)defaultSqlSession對(duì)象,它里面包含configuration和executor(根據(jù)配置文件中的defaultEXecutorType創(chuàng)建出對(duì)應(yīng)的Executor)

3、defaultSqlSession.getMapper()獲取Mapper接口對(duì)應(yīng)的MapperProxy

4、MapperProxy里面有defaultSqlSession

5、執(zhí)行增刪改查方法:

  • 調(diào)用的是defaultSqlsesion的增刪改查(會(huì)調(diào)用Executor的crud)
  • 會(huì)創(chuàng)建一個(gè)statementhandler對(duì)象(同時(shí)也會(huì)創(chuàng)建出parameterHandler和resultSetHandler)
  • 調(diào)用StatementHandler的prepareStatement()方法進(jìn)行預(yù)編譯handler.prepare()和參數(shù)設(shè)置handler.parameterize(stmt)
  • 設(shè)置完成后調(diào)用StatementHandler的增刪改查方法query()
  • 參數(shù)預(yù)編譯完成后使用resultSetHandler封裝結(jié)果集

注意:四大對(duì)象每個(gè)創(chuàng)建的時(shí)候都有一個(gè)interceptorChain.pluginAll()方法

例如StatementHandler 對(duì)象的創(chuàng)建

 StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);
  public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, 	RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
    StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql);
    statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler);
    return statementHandler;
  }

到此這篇關(guān)于詳解MyBatis工作原理的文章就介紹到這了,更多相關(guān)MyBatis工作原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java之?dāng)?shù)組在指定位置插入元素實(shí)現(xiàn)

    Java之?dāng)?shù)組在指定位置插入元素實(shí)現(xiàn)

    本文主要介紹了Java之?dāng)?shù)組在指定位置插入元素實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Spring?Boot用戶(hù)注冊(cè)驗(yàn)證的實(shí)現(xiàn)全過(guò)程記錄

    Spring?Boot用戶(hù)注冊(cè)驗(yàn)證的實(shí)現(xiàn)全過(guò)程記錄

    最近在設(shè)計(jì)自己的博客系統(tǒng),涉及到用戶(hù)注冊(cè)與登錄驗(yàn)證,所以下面這篇文章主要給大家介紹了關(guān)于Spring?Boot用戶(hù)注冊(cè)驗(yàn)證的實(shí)現(xiàn)全過(guò)程,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • Java對(duì)象進(jìn)行深拷貝的五種方法實(shí)例代碼

    Java對(duì)象進(jìn)行深拷貝的五種方法實(shí)例代碼

    這篇文章主要介紹了Java對(duì)象進(jìn)行深拷貝的五種方法,分別是構(gòu)造函數(shù)、重載clone()方法、Apache?Commons?Lang序列化、Gson序列化和Jackson序列化,每種方法都給出了實(shí)例代碼,需要的朋友可以參考下
    2025-04-04
  • SpringCloud中的服務(wù)接口(api)

    SpringCloud中的服務(wù)接口(api)

    這篇文章主要介紹了SpringCloud中的服務(wù)接口(api),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 簡(jiǎn)單了解java數(shù)組傳遞方法

    簡(jiǎn)單了解java數(shù)組傳遞方法

    這篇文章主要介紹了簡(jiǎn)單了解java數(shù)組傳遞方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 詳解Maven 搭建spring boot多模塊項(xiàng)目(附源碼)

    詳解Maven 搭建spring boot多模塊項(xiàng)目(附源碼)

    這篇文章主要介紹了詳解Maven 搭建spring boot多模塊項(xiàng)目(附源碼),具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-09-09
  • 使用Java的Graphics類(lèi)進(jìn)行繪圖的方法詳解

    使用Java的Graphics類(lèi)進(jìn)行繪圖的方法詳解

    這篇文章主要介紹了使用Java的Graphics類(lèi)進(jìn)行繪圖的方法,是Java的GUI編程的基礎(chǔ),需要的朋友可以參考下
    2015-10-10
  • 關(guān)于jdk9、jdk10、jdk11、jdk12、jdk13新特性說(shuō)明

    關(guān)于jdk9、jdk10、jdk11、jdk12、jdk13新特性說(shuō)明

    這篇文章主要介紹了關(guān)于jdk9、jdk10、jdk11、jdk12、jdk13新特性說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 一文帶你解讀所有HashMap的面試題

    一文帶你解讀所有HashMap的面試題

    HashMap在面試的時(shí)候,是非常容易被問(wèn)到的。因?yàn)樵贘DK8出來(lái)之后,非常容易被問(wèn)到關(guān)于HashMap的知識(shí)點(diǎn),而如果對(duì)于沒(méi)有研究過(guò)他的源代碼的同學(xué)來(lái)說(shuō),這個(gè)可能只是說(shuō)出一部分來(lái)。本文就把HashMap上面大部分會(huì)被在面試中問(wèn)到的內(nèi)容,做個(gè)總結(jié),希望有所幫助
    2022-09-09
  • 詳解如何用Java去除HTML標(biāo)簽

    詳解如何用Java去除HTML標(biāo)簽

    在平時(shí)工作中,偶爾會(huì)用 Java 做一些解析HTML的工作。有時(shí)需要?jiǎng)h除所有的HTML標(biāo)簽,只保留純文字內(nèi)容。這個(gè)問(wèn)題在做過(guò)一些爬蟲(chóng)工作的朋友來(lái)說(shuō)很簡(jiǎn)單。下面來(lái)說(shuō)說(shuō),我們平時(shí)使用到的集中解析的方法
    2022-12-12

最新評(píng)論

手游| 屏南县| 松原市| 徐闻县| 华亭县| 张家川| 万载县| 南漳县| 鲁甸县| 勐海县| 永州市| 永兴县| 右玉县| 宝鸡市| 蒙自县| 平江县| 和顺县| 来凤县| 多伦县| 吴旗县| 江门市| 兴隆县| 蛟河市| 平昌县| 南靖县| 铜川市| 丰城市| 沧州市| 二连浩特市| 旅游| 乐昌市| 鹤岗市| 灵宝市| 阳泉市| 罗定市| 无极县| 鹰潭市| 双流县| 德令哈市| 尉氏县| 双峰县|