深入理解ODB框架:C++持久化开发的现代方案

深入解析ODB框架:C++持久化开发方案

前言
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 基本数据类型类型映射如下图所示:

image-20241215112548601

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

image-20241215112613636

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椿融雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值