【原创】8. MYSQL++中的Row类型
一、mysqlpp::Row类型
在之前的介绍中我们看到了如何通过mysqlpp::Query找到各种Result类型,然后又仔细分析了各种Result类型又是如何生成对应的Row类型(如下所示)。
接下去的问题就是,到底mysqlpp::Row是什么。
1. Row类型的使用(先不提SSQLS)
还是先来看如何使用这个Row类型,照样是通过sample程序。
mysqlpp::Connection conn(false);
conn.connect(...);
mysqlpp::Query query = conn.query("select * from stock");
mysqlpp::UseQueryResult res = query.use();
while (mysqlpp::Row row = res.fetch_row()) { cout << setw(30) << row["item"] << ' '
<< setw(9) << row["num"] << endl;
}
OR
mysqlpp::Connection conn(false);
conn.connect(...);
mysqlpp::Query query = conn.query("select * from stock");
mysqlpp::UseQueryResult res = query.use();
while (mysqlpp::Row row = res.fetch_row()) { cout << setw(30) << row[0] << ' '
<< setw(9) << row[1] << endl;
}
上面的例子中提到的两种最为基本的用法,主要就是查看每行数据的各个列的不同方式。至于查找Row的列的信息,可以通过row[0]等返回回来的String,具体可以看下文和对于mysqlpp::String的介绍的章节。
2. mysqlpp::Row的实现
关于mysqlpp::Row的定义主要在row.h和row.cpp中。在说明中,我们可以看到,作者对Row的定义是const,这是因为他认为通过返回的Row去修改database是不合适的。所以不直接从vector进行派生,而自己去实现一些必要的方法。
mysqlpp::Row是直接从OptionalExceptions进行派生的。
- 成员变量
list_type data_;
RefCountedPointer<FieldNames> field_names_;
bool initialized_;
list_type是什么?typedef std::vector<mysqlpp::String> list_type;
FieldNames是一个派生自vecot<std::string>的类型
在类型声明的一开头,作者首先typedef了list_type相关的迭代器,反响迭代器,引用迭代器,元素类型值,元素类型长度等信息。
- 成员方法
首先来看各种构造方法和等号赋值方法。
主要定义了两种构造器
主要看一下在本节一开始的实例中所使用的第二个构造器。
首先我们看到的是使用一个initialized_进行构造成功与否的保护,估计在之后所有的方法上都会先对这个变量进行查询,如果是false直接返回错误或者抛出异常。
其次,是对于data_(一个vector<String>类型)的初始化和填充,需要注意的是第45行。value_type是这样定义的,也就是一个vector<String>::value_type
查看STL文档得知,vector<T>::value_type是A type that represents the data type stored in a vector. value_type is a synonym for the template parameter Type.换句话说,作者为了减少冗余,这里采用了通用的方式。值得学习!
所以说,其实在第45行,主要做的事情就是调用mysqlpp:: String的构造函数,这个请查看String的介绍。
这里还要注意的是第48行,跟着进去看到的是ResultBase:: field_type( )方法,定义是
又出现了熟悉的value_type,那么FieldTypes是什么呢?
又回到了之前介绍过的mysql_type_info。这样子即使你没有看过String的构造函数,你也已经很明白了,这个String很神通广大,他居然能够知道值以及具体的类型!也就是说,MySQL++就用了一个String包装了MYSQL C API中的行信息和行所对应的列的信息。
接下来在52行把所有的field_names的信息传递给了mysqlpp::Row的成员变量field_names_,所有都已经成功了之后,就大胆地设置初始化标志为true。
再来分析一下在mysqlpp::Row中delegate std::vector的方法
不多说,完全就是delegate,只不过原来一直没有注意过一点的是,vector<T>:: begin( )居然被定义了两个版本(只怪自己学艺不精)
iterator begin();
const_iterator begin() const;
当然,上面用的版本都是非const版本,这是因为data_被定义为vector<String>没有带const,但是返回值都是const的!
顺带便说一下,const_reference以及const_iterator的定义
还有就是
获取Row中Field值的方法
从上面的例子中我们可以简单的看到,要获取一行数据的值还是很简单的,主要的方法就是通过operator [ ]
方法一,通过index查找Row中对应的field的值
再来说明一下上面提到的为什么该参数一定要是int而不是size_type的问题。下文我们可以知道,作者重载了一个operator[](char*)。如果出现了row[0]或者row[NULL](假设这个平台将NULL定义为0),我们有理由说编译器会搞不清楚到底你要的是size_type还是char*,毕竟我们同样可以把NULL赋值给char*。但是如果有了int,由于0是int型,所以会被匹配到这里。
这里的at方法还是很简单的。
方法二,通过field的字符串形式的name来查找Row中对应的field的值
其中field_num方法的定义如下
该函数的实现代码如下,
需要注意的是划红色圈的地方,这里其实调用的是mysqlpp:: FieldNames(一个派生自vector<string>的类型)的operator[ ]的重载方法
以下这些方法是用于SSQLS,基于value_list_b结构体
equal_list
在Row的定义中,我们可以看到两个同名不同参的函数equal_list,这两个函数主要用在了SSQLS中,用于生成"equals clause",例如在SELECT语句中的WHERE就是一个典型的"equals clause",例如,
SELECT * FROM Tbl1 WHERE id = ‘1’, name = ‘root’
这个是需要配合使用equal_list_b结构以及一个用于做quoting和escaping的类型。
这几个重要方法请参看SSQLS的具体解释。
field_list
这几个方法同样也是用于SSQLS的,主要用于返回各种FieldNames。这个函数会有一些输入(某些重构是vector<bool>,有些就是很多bool参数)来表明一个row中哪些field是需要被返回到结果集中的。不需要的就用false。
value_list
这个函数是获取mysqlpp::Row的整个(或者部分)值的函数。这个函数会有一些输入(某些重构是vector<bool>,有些就是很多bool参数)来表明一个row中哪些field是需要被返回到结果集中的。不需要的就用false。
原创作品,转载请注明出处www.cnblogs.com/aicro。
【原创】8. MYSQL++中的Row类型的更多相关文章
- Mysql中的一些类型
列类型--整数类型Tinyint:迷你整形 一个字节=8位 最大能表示的数值是0-255 实际区间 -128~127Smallint:小整形 两个字节 能表示0-65535Mediumint:中整型 ...
- 解析MySQL中存储时间日期类型的选择问题
解析MySQL中存储时间日期类型的选择问题_Mysql_脚本之家 https://www.jb51.net/article/125715.htm 一般应用中,我们用timestamp,datetime ...
- 关于MySql中的varchar类型
今天新开始的项目在做数据库设计,发现自己对MySql的varchar类型还不熟悉,故又上网收集资料整理如下. 1.varchar类型的变化 MySQL 数据库的varchar类型在4.1以下的版本中的 ...
- MySQL 中的数字类型
MySQL 中数据类型常用的就三大类: 数字类型/numeric types 日期和时间/date and time types 字符类型/string (character and byte) ty ...
- MySql中的varchar类型
转载:http://www.cnblogs.com/doit8791/archive/2012/05/28/2522556.html 1.varchar类型的变化 MySQL 数据库的varchar类 ...
- mysql中的timestamp类型时间比较:unix_timestamp函数
在mysql中,某字段的类型设置为了timestamp,那么我们现在希望取出指定时间段的记录,该如何做呢? 在php中有time()和strtotime()来进行日期和时间戳的格式化,而在mysql中 ...
- MySql中的时间类型datetime,timestamp,date,year比较
MySQL日期类型.日期格式.存储空间.日期范围比较.日期类型 存储空间 日期格式 日期范围------------ --------- ...
- MySQL中的JSON类型
前言(废话) 昨天抽了点时间在网上搜列了一个开源项目,项目挺完整的,前后台分离还带有微信小程序,我Clone下代码,经过一番倒腾,嘿~还真就跑起来了.在这个过程中,体验了一把VUE项目工程细节,因为之 ...
- 向mysql中插入Date类型的数据
先看数据库表的定义 date字段为sql.date类型.我要向其中插入指定的日期和当前日期. 一.插入当前日期 思路:先获取当前系统,在将当前系统时间转换成sql类型的时间,然后插入数据库.代码如下 ...
随机推荐
- C++静态数据成员实现
静态数据成员是在一个类中用关键字static声明的数据成员.在C++中,一般使用静态成员来代替C语言的全局变量,以达到数据共享.C和C++的全局变量有一定的局限性,可以任意被修改,也容易和其它的变量名 ...
- Android内存优化(二)DVM和ART的GC日志分析
相关文章 Android内存优化系列 Java虚拟机系列 前言 在Java虚拟机(三)垃圾标记算法与Java对象的生命周期这篇文章中,提到了Java虚拟机的GC日志.DVM和ART的GC日志与Java ...
- make: *** No rule to make target `out/target/common/obj/APPS/framework-res_intermediates/src/R.stamp'
/********************************************************************************** * make: *** No r ...
- WDF - CSS 书写规范
CSS已经写了很久了,但是感觉代码还是有点乱,不够漂亮.今天抽点时间整理一下手头上正在做的网站样式,顺带做一个自己比较适应的书写规范,以供以后参考.先暂时这样吧,其他以后再完善. 逻辑:大小 → 位置 ...
- #507. 「LibreOJ NOI Round #1」接竹竿 dp
题目: 题解: 我们考虑把每对花色相同的牌看作区间. 那么如果我们设 \(f_i\) 表示决策在 \([1,i]\) 内的最优答案. 那么有 \(f_i = max\{max\{(f_{j-1}+\s ...
- 给System.Timer类的Elapsed事件加锁
背景: 最近在做一个项目,程序是命令行程序,在主程序中开一个线程,这个线程用到了System.Timer类的Elapsed事件,根据指定时间间隔循环去查询数据库,找符合条件的记录,把记录组织成xml对 ...
- 使用 Git 来备份 MySQL 数据库
使用 Git 来备份 MySQL 数据库 使用 mysqldump 导出 sql 文件 使用 git pull 提交到仓库 将脚本加入任务管理 mysqldump 导出时需要以下参数. --skip- ...
- android Shape使用(转)
在Android中常常会使用shape来定义控件的一些显示属性,那么怎么来用那,今天我们就来看一些shape的使用,大家看完这篇以后就会对shape有了大体的了解,下面的是稍作总结请大家仔细的观看: ...
- yii2 csrf验证原理分析
知识补充 因为yii2 csrf的验证的加解密 涉及到异或运算 所以需要先补充php里字符串异或运算的相关知识,不需要的可以跳过 ^异或运算不一样返回1 否者返回 0在PHP语言中,经常用来做加密的运 ...
- redis和phpredis扩展的安装
redis的安装https://code.google.com/p/redis/downloads/list下载redisredis-2.6.13.tar.gztar -xvzf redis-2.6. ...