安装官方提供的mysqlconnect后,可以使用mysql++库,在官方的C API上再次做一个c++面向对象封装。

这里mysql++的安装依赖于mysql-connector-c。安装参考:http://dev.mysql.com/doc/connector-c/en/connector-c-installation-source-unix.html

c++11下注意:

1.由于mysql++并没有采用c++11,所以在使用的时候报了一些警告,需要对源码进行修改。

2.在获取字段类型的API在g++编译器下不是非常理想

3.执行sql存在错误时,系统会coredump,注意try语句的使用

下面部分代码:

  1. #pragma once
  2. #include "mysql++.h"
  3.  
  4. #define MYSQL_CFG_FILE "..//..//common//MySQL//config.json"
  5.  
  6. typedef struct mysql_config
  7. {
  8. std::string ip;
  9. int port;
  10. std::string user;
  11. std::string passwd;
  12. std::string database_name;
  13. }mysql_cfg;
  14.  
  15. typedef struct mysql_field_information
  16. {
  17. std::string Field;
  18. std::string Type;
  19. std::string Null;
  20. std::string Key;
  21. std::string Default;
  22. std::string Extra;
  23. }mysql_field_info;
  24.  
  25. typedef std::vector<mysql_field_info> mysql_table_info;
  26.  
  27. typedef struct mysql_field_data
  28. {
  29.  
  30. short SHORT;
  31. int INTEGER;
  32. long long BIGINT;
  33. float FLOAT;
  34. double DOUBLE;
  35.  
  36. std::string DATETIME;
  37.  
  38. std::string VARCHAR;
  39. }mysql_field;
  40.  
  41. typedef std::map<std::string, std::vector<mysql_field>> mysql_table;
  42.  
  43. enum mysql_database_info
  44. {
  45. SHOW_VERISON,
  46. SHOW_DATABASES,
  47. SHOW_TABLES
  48. };
  49.  
  50. class DMMySQL
  51. {
  52. public:
  53. DMMySQL();
  54. ~DMMySQL();
  55.  
  56. void show_databases_info(int flag, std::vector<std::string>& databases);
  57.  
  58. bool get_table_desc(std::string table_name, mysql_table_info& table_info);
  59.  
  60. bool insert_mysql(std::string sql);
  61.  
  62. bool insert_mysql(std::string table_name, std::map<std::string, std::string>& insert_data);
  63.  
  64. bool update_mysql(std::string sql);
  65.  
  66. bool update_mysql(std::string table_name, std::string field_name, std::string field_value,
  67. std::string filter_key, std::string filter_value);
  68.  
  69. bool select_mysql(std::string table_name, mysql_table& table_data);
  70.  
  71. bool select_mysql(std::string table_name, std::string field_name, std::vector<mysql_field>& field_data);
  72.  
  73. bool select_mysql(std::string table_name, std::string field_name,
  74. std::string filter_key, std::string filter_value,
  75. std::vector<mysql_field>& field_data, std::string filter_opt = "=");
  76.  
  77. private:
  78. bool load_mysql_config();
  79.  
  80. void init();
  81.  
  82. bool conncet_mysql();
  83.  
  84. void disconnect_mysql();
  85.  
  86. void trans_data_type(std::string input_data, std::string data_type, mysql_field& field_data);
  87.  
  88. private:
  89. mysql_cfg _mysql_cfg;
  90. mysqlpp::Connection _conn;
  91. };
  1. #include "json/json.h"
  2. #include <fstream>
  3. #include <ace/Log_Msg.h>
  4. #include "DMMySQL.h"
  5. #include <cxxabi.h>
  6.  
  7. #define TRY_SQL \
  8. try{
  9.  
  10. #define CATCH_SQL_ERROR \
  11. }\
  12. catch(const mysqlpp::BadQuery& error)\
  13. {\
  14. ACE_DEBUG((LM_ERROR,"MySQL Query error:%s!\n",error.what()));\
  15. return false;\
  16. }\
  17. catch (const mysqlpp::BadConversion& error)\
  18. {\
  19. ACE_DEBUG((LM_ERROR,"MySQL Conversion error:%s!\n",error.what()));\
  20. return false;\
  21. }\
  22. catch (const mysqlpp::Exception& error)\
  23. {\
  24. ACE_DEBUG((LM_ERROR,"MySQL Exception error:%s!\n",error.what()));\
  25. return false;\
  26. }
  27.  
  28. DMMySQL::DMMySQL()
  29. {
  30. init();
  31. }
  32.  
  33. DMMySQL::~DMMySQL()
  34. {
  35. disconnect_mysql();
  36. }
  37.  
  38. bool DMMySQL::load_mysql_config()
  39. {
  40. std::ifstream cfg_file;
  41. cfg_file.open(MYSQL_CFG_FILE, std::ios::binary);
  42.  
  43. if (!cfg_file.is_open())
  44. {
  45. return ;
  46. }
  47.  
  48. Json::Reader Reader;
  49. Json::Value Root;
  50.  
  51. if (Reader.parse(cfg_file,Root))
  52. {
  53. _mysql_cfg.ip = Root["mysql_ip"].asString();
  54. _mysql_cfg.port = Root["mysql_port"].asInt();
  55. _mysql_cfg.user = Root["mysql_user"].asString();
  56. _mysql_cfg.passwd = Root["mysql_passwd"].asString();
  57. _mysql_cfg.database_name = Root["database_name"].asString();
  58. }
  59. else
  60. {
  61. ACE_DEBUG((LM_ERROR,"parse mysql config file failure!\n"));
  62. return false;
  63. }
  64.  
  65. return true;
  66. }
  67.  
  68. void DMMySQL::init()
  69. {
  70. if (load_mysql_config())
  71. {
  72. conncet_mysql();
  73. }
  74. }
  75.  
  76. bool DMMySQL::conncet_mysql()
  77. {
  78. if (!_conn.connect(_mysql_cfg.database_name.c_str(), _mysql_cfg.ip.c_str(),
  79. _mysql_cfg.user.c_str(), _mysql_cfg.passwd.c_str(), _mysql_cfg.port))
  80. {
  81. ACE_DEBUG((LM_ERROR,"connect MySQL database failure!\n"));
  82. return false;
  83. }
  84.  
  85. return true;
  86. }
  87.  
  88. void DMMySQL::show_databases_info(int flag, std::vector<std::string>& databases)
  89. {
  90. std::string opration;
  91.  
  92. switch (flag)
  93. {
  94. case SHOW_VERISON:
  95. {
  96. std::string version_info = _conn.client_version();
  97. databases.push_back(version_info);
  98. return;
  99. }
  100. case SHOW_DATABASES:
  101. {
  102. opration = "show databases";
  103. break;
  104. }
  105. case SHOW_TABLES:
  106. {
  107.  
  108. opration = "show tables";
  109. break;
  110. }
  111. default:
  112. {
  113. return;
  114. }
  115. }
  116.  
  117. mysqlpp::Query query = _conn.query(opration);
  118. if (mysqlpp::StoreQueryResult res = query.store())
  119. {
  120. mysqlpp::StoreQueryResult::iterator rit;
  121. for (rit = res.begin(); rit != res.end(); ++rit)
  122. {
  123. databases.push_back((*rit)[].c_str());
  124. }
  125. }
  126. }
  127.  
  128. bool DMMySQL::get_table_desc(std::string table_name, mysql_table_info& tbl_info)
  129. {
  130. TRY_SQL
  131. std::string opration = "describe " + table_name;
  132. mysqlpp::Query query = _conn.query(opration);
  133. mysqlpp::StoreQueryResult res = query.store();
  134.  
  135. int field_num = res.size();
  136. for (int i = ; i < field_num; ++i)
  137. {
  138. mysql_field_info field_i;
  139.  
  140. field_i.Field = res[i]["field"].c_str();
  141. field_i.Type = res[i]["type"].c_str();
  142. field_i.Null = res[i]["null"].c_str();
  143. field_i.Key = res[i]["key"].c_str();
  144. field_i.Default = res[i]["default"].c_str();
  145. field_i.Extra = res[i]["extra"].c_str();
  146.  
  147. tbl_info.push_back(field_i);
  148. }
  149. CATCH_SQL_ERROR
  150. return true;
  151. }
  152.  
  153. void DMMySQL::disconnect_mysql()
  154. {
  155. _conn.disconnect();
  156. }
  157.  
  158. bool DMMySQL::insert_mysql(std::string sql)
  159. {
  160. TRY_SQL
  161. mysqlpp::Query query = _conn.query(sql);
  162. query.execute();
  163. CATCH_SQL_ERROR
  164. return true;
  165. }

完整代码参考:https://github.com/binchen-china/DMServer

MySQL - MySQL++在c++11环境下接口设计的更多相关文章

  1. (1)MySQL进阶篇在linux环境下安装

    1.概述 对于mysql二进制安装,优点是可以安装到任何路径下,灵活性好,一台服务器可以安装多个mysql.缺点是已经编译过,性能不如源码编译得好,不能灵活定制编译参数.如果用户即不想安装最简单却不够 ...

  2. C++ 11可变参数接口设计在模板编程中应用的一点点总结

    概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量 ...

  3. 2018.11.30 zsh: command not found: mysql 的解决办法mac环境下

    系统环境变量的问题.解决办法: 1.打开终端.输入open .zshrc 会出现一个可编辑文档, 2.找到# User configuration部分,在下一行添加source ~/.bash_pro ...

  4. 安装mysql到服务器的linux环境下

    1·安装mysql 命令:yum -y install httpd php mysql mysql-server 2·配置mysql 配置开机启动服务 /sbin/chkconfig --add my ...

  5. axios无法在ie9,10,11环境下运行的问题解决

    npm install es6-promise --save-dev import promise from 'es6-promise'; promise.polyfill();

  6. Windows环境下Mysql 5.7读写分离之使用mysql-proxy练习篇

    本文使用mysql-proxy软件,结合mysql读写分离,实现实战练习. 前期准备: 三台机器: 代理机,IP:192.168.3.33 mysql Master,IP:192.168.3.32 m ...

  7. 生产环境下lnmp的权限说明

    https://www.cnblogs.com/zrp2013/p/4183546.html 有关权限说明:-rwxrw-r‐-1 root root 1213 Feb 2 09:39 50.html ...

  8. MySQL主从环境下存储过程,函数,触发器,事件的复制情况

    下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...

  9. 【Data Cluster】真机环境下MySQL数据库集群搭建

    真机环境下MySQL-Cluster搭建文档  摘要:本年伊始阶段,由于实验室对不同数据库性能测试需求,才出现MySQL集群搭建.购置主机,交换机,双绞线等一系列准备工作就绪,也就开始集群搭建.起初笔 ...

随机推荐

  1. 数组中的toString,toLocalString,valueOf方法有什么区别

    1. 2.简单来说,tostring就是用字符串来代替对象.tolocalstring就是根据不同的语言环境吧对象转成字符串,实际上totolocalstring是有缺省参数的,如tolocalstr ...

  2. 一个靠谱的国外maven镜像地址

    <mirror> <id>ui</id> <mirrorOf>central</mirrorOf> <name>Human Re ...

  3. icon-font与svg

    icon font 使用与svg应用分享 icon font 字体概述 css3增加了@font-face属性,传统的浏览器是通过font-family来设置字体,如果系统里没有的话就用其它字体来代替 ...

  4. C#中Cookie的概述及应用

    1.Cookie简介 Cookie 提供了一种在 Web 应用程序中存储用户特定信息的方法.例如,当用户访问您的站点时,您可以使用 Cookie 存储用户首选项或其他信息.当该用户再次访问您的网站时, ...

  5. CAS实现SSO单点登录原理

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

  6. Spring的入门的程序

    1 下载Spring的开发包: spring-framework-3.2.0.RELEASE-dist.zip ---Spring开发包 docs :spring框架api和规范 libs :spri ...

  7. Python Day 01

    What is variables? 一段命名的内存空间 变量即在程序运行过程中,它的值是允许改变的量 1.变量命名: 合法: 显式.通俗易懂. nums_of_jay_gf = 19 NumsOfJ ...

  8. C#如何获取项目中的其他文件夹的路径

    //一般用string p=AppDomain.CurrentDomain.BaseDirectory+"\\其他"; //其它的还有 string str1 =Process.G ...

  9. The connection to adb is down, and a severe error has occured.问题解决方法小结

    遇到了几次这个问题:The connection to adb is down, and a severe error has occured. You must restart adb and Ec ...

  10. Linux 命令 find

    find命令的基本格式是:find [路径] [选项] [操作]路径是find命令所查找的范围,如用.来表示当前目录,用/来表示根目录,选项用于指定查找条件,如:可以指定按照文件的属主,更改时间文件类 ...