什么是 ORM?
關于 ORM,維基百科描述如下:
ORM 全稱是 Object Relational MApping(對象關系映射),是一種程序設計技術,用于實現面向對象編程語言里不同類型系統的數據之間的轉換。從效果上說,它其實是創建了一個可在編程語言里使用的“虛擬對象數據庫”。
面向對象是從軟件工程基本原則(如耦合、聚合、封裝)的基礎上發展起來的,而關系數據庫則是從數學理論發展而來的,兩套理論存在顯著的區別。為了解決這個不匹配的現象,對象關系映射技術應運而生。
簡單理解,ORM 就是在數據庫和對象之間作了一個映射:
ORM
- 數據庫的表(table) --> 類(class)
- 記錄(record,行數據)--> 對象(object)
- 字段(field)--> 對象的屬性(attribute)
為什么使用 ORM?
ORM 在關系數據庫上提供了一個高級抽象,開發者可以使用自己喜歡的編程語言來處理數據庫,而不必編寫 SQL 語句或存儲過程。
舉個栗子吧,有一張用戶表 user,要獲取 id 為 1 的記錄。按照傳統方式,先要編寫一條 SQL 語句:
QStringsql="select*fromuserwhereid=1";
然后再執行 SQL 查詢,隨后就可以獲取記錄以及其中的字段值了:
QSqlQueryquery;
query.exec(sql);
if(query.next()){
//獲取記錄
QSqlRecordrecord=query.record();
if(!record.isEmpty()){
//獲取字段值
QStringname=record.value("name").toString();
intage=record.value("age").toInt();
qDebug()<<"name:"<<name<<"age:"<<age;
}
}
如果改為 ORM(例如:QxOrm),就會變為這樣:
typedefQSharedPointer<User>UserPtr;
UserPtruser(newUser());
user->id=1;
QSqlErrordaoError=qx::dao::fetch_by_id(user);
if(daoError.type()==QSqlError::NoError){
qDebug()<<"name:"<<user->name<<"age:"<<user->age;
}
比較之后你會發現,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
為了更清楚地了解它們的現狀,有必要從不同角度對比一番,像許可協議、所支持的數據庫等:
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,建議嘗試一下,看看它究竟是如何工作的,我相信你會喜歡上它的。
作者:一去、二三里,愛編程、愛分享、愛生活!
歡迎大家關注,更多優質原創內容敬請期待!
本文出自頭條號【高效程序員】,VX 公眾號同名。