source: http://blog.csdn.net/CAICHAO1234/article/details/8997051
(一)
前段時間瞭解了下ORM(對象關係映射),然後就找了下C++的ORM架構,發現真的是很少,主要就下面幾種
名稱 |
開源 |
License |
需要特定的架構支援 |
支援Qt |
支援Boost |
支援MySQL |
支援PostgreSQL |
支援SQLite |
支援XML |
支援Oracle |
支援MSSQL Server |
支援ODBC |
支援IBM DB2 |
LiteSQL |
Yes |
BSD |
no |
Yes |
|
Yes |
Yes |
Yes |
|
|
|
|
|
ODB |
Yes |
GPL/other |
no |
Yes |
Yes |
Yes |
Yes |
Yes |
|
Yes |
|
|
|
QxOrm |
Yes |
LGPL |
yes, Qt |
Yes |
Yes |
Yes |
Yes |
Yes |
|
Yes |
Yes |
Yes |
Yes |
Wt::Dbo |
Yes |
GPL / commercial |
yes, Wt |
No |
Yes |
Yes |
Yes |
Yes |
No |
No |
No |
No |
No |
LiteSQL用xml定義表單,而且感覺它好像是把所有庫的支援都寫到一個動態連結程式庫裡面去了,所以比較龐大,QxQrm、Wt::Dbo又依賴於特定的架構。所以綜合考慮,感覺ODB最適合用來開發了。官網傳送門
ODB支援特性
- 自動產生資料庫支援的代碼(跨資料庫)
- 能夠處理任何的標準C++代碼(無開發平台限制)
- 根據類的定義,編譯產生資料庫表單(可在Visual Studio中配置編譯命令)
- 表單是以獨立的SQL檔案,或者嵌入C++的SQL代碼的形式存在的
- 支援物件導向的持久化模型和資料庫API(提供簡單易用的資料庫操作方法)
- 支援基於運算式或者型別安全的物件查詢語言
- ODB使用了版本控制
- 支援執行本地SQL語言
- 支援SQL跟蹤(輸出視窗可即時輸出當前執行的SQL語句)
- 跨平台,提供串連池保證安全執行緒
關於映射
- 預設映射所有基本的C++類型和std::string
- 自動對應C++的枚舉對象到資料庫的ENUM類型或者整型
- 支援映射BLOB類型到std::vector<char>
- 支援合成實值型別(自動解析成多欄位)
- 支援NULL語義映射到智能指標,諸如odb::nullable or boost::optional.
- 支援分配表名到持久類
- 支援分配欄位名到資料成員
- 支援映射C++類型到資料庫類型
- 支援自動賦值的對象id
- 支援沒有id的持久化類
- 支援唯讀/常量資料成員
- 支援使用自訂的智能指標作為object/view/value的指標
- 支援cache技術(使用session)
具體使用可以見官方的odb手冊,在這裡
寫了個小例子,全面地感受了下ODB(1.7.0版)。總體來說還是不錯,不過應用到實際的項目中,問題還是比較大。
首先是不支援聯合主鍵,而且沒有CHECK約束、UNIQUE約束,這是官方都承認的。
雖然提供了消極式載入(lazyload)來改善效率,不過使用起來不方便
查詢不靈活,只能在WHERE之後的部分設定查詢條件,像查詢存在(SELECT EXISTS)、查詢數量(SELECT COUNT)都必須定義一個視圖來實現,實在麻煩
大量刪除比較慢,而且不靈活。進階一點只提供了按查詢條件刪除,但是這是遠遠不夠的,雖然開放了執行SQL的介面,但是這樣就破壞了ORM工具設計的初衷,也為以後維護帶來了麻煩。
有觸發器對應的功能(即軟體實現),提供了callback(回調),支援觸發器常用的事件,刪除前後、新增前後等。不過我嘗試添加一個刪除觸發另外一個表的資料刪除編譯失敗了,不知為何
沒有預存程序、遊標對應的軟體實現
下面是附件源碼的運行結果:
附件下載:
http://dl.dbank.com/c07l5w5k7x
(需要去官網下載ODB編譯並加入到VC目錄下,推薦使用VS2008SP1以上版本的IDE,或者使用boost庫,因為需要用到智能指標)