色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

手寫一個MyBatis框架

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

在MyBatis的兩萬多行的框架源碼中,使用了大量的設計模式對工程架構中的復雜場景進行解耦,這些設計模式的巧妙使用是整個框架的精華。

經過整理,大概有以下設計模式,如圖1所示。

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

圖1

01

類型:創建型模式

▊工廠模式

SqlSessionFactory 的結構如圖2所示。

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

圖2

工廠模式:簡單工廠是一種創建型模式,在父類中提供一個創建對象的方法,允許子類決定實例對象的類型。

場景介紹:SqlSessionFactory 是獲取會話的工廠,每次使用MyBatis 操作數據庫時,都會開啟一個新的會話。在會話工廠的實現中,SqlSessionFactory 負責獲取數據源環境配置信息、構建事務工廠和創建操作SQL 的執行器,最終返回會話實現類。

同類設計:SqlSessionFactory、ObjectFactory、MapperProxyFactory 和DataSourceFactory。

▊單例模式

Configuration 單例配置類的結構如圖3所示。

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

圖3

單例模式:是一種創建型模式,能夠保證一個類只有一個實例,并且提供一個訪問該實例的全局節點。

場景介紹:Configuration 是一個大單例,貫穿整個會話周期,所有的配置對象(如映射、緩存、入參、出參、攔截器、注冊機和對象工廠等)都在Configuration 配置項中初始化,并且隨著SqlSessionFactoryBuilder 構建階段完成實例化操作。

同類場景:ErrorContext、LogFactory 和Configuration。

▊建造者模式

ResultMap 建造者模式的結構如圖4所示。

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

圖4

建造者模式:使用多個簡單的對象一步一步地構建成一個復雜的對象,提供了一種創建對象的最佳方式。

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

同類場景:SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XML StatementBuilder 和CacheBuilder。

02

類型:結構型模式

▊適配器模式

日志實現類的結構如圖5所示。

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

圖5

適配器模式:是一種結構型模式,能使接口不兼容的對象也可以相互合作。

場景介紹:正是因為有太多的日志框架,包括Log4j、Log4j2 和Slf4J 等,而這些日志框架的使用接口又各有差異,為了統一這些日志框架的接口,MyBatis 定義了一套統一的接口,為所有的其他日志框架的接口做相應的適配。

同類場景:主要集中在對Log 日志的適配上。

▊代理模式

代理模式的實現結構如圖6所示。

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

圖6

代理模式:是一種結構型模式,能夠提供對象的替代品或占位符。代理控制元對象的訪問,并且允許在將請求提交給對象前進行一些處理。

場景介紹:沒有代理模式就不存在各類框架。就像MyBatis 中的MapperProxy 實現類,代理工廠實現的功能就是完成DAO 接口的具體實現類的方法,配置的任何一個DAO 接口調用的CRUD 方法,都會被MapperProxy 接管,調用到方法執行器等,并返回最終的數據庫執行結果。

同類場景:DriverProxy、Plugin、Invoker 和MapperProxy。

▊組合模式

解析節點類的結構如圖7所示。

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

圖7

組合模式:是一種結構型模式,可以將對象組合成樹形結構以表示“部分—整體” 的層次結構。

場景介紹:在MyBatis XML 動態的SQL 配置中,共提供了9 種標簽(trim、where、set、foreach、if、choose、when、otherwise 和bind),使用者可以組合出各類場景的SQL 語句。而SqlNode 接口的實現就是每個組合結構中的規則節點,通過規則節點的組裝,完成規則樹組合模式的使用。

同類場景:主要體現在對各類SQL 標簽的解析上,以實現SqlNode 接口的各個子類為主。

▊裝飾器模式

二級緩存裝飾器的實現結構如圖8所示。

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

圖8

裝飾器模式:是一種結構型設計模式,允許將對象放入包含行為的特殊封裝對象中,為元對象綁定新的行為。

場景介紹:MyBatis 的所有SQL 操作都是經過SqlSession 調用SimpleExecutor 完成的,而一級緩存的操作也是在簡單執行器中處理的。這里的二級緩存因為是基于一級緩存刷新的,所以在實現上,通過創建一個緩存執行器,包裝簡單執行器的處理邏輯,實現二級緩存操作。這里用到的就是裝飾器模式,也叫俄羅斯套娃模式。

03

類型:行為型模式

▊模板模式

SQL 執行模板模式如圖9所示。

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

圖9

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

同類場景:BaseExecutor、SimpleExecutor 和BaseTypeHandler。

▊策略模式

多類型處理器策略模式的結構如圖10所示。

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

圖10

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

場景介紹:在MyBatis 處理JDBC 執行后返回的結果時,需要按照不同的類型獲取對應的值,這樣就可以避免大量的if 判斷。所以,這里基于TypeHandler 接口對每個參數類型分別做了自己的策略實現。

同類場景:PooledDataSource、UnpooledDataSource、BatchExecutor、ResuseExecutor、SimpleExector、CachingExecutor、LongTypeHandler、StringTypeHandler 和DateTypeHandler。

▊迭代器模式

拆解字段解析實現的結構如圖11所示。

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

圖11

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

場景介紹:PropertyTokenizer 用于MyBatis 的MetaObject 反射工具包下,用來解析對象關系的迭代操作。這個類在MyBatis 中使用得非常頻繁,包括解析數據源配置信息并填充到數據源類上,同時參數的解析、對象的設置都會使用這個類。

同類場景:PropertyTokenizer。

04

總結

通過梳理,MyBatis大約運用了10種左右設計模式。可以說,復雜且優秀的ORM 框架源碼在設計和實現的過程中都會使用大量的設計模式。

在解決復雜場景的問題時,需要采用分治、抽象的方法,運用設計模式和設計原則等相關知識,把問題合理切割為若干子問題,以便加以理解和解決。

學習源碼遠不是只是為了應付面試,更重要的是學習優秀框架在復雜場景下的解決方案。通過學習這些優秀的方案技術,可以提高對技術設計和實現的理解,擴展編碼思維,積累落地經驗。只有經過這樣長期的積累,我們才更有可能成為優秀的高級工程師和架構師。

審核編輯 :李倩

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 適配器
    +關注

    關注

    8

    文章

    1970

    瀏覽量

    68168
  • 框架
    +關注

    關注

    0

    文章

    403

    瀏覽量

    17522
  • 源碼
    +關注

    關注

    8

    文章

    652

    瀏覽量

    29363

原文標題:手寫一個MyBatis框架,太牛了

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    文了解MyBatis的查詢原理

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

    mybatis的開發環境搭建

    mybatisORM(Object RelationalMapping 對象模型到關系模型的映射)框架。解決對象模型到二維表的關系模型的阻抗不匹配的問題。ORM框架在三層結構中,處
    發表于 05-27 06:19

    數據庫整合Mybatis框架

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

    怎樣去設計基于springmvc+spring+mybatis的SSM電影購票系統

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

    jdbc與mybatis的區別

    MyBatis款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。JDBC是
    發表于 02-02 17:43 ?1.1w次閱讀
    jdbc與<b class='flag-5'>mybatis</b>的區別

    mybatis配置文件詳解

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

    mybatis是什么_MyBatis的優缺點詳解_mybatis框架入門詳解

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

    mybatis和hibernate比較_區別_優缺點

    Hibernate 是當前最流行的O/R mapping框架,它出身于sf.net,現在已經成為Jboss的部分。 Mybatis 是另外種優秀的O/R mapping
    的頭像 發表于 02-24 10:35 ?3w次閱讀

    easy-mybatis Mybatis的增強框架

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

    Fluent Mybatis、原生MybatisMybatis Plus對比

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

    MyBatis-Plus為什么不支持聯表

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

    SpringBoot+Mybatis如何實現流式查詢?

    使用mybatis作為持久層的框架時,通過mybatis執行查詢數據的請求執行成功后,mybatis返回的結果集不是
    的頭像 發表于 06-12 09:57 ?1307次閱讀

    MyBatis動態sql是什么?MyBatis動態SQL最全教程

    動態 SQL 是 MyBatis 的強大特性之。在 JDBC 或其它類似的框架中,開發人員通常需要手動拼接 SQL 語句。根據不同的條件拼接 SQL 語句是件極其痛苦的工作。
    的頭像 發表于 08-10 10:18 ?991次閱讀

    mybatis和mybatisplus的區別

    MyBatisMyBatis Plus是兩非常受歡迎的Java持久層框架。這兩框架在設計和
    的頭像 發表于 12-03 11:53 ?2619次閱讀

    mybatis框架的主要作用

    MyBatis框架種流行的Java持久化框架,主要用于簡化數據庫操作和管理。它提供了種簡潔的方式來訪問數據庫,并將SQL語句從Java
    的頭像 發表于 12-03 14:49 ?2073次閱讀
    主站蜘蛛池模板: 一级毛片视频免费 | 神马影院在线eecss伦理片 | 视频一区二区三区蜜桃麻豆 | 牲高潮99爽久久久久777 | 中国老太60old mantv | tobu中国日本高清 | 亚洲人成77777 | 国产在线观看免费观看 | 亚洲午夜精品aaa级久久久久 | 高清毛片一区二区三区 | 亚洲欧美国产旡码专区 | 色悠久久久久综合欧美99 | 国产成+人欧美+综合在线观看 | 人C交ZZZ0OOZZZ000| 亚洲精品国产乱码AV在线观看 | 久久精麻豆亚洲AV国产品 | 午夜精品久久久久久99热蜜桃 | 丝瓜涩涩屋黄瓜香蕉丝瓜 | 久操久操久操 | 两个人看的www免费高清直播 | 男人被绑着强行摸j | 亚州中文字幕 | 嫩草影院精品视频在线观看 | 古风H啪肉NP文 | 精品午夜寂寞影院在线观看 | 久久久无码精品无码国产人妻丝瓜 | 国产美熟女乱又伦AV | 正在播放国产尾随丝袜美女 | 99热久久视频只有精品6 | 日韩视频在线观看 | 亚洲AV成人无码网天堂 | 交换邻居波多野结衣中文字幕 | 精品午夜久久福利大片免费 | 神马电影我不卡国语版 | 18禁无遮挡羞羞污污污污免费 | 亚洲AV无码久久流水呻蜜桃久色 | 台湾18成人影院 | 国产学生在线播放精品视频 | 亚洲日韩欧美国产专区 | 中文字幕成人在线观看 | 久久精品久久久 |