本文共 2471 字,大约阅读时间需要 8 分钟。
tc_mysql类主要实现对mysql.h(mysql的官方API)中操作的封装.
TC_DBConf是一个db相关的配置类, 唯一函数是:
void loadFromMap(const map&mpParam) { map mpTmp = mpParam; _host = mpTmp["dbhost"]; _user = mpTmp["dbuser"]; _password = mpTmp["dbpass"]; _database = mpTmp["dbname"]; _charset = mpTmp["charset"]; _port = atoi(mpTmp["dbport"].c_str()); _flag = 0; if(mpTmp["dbport"] == "") { _port = 3306; } }
可见, 要先获取map, 这是通过TC_Config的getDomainMap来实现的, easy.
看下TC_Mysql的构造函数, 有:
_pstMql = mysql_init(NULL);
实际上就是创建了一个MYSQL类的对象, 可以理解为一个“广义socket”.
mysql_options相当于对_pstMql这个“广义socket”设置属性。
mysql_real_connect相当于在_pstMql这个“广义socket”建立连接。
mysql_close相当于关闭_pstMql这个“广义socket”.
如下是为了防止sql注入攻击:
string TC_Mysql::escapeString(const string& sFrom){ if(!_bConnected) { connect(); } string sTo; string::size_type iLen = sFrom.length() * 2 + 1; char *pTo = (char *)malloc(iLen); memset(pTo, 0x00, iLen); mysql_real_escape_string(_pstMql, pTo, sFrom.c_str(), sFrom.length()); sTo = pTo; free(pTo); return sTo;}
至于buildInsertSQL, buildReplaceSQL, buildUpdateSQL并没有什么大用, 还不用自己去写这些sql语句, 出错了也好查。而getVariables, 也没啥大用。
最重要的还是execute, queryRecord,相当于对"广义socket"进行操作。
而随后的:
updateRecord, insertRecord, replaceRecord, deleteRecord, getRecordCount, getSqlCount, getMaxValue, existRecord, lastInsertID,getAffectedRows
也仅仅是对基本mysql操作的封装, 实际中并无大用, 我还是觉得自己写mysql语句好, 然后execute或者queryRecord.
如下的MysqlRecord和MysqlData是类中类, 是很重要的数据:
/** * @brief mysql的一条记录 */ class MysqlRecord { public: /** * @brief 构造函数. * * @param record */ MysqlRecord(const map&record); /** * @brief 获取数据,s一般是指数据表的某个字段名 * @param s 要获取的字段 * @return 符合查询条件的记录的s字段名 */ const string& operator[](const string &s); protected: const map &_record; }; /** * @brief 查询出来的mysql数据 */ class MysqlData { public: /** * @brief 所有数据. * * @return vector
总之, TC_Mysql就是对mysql API的封装, 方便使用, 别无其他。
也确实很方便。
转载地址:http://ogwti.baihongyu.com/