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