odb对象关系映射系统
odb架构:
总结:将头文件中的C++类代码映射到数据库,实现对类对象的持久化,查找和更新
开发者在头文件写C++可持久化类代码,通过odb编译器生成.cxx, .hxx, .ixx(inline file), .sql(Generated code)。然后编译成目标文件,链接libodb.a(ODB Common Runtime)和数据库libodb-pgsql.a(ODB PGSQL Runtime),生成可执行文件(进而与数据库交互)
odb-arch:
odb-flow:
include下odb目录结构:
libodb: compilers,details,tr1
libboost: boost
libpgsql: pgsql
lib目录:
libodb.a,libodb.la
libodb-boost.a,libodb-boost.la
libodb-pgsql.a,libodb-pgsql.la
//odb compiler
输入头文件,输出C++类代码
odb -I.../libodb -d mysql --generate-query person.hxx
生成person-odb.hxx, person-odb.ixx, person-odb.cxx
odb -d mysql --generate-query --generate-schema person.hxx
生成person-odb.hxx, person-odb.ixx, person-odb.cxx,person.sql
使用这个命令进行进行编译
odb -I "../include" --std c++11 --database pgsql --profile boost --generate-schema --hxx-prologue "#include \"traits-pgsql.hxx\"" --generate-query ids.h
// person.hxx
//
#include <string>
#include <odb/core.hxx> // (1) 包含odb::access等
#pragma db object // (2) 放类定义前,告诉odb编译器接下来的类是persistent
class person
{
...
private:
person () {} // (3) odb生成的数据库支持代码使用该默认构造函数
friend class odb::access; // (4) 使默认构造函数能访问数据库支持代码,如果默认构造函数是public的,就不用
#pragma db id auto // (5)
unsigned long id_; // (5) 唯一标识符
std::string first_;
std::string last_;
unsigned short age_;
};
query::age.in(1,3,5) 最多5个值
query::age.in_range(begin,end)
query q1 (query::age < age); // By value.
query q2 (query::age < query::_val (age)); // By value.
query q3 (query::age < query::_ref (age)); // By reference.
query q4 ("age < " + age); // Error.
query q5 ("age < " + query::_val (age)); // By value.
query q6 ("age < " + query::_ref (age)); // By reference.
原生sql必须要显示使用_val或者_ref
Transactions(事务)
#include <odb/transaction.hxx>
transaction t (db.begin ())
// Perform database operations.
t.commit ();
The odb::transaction class has the following interface:
namespace odb
{
class transaction
{
public:
typedef odb::database database_type;
typedef odb::connection connection_type;
explicit
transaction (transaction_impl*, bool make_current = true);
transaction ();
void
reset (transaction_impl*, bool make_current = true);
void
commit (); // 提交事务
void
rollback (); // 回滚事务
database_type&
database (); // 当前database
connection_type&
connection (); // 当前connection
bool
finilized () const;
public:
static bool
has_current ();
static transaction&
current (); // 返回当前激活的事务
static void
current (transaction&); // 激活当前事务
static bool
reset_current ();
// Callback API.
//
public:
...
};
}
除非事务被显式的commit或者roll back,否则当事务实例离开作用域的时候,析构函数会自动回滚
如果我们尝试commit或者roll back一个已经finalized的事务,会抛出odb::transaction_already_finalized
transaction t1 (db1.begin ()); // Active transaction.
transaction t2 (db2.begin (), false); // Not active.
// Perform database operations on db1.
transaction::current (t2); // Deactivate t1, activate t2.
// Perform database operations on db2.
transaction::current (t1); // Switch back to t1.
// Perform some more database operations on db1.
t1.commit ();
transaction::current (t2); // Switch to t2.
// Perform some more database operations on db2.
t2.commit ();
odb对象关系映射系统相关推荐
- java对象关系映射ROM
一.对象关系映射ORM概述 对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术:简单的说,ORM是通过使 ...
- Object/Relation Mapping 对象关系映射
对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的.面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应 ...
- 【分享】关于对象关系映射的理解
对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据 ...
- C++ 对象关系映射(ORM)介绍
用过Java的都知道SSH框架,特别对于数据库开发,Java领域有无数的ORM框架,供数据持久层调用,如Hibernate,iBatis(现在改名叫MyBatis),TopLink,JDO,JPA-- ...
- 学习笔记之什么是持久化和对象关系映射ORM技术
----------------本文转自:http://www.cppblog.com/javenstudio/articles/541.html--------------------- 何谓&qu ...
- Hibernate - 对象关系映射文件(*.hbm.xml)详解
对象关系映射文件,即POJO 类和数据库的映射文件*.hbm.xml(映射文件的扩展名为 .hbm.xml). POJO 类和关系数据库之间的映射可以用一个XML文档来定义. 通过 POJO 类的数据 ...
- Hibernate对象关系映射详解之一对多关系映射
Hibernate对象关系映射详解之"一对多"关系映射 之前学习Hibernate框架的时候,对这七大关系映射一直是云里雾里的,虽然可以仿照写出代码,但是不能独立编写出来.鉴于工作 ...
- orm 对象关系映射
引用:http://baike.baidu.com/view/197951.htm 对象关系映射(ORM)提供了概念性的.易于理解的模型化数据的方法.ORM方法论基于三个核心原则: 简单:以最基本的形 ...
- mysql映射关系_mysql数据库对象关系映射_MySQL
bitsCN.com mysql数据库对象关系映射 1.对"对象关系映射"的理解 a.对象:可以理解为java中的类 b.关系:可以理解为数据库的表 c.映射:这是因为java中的 ...
- 笨办法学 Python · 续 第六部分:SQL 和对象关系映射
第六部分:SQL 和对象关系映射 原文:Part VI: SQL and Object Relational Mapping 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 在本 ...
最新文章
- 【仿去哪儿】骆驼动画加载
- 国内外有哪些漏洞信息发布平台?
- FPGA之道(38)VHDL与Verilog的比较
- python如何扩展库_python的常用扩展库以及使用方式
- 我这些年的项目管理心得...
- c#获取电脑硬件信息参数说明(硬盘篇 Win32_DiskDrive)
- wxWidgets:wxFindDialogEvent类用法
- pythonalert弹窗_python+selenium八:Alert弹窗
- 《企业云桌面实施》-小技巧-02-使用ISO光驱安装esxi6.5
- java 数字表示什么意思是什么,读取Java字节码指令:数字是什么意思?
- solidity字符串拼接
- 人脸检测算法_腾讯已开源高精度人脸检测算法DSFD
- 作者:周宗放(1950-),男,电子科技大学经济与管理学院教授、博士生导师,风险分析与数据科学研究中心主任...
- Linux: .bash_profile 与 .bashrc 的区别
- (写给应届生)学松下幸之助找工作
- SpringBoot:ApplicationEvent与ApplicationListener
- java递归mysql生成树_java递归生成树结构的数据
- 导出csv文件数字会自动变科学计数法的解决方式
- Android 启动APP时黑屏白屏的三个解决方案
- 【学习笔记】语义分割综述