MySQL++是一个针对MySQL C API的C++封装。它的目的是提供一个类似STL容易一样简单易用的接口,帮助你有效的避免在代码中使用复杂的SQL语句。

  1. SQL 专属结构

专属SQL结构(SSQLS)特性允许你方便简单的将定义的C++结构存储到SQL表中。从表面上来看,一个SSQLS每一个成员变量对应了SQL表中的每一个字段。但是,其实SSQLS里同样有一些函数方法,操作和MySQL++使用的数据成员,这些我们将在这一章节进行讲解。 你可以通过 ssqls.h 里面的一些宏来定义 SSQLS 结构。这是唯一一个没有被 mysql++.h 头文件包含的MySQL++头文件。如果你使用了SSQLS特性,你需要自己在项目中包含这个头文件。

5.1. sql_create

我们看一下下面的这个SQL表结构

CREATE TABLE stock ( item CHAR(30) NOT NULL, num BIGINT NOT NULL, weight DOUBLE NOT NULL, price DECIMAL(6,2) NOT NULL, sdate DATE NOT NULL, description MEDIUMTEXT NULL)

你可以创建一个类似于该表的C++结构,如下:

sql_create_6(stock, 1, 6, mysqlpp::sql_char, item, mysqlpp::sql_bigint, num, mysqlpp::sql_double, weight, mysqlpp::sql_decimal, price, mysqlpp::sql_date, sdate, mysqlpp::Nullmysqlpp::sql_mediumtext, description)

声明 stock 结构,然后为SQL每一列声明一个同名的数据成员。这个结构同样还有一个成员函数,操作着隐藏的数据成员,我们暂时不讲。 在参数之前我们调用了一个 sql_create ,然后使用了C++数据类型保存了SSQLS的数据。当然,这里没有使用标准C++类型,我们更希望你使用MySQL++定义的数据类型,而不是标准C++的。 有时候你不得不用MySQL++内的数据类型,例如 SQL 里的NULL,这个“未定义”值是无法使用C++类型声明定义的。但是MySQL++里等译了Null模板,可以区分两种不同的Null. Sql_create 宏定义如下

sqlcreate#(NAME, COMPCOUNT, SETCOUNT, TYPE1, ITEM1, … TYPE#, ITEM#)

其中NAME是你准备创建的结构,TYPEx 是你创建的字段类型,ITEMx 则是你创建的字段名称。其中的 COMPCOUNT 和 SETCOUNT 我们在下面的章节说明。

5.2. SSQLS的初始化和比较

Sql_create 宏其实定义了成员函数以便你和另外一个SSQLS实例进行比较。这个函数实际比较的是两个SSQLS结构中的 COMPCOUNT 编号的变量。在上面那个例子里,COMPCOUNT 是 1,所以如果两个SSQLS实例比较的话,则仅仅比较的是 item 这个字段的值。如果COMPCOUNT是2,在上面的那个例子里,比对俩实例的时候,则需要比较 item 和 num 这两个字段的值。 所以非常推荐,你将SQL中“Key”字段作为 COMPCOUNT。 COMPCOUNT必须大于等于1。 另外 sql_create 函数不能创建一个没有 COMPCOUNT 的 SSQLS 对象。 我们也可以使用容器和STL数学方法进行结果的一些查询处理,就如同 SQL 容器的处理一样:

std::set result; query.storein(result); cout << result.lower_bound(stock(“Hamburger”))->item << endl;

这将输出以 “Hamburger” 开头的结果数据的 item 字段。 Sql_create 的第三个参数是 SETCOUNT。如果这个值不是 0, 它将为结构增加一个初始化构造函数,同时增加一个 set() 成员函数,可以初始化结构中的前几个参数。我们看下之前的例子,现在我们修改一下 SETCOUNT ,如下:

sql_create_6(stock, 1, 2, mysqlpp::sql_char, item, mysqlpp::sql_bigint, num,
mysqlpp::sql_double, weight, mysqlpp::sql_decimal, price, mysqlpp::sql_date, sdate, mysqlpp::Nullmysqlpp::sql_mediumtext, description)

stock foo(“Hotdog”, 52);

除了一个2个参数的构造函数之外,这个SSQLS结构内其实还有一个两个参数的set()成员函数,作用类似于这个构造函数。

注意,COMPCOUNT 和 SETCOUNT 的值不能相同。如果它们相同的话,这个宏将创建两个同样参数列表的初始化构造函数,这在C++中是禁止的。你可能会问,为什么要为比较这个功能做一个构造函数?这是为了方便我们使用类似 x == stock(“HotDog”) 的操作。这就要求我们使用 COMPCOUNT 个参数创建一个构造函数。 这个限制在实际中并不会带来太多问题,如果你需要同样数量的参数进行比较,也需要同样数量的参数进行初始化,你只需要将 SETCOUNT 设置为 0,这样的话,就不会出现上述的冲突了,但是SETCOUNT个参数的初始化构造函数依旧存在了(被COMPCOUNT创建了),例如

sql_create_1(stock_item, 1, 0, mysqlpp::sql_char, item)


TODO:大运放假,回去休息弄别的代码了。