精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

手寫一個(gè)MyBatis框架

Android編程精選 ? 來源:Android編程精選 ? 2023-04-20 11:29 ? 次閱讀

在MyBatis的兩萬多行的框架源碼中,使用了大量的設(shè)計(jì)模式對(duì)工程架構(gòu)中的復(fù)雜場(chǎng)景進(jìn)行解耦,這些設(shè)計(jì)模式的巧妙使用是整個(gè)框架的精華。

經(jīng)過整理,大概有以下設(shè)計(jì)模式,如圖1所示。

9ceab6c2-dedb-11ed-bfe3-dac502259ad0.png

圖1

01

類型:創(chuàng)建型模式

▊工廠模式

SqlSessionFactory 的結(jié)構(gòu)如圖2所示。

9cfa5870-dedb-11ed-bfe3-dac502259ad0.png

圖2

工廠模式:簡(jiǎn)單工廠是一種創(chuàng)建型模式,在父類中提供一個(gè)創(chuàng)建對(duì)象的方法,允許子類決定實(shí)例對(duì)象的類型。

場(chǎng)景介紹:SqlSessionFactory 是獲取會(huì)話的工廠,每次使用MyBatis 操作數(shù)據(jù)庫時(shí),都會(huì)開啟一個(gè)新的會(huì)話。在會(huì)話工廠的實(shí)現(xiàn)中,SqlSessionFactory 負(fù)責(zé)獲取數(shù)據(jù)源環(huán)境配置信息、構(gòu)建事務(wù)工廠和創(chuàng)建操作SQL 的執(zhí)行器,最終返回會(huì)話實(shí)現(xiàn)類。

同類設(shè)計(jì):SqlSessionFactory、ObjectFactory、MapperProxyFactory 和DataSourceFactory。

▊單例模式

Configuration 單例配置類的結(jié)構(gòu)如圖3所示。

9d23d178-dedb-11ed-bfe3-dac502259ad0.png

圖3

單例模式:是一種創(chuàng)建型模式,能夠保證一個(gè)類只有一個(gè)實(shí)例,并且提供一個(gè)訪問該實(shí)例的全局節(jié)點(diǎn)。

場(chǎng)景介紹:Configuration 是一個(gè)大單例,貫穿整個(gè)會(huì)話周期,所有的配置對(duì)象(如映射、緩存、入?yún)ⅰ⒊鰠ⅰr截器、注冊(cè)機(jī)和對(duì)象工廠等)都在Configuration 配置項(xiàng)中初始化,并且隨著SqlSessionFactoryBuilder 構(gòu)建階段完成實(shí)例化操作。

同類場(chǎng)景:ErrorContext、LogFactory 和Configuration。

▊建造者模式

ResultMap 建造者模式的結(jié)構(gòu)如圖4所示。

9d354aac-dedb-11ed-bfe3-dac502259ad0.png

圖4

建造者模式:使用多個(gè)簡(jiǎn)單的對(duì)象一步一步地構(gòu)建成一個(gè)復(fù)雜的對(duì)象,提供了一種創(chuàng)建對(duì)象的最佳方式。

場(chǎng)景介紹:建造者模式在MyBatis 中使用了大量的XxxxBuilder,將XML 文件解析到各類對(duì)象的封裝中,使用建造者及建造者助手完成對(duì)象的封裝。它的核心目的是不希望把過多的關(guān)于對(duì)象的屬性設(shè)置寫到其他業(yè)務(wù)流程中,而是用建造者方式提供最佳的邊界隔離。

同類場(chǎng)景:SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XML StatementBuilder 和CacheBuilder。

02

類型:結(jié)構(gòu)型模式

▊適配器模式

日志實(shí)現(xiàn)類的結(jié)構(gòu)如圖5所示。

9d3e129a-dedb-11ed-bfe3-dac502259ad0.png

圖5

適配器模式:是一種結(jié)構(gòu)型模式,能使接口不兼容的對(duì)象也可以相互合作。

場(chǎng)景介紹:正是因?yàn)橛刑嗟娜罩究蚣埽↙og4j、Log4j2 和Slf4J 等,而這些日志框架的使用接口又各有差異,為了統(tǒng)一這些日志框架的接口,MyBatis 定義了一套統(tǒng)一的接口,為所有的其他日志框架的接口做相應(yīng)的適配。

同類場(chǎng)景:主要集中在對(duì)Log 日志的適配上。

▊代理模式

代理模式的實(shí)現(xiàn)結(jié)構(gòu)如圖6所示。

9d476dd6-dedb-11ed-bfe3-dac502259ad0.png

圖6

代理模式:是一種結(jié)構(gòu)型模式,能夠提供對(duì)象的替代品或占位符。代理控制元對(duì)象的訪問,并且允許在將請(qǐng)求提交給對(duì)象前進(jìn)行一些處理。

場(chǎng)景介紹:沒有代理模式就不存在各類框架。就像MyBatis 中的MapperProxy 實(shí)現(xiàn)類,代理工廠實(shí)現(xiàn)的功能就是完成DAO 接口的具體實(shí)現(xiàn)類的方法,配置的任何一個(gè)DAO 接口調(diào)用的CRUD 方法,都會(huì)被MapperProxy 接管,調(diào)用到方法執(zhí)行器等,并返回最終的數(shù)據(jù)庫執(zhí)行結(jié)果。

同類場(chǎng)景:DriverProxy、Plugin、Invoker 和MapperProxy。

▊組合模式

解析節(jié)點(diǎn)類的結(jié)構(gòu)如圖7所示。

9d5732e8-dedb-11ed-bfe3-dac502259ad0.png

圖7

組合模式:是一種結(jié)構(gòu)型模式,可以將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分—整體” 的層次結(jié)構(gòu)。

場(chǎng)景介紹:在MyBatis XML 動(dòng)態(tài)的SQL 配置中,共提供了9 種標(biāo)簽(trim、where、set、foreach、if、choose、when、otherwise 和bind),使用者可以組合出各類場(chǎng)景的SQL 語句。而SqlNode 接口的實(shí)現(xiàn)就是每個(gè)組合結(jié)構(gòu)中的規(guī)則節(jié)點(diǎn),通過規(guī)則節(jié)點(diǎn)的組裝,完成規(guī)則樹組合模式的使用。

同類場(chǎng)景:主要體現(xiàn)在對(duì)各類SQL 標(biāo)簽的解析上,以實(shí)現(xiàn)SqlNode 接口的各個(gè)子類為主。

▊裝飾器模式

二級(jí)緩存裝飾器的實(shí)現(xiàn)結(jié)構(gòu)如圖8所示。

9d6d7a6c-dedb-11ed-bfe3-dac502259ad0.png

圖8

裝飾器模式:是一種結(jié)構(gòu)型設(shè)計(jì)模式,允許將對(duì)象放入包含行為的特殊封裝對(duì)象中,為元對(duì)象綁定新的行為。

場(chǎng)景介紹:MyBatis 的所有SQL 操作都是經(jīng)過SqlSession 調(diào)用SimpleExecutor 完成的,而一級(jí)緩存的操作也是在簡(jiǎn)單執(zhí)行器中處理的。這里的二級(jí)緩存因?yàn)槭腔谝患?jí)緩存刷新的,所以在實(shí)現(xiàn)上,通過創(chuàng)建一個(gè)緩存執(zhí)行器,包裝簡(jiǎn)單執(zhí)行器的處理邏輯,實(shí)現(xiàn)二級(jí)緩存操作。這里用到的就是裝飾器模式,也叫俄羅斯套娃模式。

03

類型:行為型模式

▊模板模式

SQL 執(zhí)行模板模式如圖9所示。

9d73dab0-dedb-11ed-bfe3-dac502259ad0.png

圖9

模板模式:是一種行為型模式,在超類中定義了一個(gè)算法的框架,允許子類在不修改結(jié)構(gòu)的情況下重寫算法的特定步驟。場(chǎng)景介紹:存在一系列可被標(biāo)準(zhǔn)定義的流程,并且流程的步驟大部分采用通用邏輯,只有一小部分是需要子類實(shí)現(xiàn)的,通常采用模板模式來定義這個(gè)標(biāo)準(zhǔn)的流程。就像MyBatis 的BaseExecutor 就是一個(gè)用于定義模板模式的抽象類,在這個(gè)類中把查詢、修改的操作都定義為一套標(biāo)準(zhǔn)的流程。

同類場(chǎng)景:BaseExecutor、SimpleExecutor 和BaseTypeHandler。

▊策略模式

多類型處理器策略模式的結(jié)構(gòu)如圖10所示。

9d8151a4-dedb-11ed-bfe3-dac502259ad0.png

圖10

策略模式:是一種行為型模式,能定義一系列算法,并將每種算法分別放入獨(dú)立的類中,從而使算法的對(duì)象能夠互相替換。

場(chǎng)景介紹:在MyBatis 處理JDBC 執(zhí)行后返回的結(jié)果時(shí),需要按照不同的類型獲取對(duì)應(yīng)的值,這樣就可以避免大量的if 判斷。所以,這里基于TypeHandler 接口對(duì)每個(gè)參數(shù)類型分別做了自己的策略實(shí)現(xiàn)。

同類場(chǎng)景:PooledDataSource、UnpooledDataSource、BatchExecutor、ResuseExecutor、SimpleExector、CachingExecutor、LongTypeHandler、StringTypeHandler 和DateTypeHandler。

▊迭代器模式

拆解字段解析實(shí)現(xiàn)的結(jié)構(gòu)如圖11所示。

9d997090-dedb-11ed-bfe3-dac502259ad0.png

圖11

迭代器模式:是一種行為型模式,能在不暴露集合底層表現(xiàn)形式的情況下遍歷集合中的所有元素。

場(chǎng)景介紹:PropertyTokenizer 用于MyBatis 的MetaObject 反射工具包下,用來解析對(duì)象關(guān)系的迭代操作。這個(gè)類在MyBatis 中使用得非常頻繁,包括解析數(shù)據(jù)源配置信息并填充到數(shù)據(jù)源類上,同時(shí)參數(shù)的解析、對(duì)象的設(shè)置都會(huì)使用這個(gè)類。

同類場(chǎng)景:PropertyTokenizer。

04

總結(jié)

通過梳理,MyBatis大約運(yùn)用了10種左右設(shè)計(jì)模式。可以說,復(fù)雜且優(yōu)秀的ORM 框架源碼在設(shè)計(jì)和實(shí)現(xiàn)的過程中都會(huì)使用大量的設(shè)計(jì)模式。

在解決復(fù)雜場(chǎng)景的問題時(shí),需要采用分治、抽象的方法,運(yùn)用設(shè)計(jì)模式和設(shè)計(jì)原則等相關(guān)知識(shí),把問題合理切割為若干子問題,以便加以理解和解決。

學(xué)習(xí)源碼遠(yuǎn)不是只是為了應(yīng)付面試,更重要的是學(xué)習(xí)優(yōu)秀框架在復(fù)雜場(chǎng)景下的解決方案。通過學(xué)習(xí)這些優(yōu)秀的方案技術(shù),可以提高對(duì)技術(shù)設(shè)計(jì)和實(shí)現(xiàn)的理解,擴(kuò)展編碼思維,積累落地經(jīng)驗(yàn)。只有經(jīng)過這樣長(zhǎng)期的積累,我們才更有可能成為優(yōu)秀的高級(jí)工程師和架構(gòu)師。

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 適配器
    +關(guān)注

    關(guān)注

    8

    文章

    1933

    瀏覽量

    67930
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    399

    瀏覽量

    17437
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    633

    瀏覽量

    29147

原文標(biāo)題:手寫一個(gè)MyBatis框架,太牛了

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    文了解MyBatis的查詢?cè)?/a>

    本文通過MyBatis個(gè)低版本的bug(3.4.5之前的版本)入手,分析MyBatis次完整的查詢流程,從配置文件的解析到
    的頭像 發(fā)表于 10-10 11:42 ?1403次閱讀

    mybatis的開發(fā)環(huán)境搭建

    mybatis個(gè)ORM(Object RelationalMapping 對(duì)象模型到關(guān)系模型的映射)框架。解決對(duì)象模型到二維表的關(guān)系模型的阻抗不匹配的問題。ORM框架在三層結(jié)構(gòu)中,處
    發(fā)表于 05-27 06:19

    數(shù)據(jù)庫整合Mybatis框架

    微服務(wù) SpringBoot 20(九):整合Mybatis
    發(fā)表于 07-16 11:03

    怎樣去設(shè)計(jì)個(gè)基于springmvc+spring+mybatis的SSM電影購票系統(tǒng)

    介紹開發(fā)技術(shù) : springmvc+spring+mybatis(ssm)框架 mysql數(shù)據(jù)庫 支付寶沙箱支付 layUI 百度echarts圖表 redis緩存中間件特色:支付、...
    發(fā)表于 01-03 07:58

    jdbc與mybatis的區(qū)別

    MyBatis款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。JDBC是
    發(fā)表于 02-02 17:43 ?1.1w次閱讀
    jdbc與<b class='flag-5'>mybatis</b>的區(qū)別

    mybatis配置文件詳解

    MyBatis 本是apache的個(gè)開源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation 遷移到了google code,并且改名為MyBatis
    的頭像 發(fā)表于 02-12 11:16 ?6417次閱讀
    <b class='flag-5'>mybatis</b>配置文件詳解

    mybatis是什么_MyBatis的優(yōu)缺點(diǎn)詳解_mybatis框架入門詳解

    Mybatis框架是別人開發(fā)的種半成品軟件,可以用來通過定制輔助快速開發(fā)是工具。MyBatis應(yīng)用程序根據(jù)XML配置文件創(chuàng)建SqlSessionFactory,SqlSessionF
    發(fā)表于 02-24 09:16 ?2w次閱讀

    mybatis和hibernate比較_區(qū)別_優(yōu)缺點(diǎn)

    Hibernate 是當(dāng)前最流行的O/R mapping框架,它出身于sf.net,現(xiàn)在已經(jīng)成為Jboss的部分。 Mybatis 是另外種優(yōu)秀的O/R mapping
    的頭像 發(fā)表于 02-24 10:35 ?3w次閱讀

    easy-mybatis Mybatis的增強(qiáng)框架

    ./oschina_soft/gitee-easy-mybatis.zip
    發(fā)表于 06-14 09:45 ?1次下載
    easy-<b class='flag-5'>mybatis</b> <b class='flag-5'>Mybatis</b>的增強(qiáng)<b class='flag-5'>框架</b>

    Fluent Mybatis、原生MybatisMybatis Plus對(duì)比

    使用fluent mybatis可以不用寫具體的xml文件,通過java api可以構(gòu)造出比較復(fù)雜的業(yè)務(wù)sql語句,做到代碼邏輯和sql邏輯的合。不再需要在Dao中組裝查詢或更新操作,在xml或
    的頭像 發(fā)表于 09-15 15:41 ?1410次閱讀

    MyBatis-Plus為什么不支持聯(lián)表

    MyBatis Plus Join`款專門解決MyBatis Plus 關(guān)聯(lián)查詢問題的擴(kuò)展框架,他并不款全新的
    的頭像 發(fā)表于 02-28 15:19 ?2420次閱讀
    <b class='flag-5'>MyBatis</b>-Plus為什么不支持聯(lián)表

    SpringBoot+Mybatis如何實(shí)現(xiàn)流式查詢?

    使用mybatis作為持久層的框架時(shí),通過mybatis執(zhí)行查詢數(shù)據(jù)的請(qǐng)求執(zhí)行成功后,mybatis返回的結(jié)果集不是
    的頭像 發(fā)表于 06-12 09:57 ?1244次閱讀

    MyBatis動(dòng)態(tài)sql是什么?MyBatis動(dòng)態(tài)SQL最全教程

    動(dòng)態(tài) SQL 是 MyBatis 的強(qiáng)大特性之。在 JDBC 或其它類似的框架中,開發(fā)人員通常需要手動(dòng)拼接 SQL 語句。根據(jù)不同的條件拼接 SQL 語句是件極其痛苦的工作。
    的頭像 發(fā)表于 08-10 10:18 ?927次閱讀

    mybatis和mybatisplus的區(qū)別

    MyBatisMyBatis Plus是兩個(gè)非常受歡迎的Java持久層框架。這兩個(gè)框架在設(shè)計(jì)和
    的頭像 發(fā)表于 12-03 11:53 ?2493次閱讀

    mybatis框架的主要作用

    MyBatis框架種流行的Java持久化框架,主要用于簡(jiǎn)化數(shù)據(jù)庫操作和管理。它提供了種簡(jiǎn)潔的方式來訪問數(shù)據(jù)庫,并將SQL語句從Java
    的頭像 發(fā)表于 12-03 14:49 ?1983次閱讀