摘要: 终于完成了! 从第一次想写到现在真的写好大概花了我3个月时间。原来一直读人家的系列文章,总感慨作者的用心良苦和无私奉献,自己在心里总是会觉得有那么些冲动也来写一个。 最开始的麻烦是犹豫该选哪个主题。其实有好几个想仔细读一下的源代码,比如说gtest,陈硕写的网络库muduo,还有那本尘封已久的Linux源码……最后由于工作需要,我还是选了个最“实在”的主题——说实在只是因为这个是工作需要——M... 阅读全文
posted @ 2014-03-30 10:23 aicro 阅读(4906) 评论(0) 推荐(1) 编辑
摘要: 从之前所介绍的SSQLS的介绍中我们可以感受到,SSQLS的精髓应该在sql_create_#这个宏,他所创建出来的这个结构体将会是突破的关键,所以我将会从以下顺序入手。1. sql_create_#先再来重复一下我们需要使用的examples/stock.h中的内容sql_create_6( stock, 1, 6, mysqlpp::sql_char, item, mysqlpp::sql_bigint, num, mysqlpp::sql_double, weight, mysqlpp:... 阅读全文
posted @ 2014-03-30 10:05 aicro 阅读(2549) 评论(0) 推荐(0) 编辑
摘要: 1. 综述终于来到了SSQLS( Specialized SQL Structure),照我看来这是一个很类似于Hibernate的功能。也就是说,通过SSQLS可以将一张表完全对应到一个C++结构体中,然后只要对于这个结构体进行操作,同时再加入到对应的mysqlpp:: Query对应的方法中,我们就可以执行对应的SQL语句。值得说一下的是,该功能在实际项目中还是相当有用的,但是笔者所在公司由于其业务的特殊性,通常来说表的结构会非常非常大(有一些表居然有近200个字段)。根据作者的manual,MYSQL++默认只支持不超过25个字段的表结构,但是可以通过在编译前调整一些参数来修改这个限制。 阅读全文
posted @ 2014-03-30 10:03 aicro 阅读(6343) 评论(2) 推荐(0) 编辑
摘要: 1. 什么是Template Query在我们实际的编程过程中,我们很容易碰到printf这类需要在运行时来决定到底打印出什么的函数,例如printf(“hello %s”, sth);在这个例子中,那个%s占位符表明了我们以后希望打印的内容格式和位置。同样,在我们书写SQL语句的时候,也会出现这样的情况,例如SELECT * from tbl1 WHERE id = ???我们很有可能在代码中会根据用户的输入来决定如何写入这个???。一种解决办法是,我们在程序中自己记录除了???直往外的内容,然后每次拼接出这句SQL。另一种办法就是使用MYSQL++的Template Query功能。说到底 阅读全文
posted @ 2014-03-30 10:02 aicro 阅读(3637) 评论(0) 推荐(0) 编辑
摘要: 1. 综述其实一看到这两个单词的时候我有点莫名其妙,可能英语没有学好,我的理解就是quoting是“引用”的意思,而Escaping是“逃脱”的意思。后来在看到了作者的TUTORIAL之后才大致明白了两者的意思。QUOTING大白话就是为SQL语句打上单引号。考虑如下的情况SELECT * FROM stock WHERE item = 'Hotdog Buns'由于中间有一个空格,所以这个单引号必不可少。ESCAPING大白话就是转义。例如在C的printf中,为了打出引号(“),我们需要使用”\””的方式。在SQL语句中,这种情况仍然存在,下文节选自MYSQL C API中 阅读全文
posted @ 2014-03-30 10:00 aicro 阅读(3138) 评论(0) 推荐(0) 编辑
摘要: 1. 综述DbDriver只是对于MYSQL C API的一个非常简单的封装,作者原句是This class does as little as possible to adapt between its public interface and the interface required by the underlying C API. 作为MYSQL++的使用者我们不应该直接去创建这个类型,而应该默认让mysqlpp:: Connection来来创建和管理,如果实在是需要,可以通过mysqlpp:: Connection::driver( )来获取底层的DbDriver类型。作者想把这个 阅读全文
posted @ 2014-03-30 09:59 aicro 阅读(3388) 评论(0) 推荐(0) 编辑
摘要: mysqlpp::Field其实使用的并不多,主要在于Result.h中ResultBase以及他的派生类型(UseQueryResult和StoreQueryResult)的几个获取下一个field的方法(全部定义在了ResultBase中),主要如下mysqlpp::FieldNames的主要作用就是保存FieldNames,他其实就是一个vector的派生类型。主要用在了ResultBase以及他的派生类型(UseQueryResult和StoreQueryResult)用于获取Field Names的时候,以及mysqlpp::Row中用于SSLQS的equal_list和field_ 阅读全文
posted @ 2014-03-30 09:58 aicro 阅读(2279) 评论(0) 推荐(0) 编辑
摘要: 一、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");mysqlp 阅读全文
posted @ 2014-03-30 09:57 aicro 阅读(6729) 评论(0) 推荐(0) 编辑
摘要: 在本节中,我将首先介绍MYSQL++中的查询的几个简单例子用法,然后看一下mysqlpp::Query中的几个与查询相关的方法原型(重点关注返回值),最后对几个关键类型进行解释。1. MYSQL++的查询实例下面的两个例子分别是STORE(所有数据一次性从服务器拉到本地缓存)和USE(将数据一条一条从服务器拉到本地)的使用方式,其中STORE内部实质就是mysql_store( ),而USE实质就是调用了mysql_use( )。说明,下面的例子虽然使用的都是最为基本的查询过程(即没有使用template sql或者SSQLS),但是这个并不影响我们的讨论,因为遍历结果集的过程是一致的。STO 阅读全文
posted @ 2014-03-30 09:56 aicro 阅读(14797) 评论(0) 推荐(0) 编辑
摘要: 这次要说明的是在MYSQL++中为了实现SQL中的NULL而做出的一系列的举措。我的感觉是Null类型通常出现在SSQLS和template Query中比较多。1. 什么是SQL语法中的NULL(以后简称SQL NULL,区别于C++ NULL)我们可以像下面这样创建一张表CREATE TABLE tbl1 ( id INT NOT NULL, name CHAR(20) , time TIMESTAMP NULL );在MYSQL中,上述语句的创建出来的表的列的情况是(dbvisua... 阅读全文
posted @ 2014-03-30 09:55 aicro 阅读(1651) 评论(0) 推荐(0) 编辑
摘要: 该类型是SQLBuffer的灵魂,它用来表示从SQL TYPE到C++ TYPE的相互转变。该类型被定义在type_info.h中。在这个头文件中,其实定义了三个类型,其中前两个都是在mysql_type_info中所使用的utility类型。1. mysql_ti_sql_type_info该类型其实更多地保存mapping信息的数据结构,其核心的成员变量是const char* sql_name_; // SQL类型的字符串描述,例如"TINYINT NOT NULL", "SMALLINT NOT NULL"等 const std::type_in 阅读全文
posted @ 2014-03-30 09:54 aicro 阅读(2428) 评论(0) 推荐(0) 编辑
摘要: 1. mysqlpp::SQLBuffer该类型其实就是SQLTypeAdapter传入的各种类型(int, string, double, long, String, …) 的包装,包装的结果就是各种类型实例的字符串表示 ( const char* data_; )length 长度 ( size_type length_ )类型(由mysqlpp::mysql_type_info定义) ( mysql_type_info type_ )是否是数据库的NULL类型 ( bool is_null_ )表示类型的类别是 mysql_type_info ,该类型是一个“C++类型”和“SQL 类型 阅读全文
posted @ 2014-03-30 09:53 aicro 阅读(2028) 评论(0) 推荐(0) 编辑
摘要: 我们可以通过使用mysqlpp:: Query来进行SQL语句的增删改查。首先来看一下mysqlpp::Query的一些最简单的调用,conn.connect(mysqlpp::examples::db_name, "127.0.0.1", "root", "root");mysqlpp::Query query = conn.query("select item from stock");mysqlpp::StoreQueryResult res = query.store();// ORmysqlpp::Que 阅读全文
posted @ 2014-03-30 09:52 aicro 阅读(6746) 评论(0) 推荐(0) 编辑
摘要: mysqlpp:: Connect类型主要负责连接事宜,这是在所有开始mysql操作之前必须进行的(这是句废话)。该类型的主要的结果如下所示mysqlpp::OpeitonalExceptions通过查看源码,我看到OptionalExceptions就是一个对于一个表示“是否需要抛出异常”的变量的包装。在Connection类型的内容,会在出现错误的时候调用OpetionalExceptions.throw_exceptions( )方法来查看是否需要使用异常的手段来表示错误。mysqlpp::Connection这个类型是用户程序能够看到的少数几个类型,它所包含的主要的方法就是“连接”,“ 阅读全文
posted @ 2014-03-30 09:51 aicro 阅读(2656) 评论(0) 推荐(0) 编辑
摘要: MYSQL++是对于MYSQL C API的C++完全包装。MYSQL++能够至少做如下几件事情1. 连接数据库通过TCP连接数据库通过WINDOWS命名管道连接数据库UNIX域SOCKET连接数据库所有的链接操作可以通过使用mysqlpp::Connection类型进行,为了方便起见,mysqlpp还提供了TCPConnection,UnixDomainSocketConnection以及WindowsNamedPipeConnection。但是一般情况只需要通过Connection的不同Connect方法overload就可以进行连接。2. 增删改查方法MYSQL++支持的查询方法是直接使 阅读全文
posted @ 2014-03-30 09:49 aicro 阅读(2533) 评论(0) 推荐(0) 编辑
摘要: 1. 获取Google MYSQL++,第一个就是,然后跟着要求进行下载。2. 编译和安装其实在作者的各种README文档里面已经写得很清楚了,现在对一些可能会出现问题的地方进行一下回顾。Windows环境我所使用的环境是WIN7+VS2010,读了一下Visual Studio版本的Readme,我发现其实作者还是推荐我使用vs2005的sln进行升级的,然后我也试了一下,vs2008的sln最终在update之后出现了各种convert失败的情况。所以我决定使用vs2005目录下的文件。在进行升级之前,请使用工具打开所有的vcproj,然后查找“C:\Program Files\MySQL 阅读全文
posted @ 2014-03-30 09:47 aicro 阅读(1999) 评论(0) 推荐(0) 编辑