一、搭建测试数据库

测试数据库首先要搭建一个数据库,本文在 阿里云服务器使用docker 部署mysql数据库:

docker实战4-阿里云服务器基于docker部署mysql_herryone123的博客-CSDN博客_阿里云服务器部署mysql

二、ODB 开发工具搭建

安装odb库即mysql 的依赖:

  • libodb-2.4.0.tar.gz
  • libodb-mysql-2.4.0.tar.gz
  • odb-2.4.0-1.x86_64.rpm

ODB 下载:

ODB Download

(1)安装rmp包

rpm -i odb-2.4.0-1.x86_64.rpm

(2)安装odb

tar -zxvf libodb-2.4.0.tar.gz
cd libodb-2.4.0
./configure
make
make install

(3)安装odb-mysql库

tar -zxvf libodb-mysql-2.4.0.tar.gz
cd libodb-mysql-2.4.0

需要注意的是,在安装odb-mysql时,编译之前需要动态链接mysql客户端的动态链接库,所以如果你自己的mysql客户端动态链接库不是这个名称或目录,请修改为自己对应的动态链接库名称:

centos8 缺少mysql库,安装mysql库

yum install -y mysql-libs

安装之后查询:

回到 libodb-mysql-2.4.0目录下,建立软连接:

ln -s /usr/lib64/mysql/libmysqlclient.so.21.1.21 /usr/lib64/mysql/libmysqlclient_r.so

补充 查看软连接关系指令:

find ./ -type l -ls

三、ODB简介

3.1 ODB简介

ODB is an open-source, cross-platform, and cross-database object-relational mapping (ORM) system for C++. It allows you to persist C++ objects to a relational database without having to deal with tables, columns, or SQL and without manually writing any mapping code. ODB supports MySQL, SQLite, PostgreSQL, Oracle, and Microsoft SQL Server relational databases as well as C++98/03 and C++11 language standards. It also comes with optional profiles for Boost and Qt which allow you to seamlessly use value types, containers, and smart pointers from these libraries in your persistent C++ classes.

ODB是一个C++下的对象关系映射(ORM)系统。

ODB是一个比较独立,成熟的基于C++Template的ORM框架。

ODB 是一个开源的,支持多平台,支持多数据库的 C++ 的 ORM 框架,可将 C++ 对象数据库表映射,进行轻松的数据库查询和操作。

3.2 ORM

对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。

四、ODB基本使用

4.1 增删查改

定义一个的一个对象是与数据库相关的类

#pragma once2 #include <string>3 #include "odb/core.hxx"  //直接将libodb-oracle-2.4.0目录中的odb目录copy过来, 再设置工程属性4 5 using namespace std;6 7
10 //声明接下来的一个对象是与数据库相关的类
11 #pragma db object
12 class personinfo
13 {
14 public:
15     //查询需要的构造函数
16     personinfo(){};
17     //插入需要的构造函数
18     personinfo(string strName, string strSex, int nAge, string strId, string strAddress)
19     {
20         name = strName;
21         sex = strSex;
22         age = nAge;
23         idnum = strId;
24         address = strAddress;
25     };
26
27 public:uint64_t autoID;
28     string name;
29     string sex;
30     int age;
31     string idnum;
32     string address;
33 private:
34     //我们将类的构造函数或者将数据成员声明为私有时,odb的access类可以访问我们的数据成员和构造函数。
35     friend class odb::access;  //odb/core.hxx
36
37     //表明接下来这个字段是这个持久化类的标识符字段
38     //或
39     //我们也可以不用#pragma db id,而是使用#pragma db object no_id,表明这个持久化类没有标识符,如上例子
40     #pragma db id auto        //编号自动增长, #pragma db object 这行代码添加了, 则该行代码一定添加, 不然用odb编译会失败
41     unsigned long id_;
42 };
#pragma db object(Personinfo) table("tbl_personinfo")
#pragma db member(Personinfo::autoID_) auto id column("autoid")
#pragma db member(Personinfo::name) column("name")
#pragma db member(Personinfo::sex) column("sex")
#pragma db member(Personinfo::age) column("age")
#pragma db member(Personinfo::idnum) column("idnum")
#pragma db member(Personinfo::address) column("address")

4.1.1 增

int main (){auto_ptr<odb::database> db( new odb::oracle::database("system", "sa",  "ORCL", "127.0.0.1",1521)); //各种数据库写法都是改using QueryPersoninfo = odb::query<Personinfo>;using ResultPersoninfo = odb::result<Personinfo>;odb::connection_ptr c(db->connection());odb::transaction t(db->begin());try {Personinfo personinfo("herry","man",20,01111,"bejing");db->persist<Personinfo>(personinfo);t.commit();} catch (const odb::exception& ex){       return false;}
}

4.1.2  删

int main (){auto_ptr<odb::database> db( new odb::oracle::database("system", "sa",  "ORCL", "127.0.0.1",1521)); //各种数据库写法都是改using QueryPersoninfo = odb::query<Personinfo>;using ResultPersoninfo = odb::result<Personinfo>;odb::connection_ptr c(db->connection());odb::transaction t(db->begin());try {     QueryPersoninfo queryPersoninfo("1=1");ResultPersoninfo result(db->query<Personinfo>(queryPersoninfo));for (auto &record : result) {db->erase<Personinfo>(record);//删除该条记录}t.commit();}  catch (const odb::exception& ex){       return false;}
}

4.1.3 查

int main (){auto_ptr<odb::database> db( new odb::oracle::database("system", "sa",  "ORCL", "127.0.0.1",1521)); //各种数据库写法都是改using QueryPersoninfo = odb::query<Personinfo>;using ResultPersoninfo = odb::result<Personinfo>;odb::connection_ptr c(db->connection());odb::transaction t(db->begin());try {QueryPersoninfo queryPersoninfo("1=1");ResultPersoninfo result(db->query<Personinfo>(queryPersoninfo));for (auto &record : result) {}t.commit();}  catch (const odb::exception& ex){       return false;}
}

4.1.4 改

int main (){auto_ptr<odb::database> db( new odb::oracle::database("system", "sa",  "ORCL", "127.0.0.1",1521)); //各种数据库写法都是改using QueryPersoninfo = odb::query<Personinfo>;using ResultPersoninfo = odb::result<Personinfo>;odb::connection_ptr c(db->connection());odb::transaction t(db->begin());try {QueryPersoninfo queryPersoninfo("1=1");ResultPersoninfo result(db->query<Personinfo>(queryPersoninfo));for (auto &record : result) {db->update<Personinfo>(record);//修改该条记录}t.commit();}  catch (const odb::exception& ex){       return false;}
}

4.1.5 删除表的内容并重新插入记录

auto db=DB;odb::connection_ptr c(db->connection());
odb::transaction t(c->begin());
db->erase_query<TestAuthor>();
for (const auto& it : testMap)
{auto testAuth(std::make_shared<TestAuthor>(it.first, it.second));db->persist<TestAuthor>(testAuth);
}
t.commit();

4.2 视图操作

4.2.1 视图

数据库中的视图是一个虚拟表,同真实的表一样,视图包含一系列带有名称的行和列数据,行和列数据来自定义视图查询所引用的表,并且在引用视图时动态生成。视图是从一个或者多个表中导出的,视图的行为与表非常相似,但视图是一个虚拟表。

当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化。同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。

视图是一个”虚表”,用大白话说,就是从已经存在的表的全部字段或数据中,挑选出来一部分字段或数据,组成另一张”并不存在的表”,这张虚表被称之”视图”。

使用odb创建视图

下面是 "access_log" 网站访问记录表的数据:

参考文献:

【1】C++版本 ORM 访问数据库之ODB 的oracle Demo测试(二):C++版本 ORM 访问数据库之ODB 的oracle Demo测试(二) - Software_hul - 博客园

【2】ODB - C++ 单表查询(V1.02):【三】ODB - C++ 单表查询(V1.02)_make_it_simple888的博客-CSDN博客

【3】ODB官网介绍:ODB - C++ Object-Relational Mapping (ORM)

【4】C++ ORM: C++ ORM框架 · 大专栏

【5】odb 使用指南(一)环境搭建:odb 使用指南(一)环境搭建_zhangdltech的博客-CSDN博客_odb 使用

【6】解决:error: Cannot find libmysqlclient_r under /usr/local/mysql.:解决:error: Cannot find libmysqlclient_r under /usr/local/mysql. - hbg-rohens - 博客园

解决CentOS6.5部署zabbix2.2.6中configure(编译)错误_数据行业新人弥沛的技术博客_51CTO博客

libmysqlclient.so.18(libmysqlclient.so.20 libmysqlclien.so) => not found_流楚丶格念的博客-CSDN博客_libmysqlclient.so.18

【7】SQL ORDER BY 关键字 | 菜鸟教程

【8】SQL GROUP BY 语句 | 菜鸟教程

C++ ODB学习(阿里云服务器测试)相关推荐

  1. Esp8266进阶之路12 图文并茂学习阿里云主机搭建8266MQTT服务器,实现移动网络远程控制一盏灯!

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个"hello ...

  2. 阿里云ACA认证课程学习(阿里云简介掌握云服务器ECS)

    阿里云ACA认证课程学习 阿里云高校计划 https://developer.aliyun.com/adc/college/ 阿里云简介 阿里云 成立于2009年9月10日 在杭州.北京和硅谷设有研发 ...

  3. 学习阿里云的访问控制策略

    学习阿里云的访问控制 我们使用访问控制策略来描述如何保护系统中的资源, 准许执行哪些操作, 禁止执行哪些操作. 本文从常见的访问控制策略入手, 逐步了解阿里云平台的访问控制策略表达方法. 常见的访问控 ...

  4. 最便宜的方式学习阿里云产品之使用竞价式实例ECS

    小汤报名参加了阿里云的ACP考试.所以他想去阿里云官网购买一个ECS实例来进行练习,但是进入首页,他首先看到的是这样的,这让刚刚接触阿里云的小汤退却了.不过仔细研究阿里云的ECS后,小汤发现了一个特别 ...

  5. 新手如何免费开始学习阿里云ECS云服务器?

    云服务器(Elastic Compute Service, 简称ECS),是一种简单高效,处理能力可以弹性伸缩的计算服务.ECS的相关术语说明如下: 实例(Instance):是一个虚拟的计算环境,由 ...

  6. 高考后能学习——阿里云-winserver服务器购买以及使用(包含【.Net】、【PHP】、【MySQL】、【Navicat】、【Java】、安装)

    前置条件 阿里云首页:https://www.aliyun.com/ 本操作需要注册与登录,并且钱包金额超100元,整个测试过程大概需要15~20元,建议充值120元,练习完毕之后可以退出来. 目录 ...

  7. 【转】Redis学习---阿里云Redis多线程性能增强版详解

    [原文]https://www.toutiao.com/i6594620107123589635/ 摘要 Redis做为高性能的K-V数据库,由于其高性能,丰富的数据结构支持,易用等特性,而得到广泛的 ...

  8. 刚学习阿里云VOD,获取视频播放地址

    报错的反馈如下: com.aliyuncs.exceptions.ClientException: Forbidden.RAM : You are not authorized to operate ...

  9. 乐鑫esp8266学习rtos3.0笔记:esp产品 如何从外部读取 csv 文件的数据,比如从代码读取外部文件阿里云三元组。(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. Esp8266之 搭建开发环境,开始一个" ...

  10. 阿里云高级工程师认证机会!

    随着云计算.人工智能.大数据等技术专业的火爆,职场上对于专业人才的需求与日俱增,甚至开出年薪百万的薪水.尤其是当前依旧火热的IT行业,仍然是高薪工作榜上的一朵明珠. 但是IT从业者具有较强的专业性,这 ...

最新文章

  1. java 下一代,什么是&QUOT;下一代插件&QUOT;对Java
  2. 腾讯新公开这张「图」,我看了眼,上面写满「智驾」二字
  3. oracle终止dbms调度,Oracle使用DBMS_JOB创建的数据库作业,遇到数据库关闭状态的调度...
  4. 压缩感知 的自我理解
  5. Mustache.js使用笔记(内容属于转载总结)
  6. 食品安全--牛奶和蛋白质浅谈
  7. linux查看r的安装路径,在Linux CentOS 6.5版上安装R3.1.1的问题(检查LDFLAGS以获取Fortran库的路径)...
  8. 开源个性化内容推荐引擎_您是哪种开源个性类型?
  9. 利用nodemailer发送邮件
  10. apache下虚拟域名配置
  11. 计算机主板供电故障,电脑主板内存电路常见故障的检修
  12. 远程移动测试平台对比分析
  13. 交换机工作原理及实验分析
  14. canvas——绘制文字
  15. 打印表格打印机没有反应_打印机没反应怎么回事
  16. 通过浏览器响应实现excel导出
  17. 【测试面经】软件测试面试题大全,软件测试必问必背面试题,敢说会70%就可以轻松拿offer......
  18. Python趋势自动化描述最终(最新)
  19. 2020最新尚硅谷- 大数据课程
  20. “COMSOL Multiphysics多物理场仿真技术与应用”光电专题(二十九期)

热门文章

  1. 《从零开始的RPG游戏制作教程》前言
  2. 魔兽争霸III背景渊源
  3. 派对屋效果器调试_派对屋DAK-780使用说明书
  4. unity shader 流光(1)
  5. 苹果显示器(Apple Cinema Display)亮度调节方法
  6. Excel函数公式大全—IF函数
  7. 《数字图像处理》题库1:选择题
  8. 插件未购买或已到期,请重新绑定帐号后重试,如操作无效,请将服务器出口IP改为:8XX.XXX.XX.XX
  9. FlashFXP 破解版下载地址
  10. 关于XML 编辑工具