ODB 入门介绍(二)
- mysql中是有默认值的, odb中也有
// file : self/person.hxx // copyright : not copyrighted - public domain#ifndef PERSON_HXX #define PERSON_HXX #include <string> #include <cstddef> #include <odb/core.hxx> #include <odb/nullable.hxx>#pragma db object class person { public:person(const std::string& first): first_(first){}const odb::nullable<std::string>& first() const { return first_; }private:friend class odb::access; person() {} #pragma db id auto unsigned long id_;odb::nullable<std::string> first_; };#endif // PERSON_HXX
给类型std::string 加上 odb::nullable<std::string> 那么在建表的时候就会把这种类型默认值设置为NULL如图
查询相关的详细说明
2.1 大前提先把结构定下来// file : query/person.hxx // copyright : not copyrighted - public domain#ifndef PERSON_HXX #define PERSON_HXX#include <string>#include <odb/core.hxx> #include <odb/nullable.hxx>#pragma db object class person { public:person (const std::string& first,const std::string& last,unsigned short age): first_ (first), last_ (last), age_ (age){}person (const std::string& first,const std::string& middle,const std::string& last,unsigned short age): first_ (first), middle_ (middle), last_ (last), age_ (age){}const std::string&first () const{return first_;}const odb::nullable<std::string>&middle () const{return middle_;}const std::string&last () const{return last_;}unsigned shortage () const{return age_;}private:friend class odb::access;person () {}#pragma db id autounsigned long id_;std::string first_;odb::nullable<std::string> middle_;std::string last_;unsigned short age_; };#endif // PERSON_HXX
然后执行odb.exe生成需要的文件, 数据库最终如图显示
2.2 查询岁数小于30岁的用户transaction t (db->begin ()); result r (db->query<person> (query::age < 30)); for (result::iterator i (r.begin ()); i != r.end (); ++i) {cout << i->first () << " " << i->last () << " " << i->age () << endl; } cout << endl; t.commit ();
这里 query::age<30 就是条件, db->query<person> 则是相当于select * from table where 条件 返回的是一个结果集 被result r接收, 使用方法类似于迭代器
2.3 当只有一个元素时使用 query_one 貌似好像是性能比较好吧transaction t (db->begin ());auto_ptr<person> p (db->query_one<person> (query::age == 21)); if (p.get () != 0) {print (*p);cout << endl; } t.commit ();
这里使用query_one 表示数据库只有一个符合这种条件的, 否则的话就会直接宕机
2.4 如何使用&& || ! 进行查询transaction t (db->begin ());result r (db->query<person> ((query::first == "John" || query::first == "Jane") &&!(query::last != "Doe" || query::age > 30)));print (r); t.commit ();
类似于2.2的用法这里就不多说了
2.5如何使用引用参数绑定的查询transaction t (db->begin ());unsigned short lower, upper;query q (query::age >= query::_ref (lower) &&query::age < query::_ref (upper));for (unsigned short band (0); band < 10; ++band) {lower = band * 10;upper = lower + 10;result r (db->query<person> (q));if (!r.empty ()){cout << lower << '-' << (upper - 1) << ':' << endl;print (r);} } t.commit ();
query q(query::age >= query::_ref(lower) && query::age < query::_ref(upper)) 这里lower, upper都是把自己和odb里的某个变量绑定起来了, 当值改变的时候 这个条件也就跟着变了, 然后查询到的数据就不同了。
2.6 通过 in()查询数据transaction t (db->begin ());result r (b->query<person> (query::last.in ("Smith", "Johnson", "Jockson"))); print (r); t.commit ();
query::last.in("Smith", "Johnson", "Jockson") 这个表示找表中元素last是 Smith or Johnson or Jockson 的元素
2.7 通过 in_range()查询数据vector<string> names;names.push_back("Smith"); names.push_back("Johnson"); names.push_back("Jockson");transaction t(db->begin());result r(db->query<person>(query::last.in_range(names.begin(), names.end())));print(r);t.commit();
query::last.in_range(names.begin(), names.end()) 表示只要last是容器names中的元素就是要查询的数据
2.8 查询不是NULL的元素transaction t(db->begin()); result r(db->query<person>(query::middle.is_not_null())); print(r); t.commit();
is_not_null() 就是条件不为null, query::middle就表示元素middle, 所以这个条件就是元素middle不为null的所有元素
ODB 入门介绍(二)相关推荐
- C++ ORM ODB 入门介绍(一)
2019独角兽企业重金招聘Python工程师标准>>> :::欢迎广大oscer拍砖和交流. C++的语言特性决定了在C++中的ORM框架不可能像Java,C#那没有那么灵活. C+ ...
- Gtest入门介绍(二)
测试夹具:对多个测试使用相同的数据配置 如果您发现自己编写了两个或多个对相似数据进行操作的测试,您可以使用测试夹具.这允许您为多个不同的测试重用相同的对象配置.要创建夹具:从 派生一个类::testi ...
- 《C#零基础入门之百识百例》(五十二)封装介绍 -- 二维多项式求值
C#零基础入门 面向对象 -- 封装介绍 -- 二维多项式求值 前言 一,封装概念 二,封装属性 三,实例练习 -- 二维多项式求值 3.1 题目描述 3.2 问题分析 3.3 参考代码 前言 本文属 ...
- Java JPA快速入门介绍
JPA快速入门介绍 一:什么是JPA JPA的英文全称是Java PersistenceAPI, 目的是给Java开发者提供对象关系映射工具用于在 Java应用程序开发中来管理关系数据(RDBMS). ...
- .NET读写Excel工具Spire.Xls使用(1)入门介绍
原文:[原创].NET读写Excel工具Spire.Xls使用(1)入门介绍 在.NET平台,操作Excel文件是一个非常常用的需求,目前比较常规的方法有以下几种: 1.Office Com组件的方式 ...
- 独家 | 集成学习入门介绍
作者:Jason Brownlee 翻译:wwl 校对:王琦 本文约3300字,建议阅读8分钟. 本文介绍了我们在生活中的许多决定包括了其他人的意见,由于群体的智慧,有的时候群体的决策优于个体.在机器 ...
- SpringBoot入门(二)——起步依赖
本文来自网易云社区 在前一篇我们通过简单几步操作就生成了一个可以直接运行的Web程序,这是因为SpringBoot代替我们做了许多工作,概括来讲可以分为起步依赖和自动配置.这一篇先来看看起步依赖. 项 ...
- ECC加密算法入门介绍
作者 : ZMWorm[CCG] E-Mail: zmworm@sohu.com 主页 : Http://ZMWorm.Yeah.Net/ 前言 同RSA(Ron Rivest,Adi S ...
- 互联网协议入门(二)【转】
原文地址:点击前往 上一篇文章分析了互联网的总体构思,从下至上,每一层协议的设计思想. 这是从设计者的角度看问题,今天我想切换到用户的角度,看看用户是如何从上至下,与这些协议互动的. ======== ...
最新文章
- 实践教程|如何用YOLOX训练自己的数据集?
- 超酷的Android 侧滑(双向滑动菜单)效果
- Window10设置护眼色
- 分布式系统概念 | 分布式理论:CAP、BASE
- axure实现复选框全选_jq简单的全选、反选和全不选效果
- Differential Geometry之第九章常平均曲率曲面
- 入门机器学习(六)--课后作业解析-logistics回归(python实现)
- Tiny Jpeg Decoder (JPEG解码程序) 源代码分析 1:解码文件头
- android定位坑简书,android webview 定位问题
- 为Linux发行版安装simsun.ttf
- NS3 Tracing System详解
- linux解锁文件夹
- PS制作水雾玻璃拍照效果、幻影视觉海报
- MYSQL5.7设置账号密码复杂度、密码有效期、账号锁定等策略
- 方舟生存进化服务器文件设置,方舟生存进化私人服务器设置教程[多图]
- 用户登录、注册(基于MyBatis+CSS+HTML+Selvet)
- 广东工业大学龙洞校区全国计算机,广东工业大学龙洞校区简介
- 李炎恢ECMAScript6 / ES6+(二)
- 什么是验厂什么是认证
- 2020年第四届中国 BIM (数字建造)经理高峰论坛即将在杭举办