一文詳解 C++ 框架:快速認識 ORM

什麼是 ORM?

關於 ORM,維基百科描述如下:

ORM 全稱是 Object Relational Mapping(對象關係映射),是一種程序設計技術,用於實現面向對象編程語言裡不同類型系統的數據之間的轉換。從效果上說,它其實是創建了一個可在編程語言裡使用的“虛擬對象數據庫”。


面向對象是從軟件工程基本原則(如耦合、聚合、封裝)的基礎上發展起來的,而關係數據庫則是從數學理論發展而來的,兩套理論存在顯著的區別。為了解決這個不匹配的現象,對象關係映射技術應運而生。

簡單理解,ORM 就是在數據庫和對象之間作了一個映射:

一文詳解 C++ 框架:快速認識 ORM

ORM


  • 數據庫的表(table) --> 類(class)
  • 記錄(record,行數據)--> 對象(object)
  • 字段(field)--> 對象的屬性(attribute)


為什麼使用 ORM?

ORM 在關係數據庫上提供了一個高級抽象,開發者可以使用自己喜歡的編程語言來處理數據庫,而不必編寫 SQL 語句或存儲過程。

舉個栗子吧,有一張用戶表 user,要獲取 id 為 1 的記錄。按照傳統方式,先要編寫一條 SQL 語句:

<code>QStringsql="select*fromuserwhereid=1";/<code>

然後再執行 SQL 查詢,隨後就可以獲取記錄以及其中的字段值了:

<code>QSqlQueryquery;query.exec(sql);if(query.next()){//獲取記錄QSqlRecordrecord=query.record();if(!record.isEmpty()){//獲取字段值QStringname=record.value("name").toString();intage=record.value("age").toInt();qDebug()</<code>

如果改為 ORM(例如:QxOrm),就會變為這樣:

<code>typedefQSharedPointer<user>UserPtr;UserPtruser(newUser());user->id=1;QSqlErrordaoError=qx::dao::fetch_by_id(user);if(daoError.type()==QSqlError::NoError){qDebug()<name<age;}/<user>/<code> 

比較之後你會發現,ORM 使用對象封裝了數據庫操作,因此不必再和 SQL 語句打交道了。只需要與數據對象直接交互即可,而無需關心底層數據庫。


ORM 的優缺點

無論是何種技術,在使用時都應該權衡一番。ORM 也不例外,一起來看看它的優缺點吧!

優點:

  • ORM 提供了一種面向對象的查詢語言,這使得開發者可以專注於對象模型,而不必關心數據庫結構或 SQL 語義。
  • ORM 提供了大量的服務,開發者只需要關注業務邏輯,而不是重複的 CRUD(Create、Read、Update、Delete)操作,這可以減少大量的代碼。
  • ORM 將迫使你使用 MVC 風格,這通常會使代碼更加簡潔、更容易理解。
  • ORM 有現成的工具,很多功能可以自動完成,比如預處理、事務等。
  • ORM 對數據庫進行了抽象,因此從一種數據庫切換到另一種(例如:從 MySQL 到 PostgreSQL)會很容易。

缺點:

  • 無論是什麼 ORM 框架,都需要花費相當大的精力去學習和理解。
  • ORM 抽象掉了數據庫層,開發者無法瞭解底層數據庫(和 SQL)的相關操作。
  • 對於複雜的查詢,ORM 要麼難以實現,要麼性能不如原生的 SQL。


主流的 ORM 框架

目前為止,C++ 中主流的 ORM 框架有以下幾個:

  • LiteSQL:https://litesql.org/
  • ODB:https://www.codesynthesis.com/products/odb/
  • QxOrm:https://www.qxorm.com/qxorm_en/home.html
  • Wt::Dbo:https://www.webtoolkit.eu/wt/doc/tutorial/dbo.html

為了更清楚地瞭解它們的現狀,有必要從不同角度對比一番,像許可協議、所支持的數據庫等:

一文詳解 C++ 框架:快速認識 ORM

ORM 各個框架

其中,LiteSQL 和 ODB 不依賴於特定的框架,而 QxOrm 依賴於 Qt,Wt::Dbo 依賴於 Wt。

綜合考慮,如果是純 C++ 開發,可以選擇使用 ODB。它擁有大量的用戶群體,(相比 LiteSQL)技術支持好,(相比 QxOrm)編譯時間短,(相比 Wt::Dbo)提供了更多的特性,更重要的是它易於使用,並且提供了很全面的文檔。

當然,如果是 Qt 開發,也可以選擇使用 QxOrm。它幾乎支持所有的數據庫,並且也有良好的文檔。除此之外,它還提供了一個圖形編輯器 - QxEntityEditor,可以很方便地以圖形方式來管理數據模型。


還有些什麼

ORM 並不是 SQL/DB 技能的替代者,而是對它的補充,這兩者可以說是相輔相成的!

就個人而言,我更喜歡使用 ORM,而不是編寫 SQL 代碼。因為後者很難維護,而 ORM 卻能以更易讀的格式提供所需的數據。另一方面,當在小型團隊中工作時,一般我們充當的都是“全棧工程師”的角色,很少有專門的數據庫專家做支持,這時 ORM 能極大地簡化數據層的工作。

當然了,上述觀點有一定的偏見,最終如何選擇還是要取決於自己。無論如何,我還是強烈建議大家要理解 SQL 的原則,並掌握其中的一些常見操作。倘若你還沒有使用過 ORM,建議嘗試一下,看看它究竟是如何工作的,我相信你會喜歡上它的。


作者:一去、二三里,愛編程、愛分享、愛生活!

歡迎大家關注,更多優質原創內容敬請期待!


分享到:


相關文章: