前言
ODB 是一个开源的,支持多平台,支持多数据库的 C++ 的 ORM 框架,可将 C++ 对象数据库表映射,进行轻松的数据库查询和操作。 它提供工具、API,和库支持以允许持久化(存储) C++对象 到一个关系数据库 (RDBMS)而无需处理表、列或 SQL(语句)并且无需手工编写映射代码。
一、ODB的安装
ODB2.5 版本安装:
安装ODB2.5 版本之前需要先安装 build2,因为 build2 安装时,有可能会版本更新,从 16 变成 17,或从 17 变 18,因此注意,先从 build2 官网查看安装步骤。
安装步骤:https://build2.org/install.xhtml#unix
curl -sSfO https://download.build2.org/0.17.0/build2-install-0.17.0.sh
sh build2-install-0.17.0.sh
安装中因为网络问题导致超时失败,可以将超时时间设置的更长一些:
sh build2-install-0.17.0.sh --timeout 1800
安装 odb-compiler
# 注意这里的 gcc-11 需要根据你自己版本而定 可以使用g++ v查看版本
sudo apt-get install gcc-11-plugin-dev
mkdir odb-build && cd odb-build
bpkg create -d odb-gcc-N cc config.cxx=g++ config.cc.coptions=-O3 config.bin.rpath=/usr/lib config.install.root=/usr/ config.install.sudo=sudo
cd odb-gcc-N
bpkg build odb@https://pkg.cppget.org/1/beta
bpkg test odb test odb-2.5.0-b.25+1/tests/testscript{
testscript} tested odb/2.5.0-b.25+1
bpkg install odb
odb --version
# 如果报错了,找不到 odb,那就在执行下边的命令
sudo echo 'export PATH=${PATH}:/usr/local/bin' >> ~/.bashrc
export PATH=${
PATH}:/usr/local/bin
odb --version
安装 ODB 运行时库:
cd ..
bpkg create -d libodb-gcc-N cc config.cxx=g++ config.cc.coptions=-O3 config.install.root=/usr/ config.install.sudo=sudo
cd libodb-gcc-N
bpkg add https://pkg.cppget.org/1/beta
bpkg fetch
bpkg build libodb
bpkg build libodb-mysql
安装 mysql 和客户端开发包:
sudo apt install mysql-server
sudo apt install -y libmysqlclient-dev
sudo vim /etc/my.cnf 或者 /etc/mysql/my.cnf 有哪个修改哪个就行
#添加以下内容设置编码类型为utf-8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character-set-server=utf8
bind-address = 0.0.0.0
修改 root 用户密码:
dev@bite:~$ sudo cat /etc/mysql/debian.cnf
# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host = localhost
user = debian-sys-maint
password = UWcn9vY0NkrbJMRC
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = debian-sys-maint
password = UWcn9vY0NkrbJMRC
socket = /var/run/mysqld/mysqld.sock
dev@bite:~$ sudo mysql -u debian-sys-maint -p
Enter password: #这里输入上边第 6 行看到的密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxxxxx';
Query OK, 0 rows affected (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)
mysql> quit
重启 mysql,并设置开机启动
sudo systemctl restart mysql
sudo systemctl enable mysql
安装 boost profile 库
# 在xxx/odb-build/libodb-gcc-N路径下
bpkg build libodb-boost
总体打包安装:
# xxx/odb-build/libodb-gcc-N路径下
bpkg install --all --recursive
总体卸载:
bpkg uninstall --all --recursive
总体升级
bpkg fetch
bpkg status
bpkg uninstall --all --recursive
bpkg build --upgrade --recursive
bpkg install --all --recursive
二、ODB 常见操作介绍
ODB 基本数据类型类型映射如下图所示:

日志相关的类型STL标准库中没有进行定义,ODB与boost库中的日志类型进行映射。

ODB 编程:
ODB(Open Database)在数据元结构定义时,使用预处理器指令(#pragma)来提供元数据,这些元数据指示如何将 C++类型映射到数据库模式。这些#pragma 指令是在 C++代码中使用的,它们不是 C++语言的一部分,而是特定于 ODB 编译器的扩展。
以下是 ODB 中常用的一些#pragma 指令:
1.#pragma db object: 用于声明一个类是数据库对象,即这个类将映射到数据库中的一个表。
2.#pragma db table(“table_name”): 指定类映射到数据库中的表名。如果不指定,则默认使用类名。
3.#pragma db id: 标记类中的一个成员变量作为数据库表的主键。
4.#pragma db column(“column_name”): 指定类成员映射到数据库表中的列名。如果不指定,则默认使用成员变量的名字。
5.#pragma db view: 用于声明一个类是一个数据库视图,而不是一个表。
6.#pragma db session: 用于声明一个全局或成员变量是数据库会话。
7.#pragma db query(“query”): 用于定义自定义的查询函数。
8.#pragma db index(“index_name”): 指定成员变量应该被索引。
9.#pragma db default(“default_value”): 指定成员变量的默认值。
10.#pragma db unique: 指定成员变量或一组变量应该具有唯一性约束。
11.#pragma db not_null: 指定成员变量不允许为空。
12.#pragma db auto: 指定成员变量的值在插入时自动生成(例如,自动递增的主键)。
13.#pragma db transient: 指定成员变量不应该被持久化到数据库中。
14.#pragma db type(“type_name”): 指定成员变量的数据库类型。
15.#pragma db convert(“converter”): 指定用于成员变量的自定义类型转换器。
16.#pragma db pool(“pool_name”): 指定用于数据库连接的连接池。
17.#pragma db trigger(“trigger_name”): 指定在插入、更新或删除操作时触发的触发器。
以下是相关的接口:
mysql 连接池对象类:
namespace odb
{
namespace mysql
{
// mysql 连接池对象类
class LIBODB_MYSQL_EXPORT new_connection_factory : public connection_pool_factory
{
connection_pool_factory(
std::size_t max_connections = 0,
std::size_t min_connections = 0,
bool ping = true)
};
}
}
操作句柄类–实现数据库的增删查改:
namespace odb
{
// 操作句柄类--实现数据库的增删查改
class LIBODB_EXPORT database
{
// 新增数据
persist(T &object);
// 更新数据
void update(T &object);
// 删除数据
void erase(T &object);
// 过滤并删除
unsigned long long erase_query(const std::string &);
unsigned long long erase_query(const odb::query<T> &);
// 查询
result<T> query(const std::string &);
result<T> query(const odb::query<T> &, bool cache = true);
typename result<T>::pointer_type query_one(const odb::query<T> &);
// 获取事务对象指针
virtual transaction_impl *begin() = 0;
};
}
事务操作类:
namespace odb
{
// 事务操作类
class LIBODB_EXPORT transaction
{
transaction(transaction_impl *, bool make_current = true);
void commit();
void rollback();
};
}
特殊类型类:
namespace odb
{
// 针对可能为空的字段封装的类似于智能指针的类型
template <typename T>
class nullable
{
typedef T value_type;
T &get();
const T &get() const;
T *operator->();
const T *operator->() const;
T &operator*();
const T &operator*() const;
};
// 针对查询结果所封装的容器类
template <typename T>
class result : result_base<T, class_traits<T>::kind>
{
result();
result(const result &r
深入解析ODB框架:C++持久化开发方案

最低0.47元/天 解锁文章
2638






