C++ 版本ORM访问数据库之ODB访问oracle的Demo(三)

ODB的组成部分:

  1: 操作系统的ODB编译器

  2: odb核心库libodb

  3: 各种数据库的相关链接库

使用ODB访问数据需要的库和头文件(不懂, 请看https://www.cnblogs.com/hul201610101100/p/9482311.html):

  lib库: odb-oracle-d.lib, odb-d.lib (由libodb-oracle-2.4.0编译成功后产生的lib目录下的两个库)

  头文件: 直接将libodb-oracle-2.4.0编译成功后的odb目录拷贝到工程即可

源代码如下:

定义数据库表信息头文件:

 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 //odb -d oracle --generate-query --generate-schema  头文件名
 8 //eg: odb -d oracle --generate-query --generate-schema personinfo.h
 9 
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:
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 };

定义好了数据表头文件之后, 将该文件拷贝到odb.exe目录下, 运行生成操作数据库相关的代码

odb -d oracle --generate-query --generate-schema personinfo.h

--generate-query: 生成查询书库代码

--generate-schema: 生成建表文件(.sql文件)

personinfo.h: 头文件名称

personinfo.h头文件解析:

class personinfo: 数据表名personinfo

name, sex, idnum, address, age, id: 数据表列名

 

odb命名执行成功会生成4个文件: personinfo-odb.cxx, personinfo-odb.hxx, personinfo-odb.ixx, personinfo.sql

将这四个头文件拷贝到工程目录(和personinfo.h同级目录)下, 后将 personinfo-odb.cxx(源文件), personinfo-odb.hxx(头文件), personinfo-odb.ixx(头文件), 加载到工程中

 访问数据库代码如下:

 1 #include <stdio.h>
 2 #include "personinfo.h"
 3 #include "personinfo-odb.hxx"
 4 //
 5 // 6 //
 7 //odb 头文件
 8 #include "odb/database.hxx"
 9 #include "odb/transaction.hxx"
10 #include "odb/oracle/database.hxx"
11 //odb 命名空间
12 using namespace odb::core; //transaction
13 
14 //odb 调用的lib库, 使用libodb-oracle-2.4.0目录的lib目录
15 #pragma comment(lib, "odb-oracle-d.lib")
16 #pragma  comment(lib, "odb-d.lib")
17 int main()
18 {
19     try
20     {
21         auto_ptr<database> db(new odb::oracle::database(
22             "HUL",    //用户名
23             "sa",    //密码
24             "ORCL",    //数据库名
25             "127.0.0.1", //数据库ip地址
26             1521));        //数据库端口号
27         personinfo perInfo("mhm", "MAN", 66, "362329199512345678", "浙江杭州");
28         transaction tInsert(db->begin());
29         db->persist(perInfo);
30         tInsert.commit();
31         printf("执行插入成功\n");
32 
33         typedef odb::query<personinfo> querys;
34         typedef odb::result<personinfo> results;
35         transaction tQuery (db->begin ());
36 
37         //results rQuery(db->query<personinfo>()); //无条件查询
38         results rQuery(db->query<personinfo>(querys::age == 77)); //查询年龄==77的结果集
39         for(results::iterator it = rQuery.begin(); it != rQuery.end(); ++it)
40         {
41             printf("姓名: %s, 性别: %s, 年龄: %d, 身份编号:%s, 地址: %s\n", it->name.c_str(), it->sex.c_str(), it->age, it->idnum.c_str(), it->address.c_str());
42         }
43         tQuery.commit();
44         printf("执行查询操作成功\n");
45         transaction tDelet(db->begin ());
46         db->erase<personinfo>(2);        //删除id = 2, 当id = 2 不存在时, 会报错: object not persistent
47         //db->erase<personinfo>(perInfo); //删除对象
48         tDelet.commit ();
49         printf("执行删除操作成功\n");
50 
51         transaction tUpdate (db->begin ());
52         unsigned long     id = 3;
53         auto_ptr<personinfo> joe (db->load<personinfo>(id)); //当id = 3 不存在时, 会报错: object not persistent
54         joe->age = 1000;
55         db->update (*joe);
56         printf("执行更新操作成功\n");
57     }
58     catch (const odb::exception& ex)    //catch odb异常
59     {
60         printf("Error: %s", ex.what()); 
61         getchar();
62         return -1;
63     }
64 
65     return 0;
66 }

以上是以orm方式访问书库的简单代码, 希望能对你有点帮助, 也不枉我写这三篇文章

前两篇地址:

  Window ODB 环境编译 :https://www.cnblogs.com/hul201610101100/p/9482311.html

  ODB Demo使用: https://www.cnblogs.com/hul201610101100/p/9482605.html

转载于:https://www.cnblogs.com/hul201610101100/p/9485756.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465243.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在8080端口输出php的输出,端口8080上的PHP错误

我安装了Apaache并配置为侦听端口8080已经使用过PHP runner&#xff0c;并将其放在/ apache24 / htdocs下的htdocs文件夹中当我浏览网站locahost&#xff1a;8085时&#xff0c;它工作正常但是当我浏览网站localhost&#xff1a;8080时&#xff0c;它显示下面的错误我想在安装和…

平均年薪60.8万,Linux开发拿下这个证书有多吃香?

互联网行业竞争一年比一年严峻&#xff0c;随着互联网的发展和进步&#xff0c;很多人都是想要进军到编程行业中去&#xff0c;作为工程师的我们唯有不停地学习&#xff0c;不断的提升自己才能保证自己的核心竞争力&#xff0c;打破内卷。从而拿到更好的薪水&#xff0c;进入心…

Linux新手必须掌握的命令(2)

一、输入输出重定向 输入重定向是指把文件导入到命令中&#xff0c;而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。 在日常的学习和工作中&#xff0c;相较于输入重定向&#xff0c;我们使用输出重定向的频率更高。 所以又将输出重定向分为了标准输出重定向…

极限编程与敏捷开发(4)

解决方案一&#xff1a; 下面图1是一种最简单的解决方案&#xff0c;Switch对象可以轮询真实开关的状态&#xff0c;并且可以发送相应的turnOn和turnOff消息给Light。 图1解决方案二&#xff1a; 上面这个设计违反了两个设计原则&#xff1a;依赖倒置原则(DIP)和开放封闭原则(O…

mm1 matlab,(高质)MM1排队系统仿真matlab实验报告.doc

M/M/1排队系统实验报告一、实验目的本次实验要求实现M/M/1单窗口无限排队系统的系统仿真&#xff0c;利用事件调度法实现离散事件系统仿真&#xff0c;并统计平均队列长度以及平均等待时间等值&#xff0c;以与理论分析结果进行对比。二、实验原理根据排队论的知识我们知道&…

虚拟机四种网络连接模式比较

虚拟机一直用&#xff0c;但选择网络时的四种模式总是搞不清楚&#xff0c;只知道选择bridge最好用。为了能更深入了了解&#xff0c;查询了些资料&#xff0c;总结如下 第一种 NAT模式 Vhost访问网络的所有数据都是由主机提供的&#xff0c;vhost并不真实存在于网络中&#xf…

CPU加了缓存后,有人急了~

Hi&#xff0c;我是CPU一号车间的阿Q&#xff0c;还记得我吗&#xff0c;真是好久不见了&#xff5e;我所在的CPU是一个八核CPU&#xff0c;就有八个工作车间&#xff0c;那运行起来速度杠杆的&#xff5e;虚拟地址翻译一大早&#xff0c;我们一号车间MMU&#xff08;内存管理单…

redis -- 学习

redis 安装 就不细说了。 可以看这个 地址 https://www.cnblogs.com/feijl/p/6879929.html 配置完成之后 连接不上redis 如果报错守护模式 解决办法 1.修改redis配置 redis.conf 守护模式不启用 如下 2.第二种 启动redis后 设置密码 先查看是否设置了 config get requirepass…

一个学妹写的按键检测函数把我秀翻了!

摘要&#xff1a;今年实验室来了三个学妹&#xff0c;其中一个学妹以前是物联网专业的&#xff0c;进了实验室老师二话没说&#xff1a;先把STM32单片机过一遍上来第一个例程就是使用按键点亮一个LED灯&#xff0c;好家伙。点灯小师弟比较在行&#xff0c;毕竟32、FPGA、Linux的…

java请求servlet,[Java]Servlet发送Post请求

演示实例&#xff1a;AServlet发送一个Student对象到BServlet#### 1.AServlet部分首先造一个学生stu&#xff0c;然后通过fastjson的toJSONString方法把对象转换成字符串&#xff0c;再通过MyHttpUtils的sendPost方法把数据发送到BServlet核心部分是MyHttpUtils类&#xff0c;还…

活动选择

D14554. 活动选择 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB 代码提交间隔&#xff1a;1分钟(现在可以提交) 输入文件名&#xff1a;test.in 输出文件名&#xff1a;test.out 问题描述 假设有一个需要使用某一资源的n个活动组成的集合S&#xff0c;S&…

怎样安装联想慧盾

1.如果是刚买的新计算机里面什么都没有&#xff0c;必须要有联想慧盾盘&#xff0e;&#xff12;.在启动时&#xff0c;按&#xff26;&#xff14;键进行安装&#xff0c;按F10键进行卸载&#xff0e;&#xff13;.联想慧盾安装过程&#xff1a;T1 200000G NTFS 902(暂…

我爸开车撞人

国庆收假回来的最后一天&#xff0c;我哥给我发消息&#xff0c;给我发了个视频&#xff0c;里面里面有一辆救护车&#xff0c;救护车在呼呼呼的发出声音。然后我以为是我哥出了什么事&#xff0c;就打电话过去&#xff0c;我哥着急的说&#xff0c;是爸妈开车撞人了。之后我打…

Adobe CTO:Android将超预期获50%份额

Adobe首席技术官凯文•林奇近日在《财富》杂志的采访中表达了他对Android操作系统的看法和期望。按照官凯文•林奇的预测&#xff0c;Android将超过业界的预期&#xff0c;在未来半年内将其智能手机份额提升至50%。Adobe凯文•林奇表示&#xff0c;苹果iPhone和黑莓手机的市场份…

女士怎么就不适合PhP呢,女人可以不美丽,但不能不智慧

相信世界上的所有30女人都有一个梦想&#xff0c;那就是希望自己能够有“闭月羞花&#xff0c;沉鱼落雁”的容貌。可是&#xff0c;上天不会将这倾国倾城的美貌平均分到每一个女人身上&#xff0c;而且&#xff0c;假如世界上所有30女人都拥有同样出众的容貌&#xff0c;也就没…

898 C. Phone Numbers

传送门 [http://codeforces.com/contest/898/problem/C] 题意 题意比较难理解直接看样例就知道了&#xff0c;给你个n接下来n行&#xff0c;每行包括一个名字和号码的数量&#xff0c;还有具体的每个号码 让你整理他的电话本&#xff0c;使得一个人的号码不能有重复&#xff0c…

嵌入式行业需要什么样的技术人才?

关注「嵌入式大杂烩」&#xff0c;选择「星标公众号」一起进步&#xff01;来源 | 巧学模电数电单片机嵌入式行业需要什么样的技术人才&#xff1f;仔细观察各种招聘的岗位要求吧&#xff0c;无非是两方面。1&#xff09;通用要求比如什么学历&#xff0c;多少年工作经验&#…

oracle临时表空间地址,Oracle认证:详解OracleTemp临时表空间处理方法

临时表空间主要用途是在数据库进行排序运算、管理索引、访问视图等操作时提供临时的运算空间&#xff0c;当运算完成之后系统会自动清理。当oracle里需要用到sort的时候&#xff0c;PGA中sort_area_size大小不够时&#xff0c;将会把数据放入临时表空间里进行排序&#xff0c;同…

消除VIM光标闪烁

2019独角兽企业重金招聘Python工程师标准>>> VIM光标闪烁比较影响人读代码的心情&#xff0c;消除光标闪烁&#xff0c;在配置文件中写下set gcra:block-blinkon0 保存并重启VIM 即可消除光标闪烁。 转载于:https://my.oschina.net/tonyyang/blog/10240

java异常个人理解

废话不说先贴图 所有的异常和错误都继承与Throwable类&#xff0c;它的下面又分为两大子类。 1.Error(uncheck) Error,错误。它是java程序中不被捕获的错误&#xff0c;并且总是不被控制。 例如&#xff1a;OutOfMemoryError 2.Exception(check) Exception,异常。所有的异常类都…