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

posted @ 2018-08-16 10:22  Software_hul  阅读(917)  评论(1编辑  收藏  举报