ODB——基于c++的ORM映射框架尝试(使用)
2、使用
首先,需要定義一個對象,用來和數據庫字段對應:
[cce lang=”cpp”]
#ifndef VOLUME_H
#define VOLUME_H
#include <string>
#include <odb/core.hxx>
#pragma db object
class Volume
{
public:
Volume(const std::string &name, const std::string &location, const std::string &cover_path, int trackCount)
: _name(name), _location(location), _cover_path(cover_path), _trackerCount(trackCount)
{}
unsigned long long id() { return _id; }
void id(unsigned long long i) { _id = i;}
const std::string &name() {return _name;}
void name(const std::string &n) {_name = n;}
const std::string &location() {return _location;}
void location(const std::string &l) {_location = l;}
const std::string &cover_path() {return _cover_path;}
void cover_path(const std::string &c) {_cover_path = c;}
int trackCount() {return _trackerCount;}
void trackCount(int c) {_trackerCount = c;}
private:
friend class odb::access;
Volume () {}
#pragma db id auto
unsigned long long _id;
std::string _name;
std::string _location;
std::string _cover_path;
int _trackerCount;
};
[/cce]
首先是引入core.hxx這個頭文件,包含access這個類。在類上面添加#pragma db object宏,標識這是個數據庫對象。在主鍵上增加宏#pragma db id auto,標識這個是主鍵,并且自增。這兩個宏都是提供信息給odb,用來生成最終c++代碼的。因為數據庫對應字段都是私有類型,所以需要將odb::access聲明為友元。
為了方便,這里連接數據庫都使用sqlite,因此,需要引入sqlite相關的包。創建數據庫連接(對sqlite來說,就是打開數據庫文件):
[cce lang=”cpp”]
std::shared_ptr<odb::database> sqliteDB(new odb::sqlite::database("mycppweb.db", SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE));
[/cce]
注:這里需要引入頭文件odb/sqlite/database.hxx,創建數據庫連接的第一個參數(只針對sqlite)是數據庫文件名,后面是打開的flag,這里主要是提示如果數據庫文件不存在,默認創建。另外,這里使用了c++11的shared_ptr,g++需要添加參數-std=c++0x
插入對象:
[cce lang=”cpp”]
{
odb::transaction t(db->begin());
volumeId = db->persist(volume);
t.commit();
}
[/cce]
插入的時候,使用了事務,需要引入odb/transaction.hxx頭文件,并且盡量減少transaction的生命周期。
通過odb命令生成對應的代碼:
[cce lang=”bash”]
odb –database sqlite \
–hxx-suffix .hpp –ixx-suffix .ipp –cxx-suffix .cpp \
–output-dir /tmp \
–generate-query –generate-schema –schema-format embedded volume.h
[/cce]
這里指定輸出的數據庫是sqlite,創建schema的語句嵌入到代碼里面。
執行之后,會生成volume-odb.hpp、volume-odb.cpp和volume-odb.ipp三個文件。查看volume-odb.cpp就會發現,里面包含了volume.h中指定的類和數據庫表的關系。如果希望通過代碼來創建數據庫(貌似需要自己來判斷是否已經存在,否則第二次運行又會重新創建表,導致數據丟失),可以通過:
[cce lang=”cpp”]
{
odb::transaction t (sqliteDB->begin ());
odb::schema_catalog::create_schema (*sqliteDB);
t.commit ();
}
[/cce]
odb的查詢,還沒有去嘗試,具體文檔在http://www.codesynthesis.com/products/odb/doc/manual.xhtml
轉載自:https://coolex.info/blog/376.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的ODB——基于c++的ORM映射框架尝试(使用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ALAC(Act-like-a-cust
- 下一篇: 4.30Java Iterator迭代器