“很多人都不太認可以第三方ORM,因為考慮的點不夠全面,沒有大用戶群體的ORM有保證,這點是不可否認確是事實。但是往往用戶群體大的ORM又有不足之處,今天我們就來聊聊關於ORM的話題,打造一款人見人愛的ORM框架。”
小程簡介
季健國(螞蟻Ant),10年的工作經驗, 7年的IT經驗是一枚名副其實的屌絲程序員。技術無邊界,編程靠思想。因為對這份職業的熱愛,所以我到現在還在一直從事這份職業。目前主要研究方向為ORM底層核心,爬蟲,WebAPI,SOA,Docker,Xamarin,微信小程序,微服務架構;個人愛好:閱讀,跑步,打羽毛球,擼代碼;歡迎有同共愛好的小伙伴為友加我QQ:181589805
前言
小程故事
在這十年的技術生涯中,需要走過多少路,從中獲得坎坷成長。我和許多技術人一樣,曾經徘徊過,也迷茫過。這十年里的成長談不上有什么豐功偉績,自然就談不上什么技術大牛,我只是想把自己的所見所聞親身經歷的點點滴滴做一些總結。因為這中間有太多的成長感悟,我也會將把自己所學到的技術以及踩過的坑逐步分享給大家。希望能為有同樣成長過程中的朋友產生共鳴,幫助大家少踩一些坑。
話說十年磨一劍,這次分享關於打造一款人見人愛的AntORM框架,也算是我這十年當中磨出來其中一把劍。今天分享出來希望可以幫助正在成長中的農碼們,為項目盡可能縮短開發周期以及提高工作效率。讓大家也盡量擺脫常常因需求的變化,導致無休此的加班一直擼呀擼。因為往往選擇一個好的框架,才是你應對需求變化可以作出快速上線帶來幫助,這樣也能讓你減少加班,多一點時間陪陪家人。
這次是我第一次做這樣的分享, 以后我還給大家分享我的一些好的框架。這邊也呼吁一下大家,希望能聚集到一批志同道合的小伙伴們入群(QQ群號:20870428)相互交流一起成長。
項目地址:https://git.coding.net/jjg0513/AntORM.git 或者進群網盤里有完整可運行的項目文件
我為什么還要造這個輪子
可能大家都會有一個疑問:“目前市面上這么多ORM框架層出不窮,為什么還要花代價再造這套ORM框架?”。也正因為市面上ORM框架很多花樣百出,但令人滿意的ORM框架卻是少至又少。接下來我會從入門階段到興趣階段再到開發階段進行講述造輪子的過程。
其實我對ORM框架接觸的時間也比較長,剛入道的時候就已經開始在用ORM框架了。回想起來,我最早接觸ORM大概是在2008年富深協通項目中用到ORM框架。現在看來那時候的項目也寫了一些最簡單的ORM框架,ORM的使用也都是在一些老前輩們指引下照葫蘆畫瓢,畢竟那時候對ORM也沒有什么概念,自然也就不懂ORM什么原理,當時也是剛入行不久。在此之前項目都是直接寫SQL語句來操作數據庫,而ORM框架可以直接給實體進行賦值調對應的方法,就可以對數據庫進行操作,覺得可以少寫不少代碼維護項目也很方便。再后面的項目中又用到SubSonic框架,這也算是我用到稍微有模有樣的ORM框架。但用起來配置還是很煩索,對數據庫的約束也太多而且每個表都要有固定幾個字段復雜性就不用說了,相對於一個剛入行的新手用起來有點痛苦。
我對ORM框架有着濃厚的興趣是2010年在淘常州項目中,讓我有更深入了解到ORM框架底層的原理。因為當時發現他們的項目不是用的第三方ORM框架,而是用他們自己寫的ORM框架,這套框架使用起來要比之前接觸的ORM框架要方便很多,於是在空余時間的時候,我就把項目里面的DLL文件反編譯成源碼,就對ORM的底層和實現進行一翻研究,也就從那時候我開始就對ORM框架產生濃厚的興趣。有點點想寫一套ORM框架的沖動,可惜那時候自己感覺還沒有能力去寫一套ORM框架。
對項目快速變化沒有ORM框架的痛苦是2013年在同程旅游的項目中。之前一直都在常州工作生活,也是一次偶然的有機會去蘇州全新的開始,讓我有幸進入同程旅游景區研發團隊。原本以為進這樣千人研發團隊,應該有它們自己比較牛的ORM框架來學習一下。進去之后卻發現我接觸的大部分的項目都是沒有用ORM框架,基本都是簡單三層加SOA的架構來實現,不過我是覺得他們的SOA框架比較不錯的。居聽說也一些大牛從JAVA開源的SOA移植過來的,以后有機我再給大家分享關於他們的SOA框架。當時他們的項目都是用SQL語句來實現,也許是因為直接寫SQL語句要比ORM去解析SQL語句的效率要高。但隨着不斷擴張,導致需求常常在變化,這樣數據庫字段也是會隨之增加或減少,就會讓項目從實體層、數據層、業務層、頁面層通通改一遍。所以那時候我每天就是苦逼加班擼代碼,就想要是能在項目用上ORM框架那該多好,最起碼能解決不用這樣苦逼一直加減字段所有地方都要改,說起來都是淚......只能認命去承受現實的痛苦,那時候也就下定決定要自己搞一個好的ORM框架來提高工作效率和性能的想法,畢竟在這之前我也接觸了不少ORM的框架了。於是,徹底激發我的想寫一套ORM的念頭,於是就利用空閑不要加班的時間就開始在網上查資料,找一些開源的ORM框架來研究以及學習它們好的思想,從中提取一些好的核心開始造輪子之旅。
總算功夫不負有心人,用了差不多一年的時間,一套屬於自己的ORM框架也就問世。最初我的ORM框架也只是能實現一些基本的增刪改功能,但我已經很滿意。我就把ORM框架運用自己的項目中,但是,久而久之,問題就出現了當訪問量大的時候就會出現很慢,說明在性能方面還是有缺陷的。后來就仔細分析了代碼和在網上查了一些資料,發現是由於大量用了一些反射和裝箱拆箱操作導致性能下降。於是開始加入一些緩存技術,當項目啟動時會把所有實體屬性先進行遍歷放到緩存中去,后面再使用該實體的一些屬性就直接到緩存中取。這樣效率和性能放面上得到大大改善,但在多表查詢上面還不能實現。只能通過視圖來代替,缺陷就是如果項目里面視圖多了也很難維護。沒辦法當時我也算是已經用盡自己的洪荒之力,只能實現這么多了。
直到2015年我到景尚集團的一個項目中用了EF框架,雖然之前也聽過這框架但還沒有真正使用過,這個ORM框架必竟是微軟自己的框架,至於微軟的東西大家都懂的,就是過於寵大想要用好它,沒個一年半載的是駕馭不好這玩意,我也便進行了一翻學習開始使用,之后發現Linq語句能實現很好的多表關聯查詢。於是我就開始借鑒Linq的寫法來讓自己的ORM框架也慢慢的實現數據庫多表查詢,並且支持lambda表達式。就這樣我的ORM框架也能實現了多表查詢的方法,最近總算把一套接近完美的ORM框架打造問世了。掐指一算前后總共花了差不多有三年左右時間,全是利用了一些自己的空余時間不斷打磨完成的。也希望今后這個ORM框架能給大家在項目帶來幫助,真正做到讓使用者簡單、輕量、高效。
其實有時去重復造輪子並不是一件壞事,通過造輪子檢驗自己是否真的懂,往往聽到的、想到的和做出來完全不一樣。而且找自己感興趣的去做,事實證明興趣不僅是最好的老師,還是讓你不辭辛苦前進的動力。但我這里並不是鼓勵大家去造輪子,因為這里面造輪子的過程中的心酸只有經歷過才能體會到。
如果上面還不足以讓您明白我為什么要造這個輪子,那最后我要告訴您的是:因為我是一枚任性的程序員,我就是喜歡造自己的輪子!
什么是ORM
在介紹AntORM框架之前,先給大家科普一下什么是ORM,如果你是大鳥對ORM很了解可以直接繞道進行下一個環節AntORM架構的介紹。對象關系映射(英語Object Relation Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術,用於實現面向對象編程語言里不同類型系統的數據之間的轉換。從效果上說,它其實是創建了一個可在編程語言里使用的--“虛擬對象數據庫”。簡單的說:ORM是一種工具,可以自動地把領域對象數據存儲到關系型數據庫(如MS SQL Server),而不需要大量的編碼。
ORM包含三個重要的部分:
1. 領域對象(Domain class objects):我們定義的類。
2. 關系型數據庫對象(Relational database objects):數據庫表,視圖,存儲過程等。
3. 映射信息(Mapping information):領域對象與關系型數據庫對象之間轉換的信息。
ORM允許開發者把數據庫設計和領域對象設計獨立開,讓程序更具有可維護性和可擴展性。
它還提供了基本的增刪改查的功能,開發者不需要手動再編寫這部分代碼。
一個典型的數據庫與應用程序的ORM交互如下圖所示:

AntORM框架的介紹
AntORM是打造一款人見人愛的輕量、高效的.NET C#數據庫訪問框架(ORM)。目前AntORM可以支持五種數據庫。AntORM主要借鑒了Linq語法以及借助lambda 表達式來實現利用實體生成SQL語句,可以完全用面向對象的方式就能輕松執行多表連接查詢、分組查詢、聚合查詢、插入數據、批量刪除更新、數據庫事務和分表分庫靈活切換等操作。完全不需要拼接sql,開發容錯率極高。當然也提供原生sql查詢。而且開發者完全可以根據請求實體和響應實體來調用AntORM中提供的方法跟蹤每個方法執行時間和執行SQL語句。框架設計主打輕量、用法簡單,無第三方依賴。AntORM的任務就是將關系型數據庫中的數據通過ORM層映射為對象,使之能夠應用於面向對象程序,方便編程。您可以通過上面提供的項目地址進行下載Demo進行調試運行進行測試。
它確實為大多數程序員提供了便利:
1、程序員不需要再動手寫SQL語句,或者說大部分情況下不需要動手寫,只需要調用一系列函數即可完成數據庫CURD操作。
2、對不同數據庫管理系統的連接以及操作進行了抽象,程序員完全可以不考慮使用的是什么數據庫以及數據庫的版本。
3、對數據庫應用方便,同一個項目中可以支持同時多數據庫,以及數據讀寫分離都支持數據庫,配置簡單易操作。
4、每個方法都可以根據執行操作數據庫返回的實體,可以跟蹤方法所執行的SQL語句和執行所消耗的時間。
總之,在項目開發中,它的確為我們帶來了高效的開發效率。
今天就先分享到這邊,接下來我會教大家如何使用這套AntORM框架,敬請期待!如果大家有任何疑問可以留言,或者好的建議可以隨時聯系我。在此謝謝!
