ODB简介

article/2025/9/28 0:06:23

官方参考文档

本文档内容是自己学习的一个记录,内容来自官方文档
https://www.oschina.net/p/odb-orm?hmsr=aladdin1e1
https://www.codesynthesis.com/products/odb/doc/manual.xhtml#1

ODB是什么?

ODB可以直接把C++的类对象映像成关系型数据库对象。

架构和工作流程

在这里插入图片描述
在这里插入图片描述

Hello World Example

头文件:

// file      : hello/person.hxx
// copyright : not copyrighted - public domain#ifndef PERSON_HXX
#define PERSON_HXX#include <string>
#include <cstddef> // std::size_t#include <odb/core.hxx>// 定义class person为persistence class
#pragma db object
class person
{
public:person (const std::string& first,const std::string& last,unsigned short age): first_ (first), last_ (last), age_ (age){}const std::string&first () const{return first_;}const std::string&last () const{return last_;}unsigned shortage () const{return age_;}voidage (unsigned short age){age_ = age;}private:// 定义友元函数,odb可以访问私有的默认构造函数friend class odb::access;// 定义默认构造函数用于odb编译器生成support codeperson () {}// 定义数据库的key值,并且这个key是database自生长的#pragma db id autounsigned long id_;std::string first_;std::string last_;unsigned short age_;
};// 定义class person_stat 为 class person的view
// view
#pragma db view object(person)
struct person_stat
{#pragma db column("count(" + person::id_ + ")")std::size_t count;#pragma db column("min(" + person::age_ + ")")unsigned short min_age;#pragma db column("max(" + person::age_ + ")")unsigned short max_age;
};#endif // PERSON_HXX

应用文件:

// file      : hello/driver.cxx
// copyright : not copyrighted - public domain#include <memory>   // std::auto_ptr
#include <iostream>#include <odb/database.hxx>
#include <odb/transaction.hxx>#include "database.hxx" // create_database#include "person.hxx"
#include "person-odb.hxx"using namespace std;
using namespace odb::core;int
main (int argc, char* argv[])
{try{auto_ptr<database> db (create_database (argc, argv));unsigned long john_id, joe_id;// Create a few persistent person objects.//{person john ("John", "Doe", 33);person jane ("Jane", "Doe", 32);person joe ("Joe", "Dirt", 30);transaction t (db->begin ());// Make objects persistent and save their ids for later use.//john_id = db->persist (john);db->persist (jane);joe_id = db->persist (joe);t.commit ();}typedef odb::query<person> query;typedef odb::result<person> result;// Say hello to those over 30.//{transaction t (db->begin ());result r (db->query<person> (query::age > 30));for (result::iterator i (r.begin ()); i != r.end (); ++i){cout << "Hello, " << i->first () << " " << i->last () << "!" << endl;}t.commit ();}// Joe Dirt just had a birthday, so update his age.//{transaction t (db->begin ());auto_ptr<person> joe (db->load<person> (joe_id));joe->age (joe->age () + 1);db->update (*joe);t.commit ();}// Alternative implementation without using the id.///*{transaction t (db->begin ());// Here we know that there can be only one Joe Dirt in our// database so we use the query_one() shortcut instead of// manually iterating over the result returned by query().//auto_ptr<person> joe (db->query_one<person> (query::first == "Joe" &&query::last == "Dirt"));if (joe.get () != 0){joe->age (joe->age () + 1);db->update (*joe);}t.commit ();}*/// Print some statistics about all the people in our database.//{transaction t (db->begin ());// The result of this (aggregate) query always has exactly one element// so use the query_value() shortcut.//person_stat ps (db->query_value<person_stat> ());cout << endl<< "count  : " << ps.count << endl<< "min age: " << ps.min_age << endl<< "max age: " << ps.max_age << endl;t.commit ();}// John Doe is no longer in our database.//{transaction t (db->begin ());db->erase<person> (john_id);t.commit ();}}catch (const odb::exception& e){cerr << e.what () << endl;return 1;}
}

编译,生成Database Support Code

odb -d mysql --generate-query person.hxx  // 仅示例

生成:
person-odb.hxx, person-odb.ixx, person-odb.cxx

编译,生成database schema

odb -d mysql --generate-query --generate-schema person.hxx

这个命令除了生成上面的person-odb.hxx, person-odb.ixx, person-odb.cxx,还会生成
person.sql, which is the database schema for the persistent classes defined in person.hxx.

编译、链接生成应用程序。

  • 编译
c++ -c driver.cxx
c++ -c person-odb.cxx
  • 链接
c++ -o driver driver.o person-odb.o -lodb-mysql -lodb
  • 创建database schema,使用前面生成的.sql文件
mysql --user=odb_test --database=odb_test < person.sql
  • 运行程序
./driver --user odb_test --database odb_test

http://chatgpt.dhexx.cn/article/MmN6LxX5.shtml

相关文章

数据库(DB)

数据库系统概述 数据库&#xff1a;是长期储存在计算机内、有组织的、可共享的大量数据的集合。数据库的基本特征&#xff1a;  数据按一定的数据模型组织、描述和储存  可为各种用户共享、冗余度较小、易扩展  数据独立性较高 数据库管理系统&#xff08;DBMS&#xff…

SQL server 中的dbo、guest

最近新项目中接触SQL sever 数据库&#xff0c;可视化连接的过程中发现在数据库下存在两个特殊的类似数据库的层级 dbo、guest 查了一下资料这两者的具体含义&#xff1a; dbo database owner 数据库的创建者,创建该对象的用户 DBO是每个数据库的默认用户&#xff0c;具有所有…

SQLServer 对象创建注意事项之dbo

最近&#xff0c;一客户遇到一个奇怪的问题&#xff0c;sqlserver数据库&#xff0c;使用备份恢复到目标机器。之后&#xff0c;在目标服务器创建了测试函数对象&#xff0c;但是执行查询的时候却提示对象不存在&#xff0c;再次尝试重新创建该函数及其依赖的对象时能正常执行。…

单目标优化:蜣螂优化算法(Dung beetle optimizer,DBO)

蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为的启发所得。 一、蜣螂优化算法 1.1蜣螂滚球 &#xff08;1&#xff09;当蜣螂前行无障碍时…

蜣螂优化(DBO)算法(含MATLAB代码)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

智能优化算法 — 蜣螂优化算法(Dung beetle optimizer,DBO)

引言 小时候&#xff0c;蜣螂还是比较多见的&#xff0c;还顽皮地将粪球给它弄走&#xff0c;或者给它来点障碍。现在放牛的几乎看不到了&#xff0c;蜣螂没东西可推了&#xff0c;也慢慢从我们的视线中消失了。 DBO介绍 2022年11月27日&#xff0c;东华大学沈波教授团队&…

什么是 HTTP?

什么是 HTTP&#xff1f; 超文本传输协议 (HTTP) 是万维网的基础&#xff0c;用于通过超文本链接加载网页。HTTP 是应用程序层协议&#xff0c;旨在在联网设备之间传输信息&#xff0c;并在网络协议栈的其他层之上运行。HTTP 上的典型流涉及客户端计算机向服务器发出请求&…

什么是HTTP? HTTP和HTTPS的区别?

目录 1、什么是HTTP? 2、HTTP的特点 ① 支持客户/服务器模式 ② 简单快速 ③ 灵活 ④ 无连接 ⑤ 无状态 3、HTTPS 4、HTTP和HTTPS的区别 ① 安全性不同 ② 默认端口不同 ③ 响应速度和资源消耗不同 ④ 网站申请流程不同 ⑤ 对搜索排名的提升不同 1、什么是H…

什么是HTTPS,与HTTP的区别?

1. 什么是HTTPS HTTPS &#xff08;Hyper Text Transfer Protocol over SecureSocket Layer&#xff09;&#xff0c;基于安全套接字协议 SSL&#xff0c;是以安全为目标的 HTTP 通道&#xff0c;在 HTTP 的基础上通过传输加密和身份认证保证了传输过程的安全性。 HTTP2.0和H…

什么是 HTTP? HTTP 和 HTTPS 的区别?

简版 http 是无状态的超文本传输协议&#xff0c;连接简单&#xff0c;信息是明文传输&#xff0c;端口为 80。 https 协议是由 httpss 协议构建的可进行加密传输、身份认证的具有安全性网络协议,端口是 443。 优缺点&#xff1a; https 有加密认证相对于 http 安全一些 htt…

什么是https(详细),http和https

文章目录 1&#xff1a;什么是https2&#xff1a;使用http协议的问题2.1&#xff1a;http是明文传输。2.2&#xff1a;http不会验证对方身份。2.3&#xff1a;http无法验证报文的完整性。 3&#xff1a;密钥的问题4&#xff1a;SSL 四次握手4.1&#xff1a;第一次握手4.2&#…

[HTTP] HTTP是什么

HTTP是什么 HTTP是什么 HTTP全称为HyperText Transfer Protocol,被译为超文本传输协议&#xff0c;是互联网上应用最为广泛的一种网络协议。 HTTP协议是在Web上进行数据交换的基础&#xff0c;是一种“客户端–服务器端”协议。也就是说&#xff0c;请求通常是由像浏览器这样…

HTTP 请求是什么?

文章目录 HTTP请求一&#xff0c;请求行二&#xff0c;请求头三&#xff0c;空行四&#xff0c;请求体五&#xff0c;HTTP请求示例 HTTP请求 请求是由客户端向服务器发送的&#xff0c;一般可以分为请求行、请求头、空行和请求体四个部分&#xff0c;如下图所示&#xff1a; …

HTTP 与 HTTPS 的理解

区别&#xff1a;HTTP 是明文传输的&#xff0c;容易泄漏信息&#xff0c;所以大多数应用都会升级为 HTTPS HTTP 底层是用 TCP 传输的&#xff0c;HTTPS 就是在 TCP 和 HTTP 之间加了一层加密和认证的协议&#xff0c;这一层叫做 SSL/TLS。 为什么叫这个名字呢&#xff1f; 因…

什么是HTTP协议、与HTTPS的区别?

一.HTTP协议的定义&#xff1a; http(Hypertext transfer protocol)超文本传输协议&#xff0c;通过浏览器和服务器进行数据交互&#xff0c;进行超文本&#xff08;文本、图片、视频等&#xff09;传输的规定。也就是说&#xff0c;http协议规定了超文本传输所要遵守的规则。…

HTTP和HTTPS

1. 前言 近几年&#xff0c;互联网发生着翻天覆地的变化&#xff0c;尤其是我们一直习以为常的HTTP协议&#xff0c;在逐渐的被HTTPS协议所取代&#xff0c;在浏览器、搜索引擎、CA机构、大型互联网企业的共同促进下&#xff0c;互联网迎来了“HTTPS加密时代”&#xff0c;HTT…

HTTP到底是什么?

HTTP简介 HTTP 协议是 Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写&#xff0c;是用于从万维网&#xff08; WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议&#xff0c;基于 TCP/IP 通信协议来传递数据。 HTTP原理…

HTTP是什么

HTTP是什么 ​ HTTP全称为Hyper Text Transfer Protocol&#xff0c;被译为超文本传输协议&#xff0c;是互联网上应用最为广泛的一种网络协议。 ​ HTTP协议是在Web上进行数据交换的基础&#xff0c;是一种“客户端–服务器端”协议。也就是说&#xff0c;请求通常是由像浏览…

HTTP协议的详解(简单易懂)

HTTP是什么 一、HTTP是什么 HTTP全称为Hyper Text Transfer Protocol&#xff0c;被译为超文本传输协议&#xff0c;是互联网上应用最为广泛的—种网络协议。**HTTP协议是在Web上进行数据交换的基础&#xff0c;是一种“客户端-服务器端”协议。**也就是说&#xff0c;请求通…

手机销售系统的设计和实现

技术&#xff1a;Java、JSP等摘要&#xff1a;手机销售系统作为手机信息管理系统的一个分支&#xff0c;已逐渐成为信息化建设的重要组成部分&#xff0c;提供了一个功能强大&#xff0c;使用成本低廉&#xff0c;操作简捷的实时销售管理系统。本文通过手机销售系统的建设以实现…