C++ ODB学习(阿里云服务器测试)

一、搭建测试数据库

测试数据库首先要搭建一个数据库,本文在 阿里云服务器使用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 once
 2 #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 语句 | 菜鸟教程 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值