安装官方提供的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语句的使用

下面部分代码:

 #pragma once
#include "mysql++.h" #define MYSQL_CFG_FILE "..//..//common//MySQL//config.json" typedef struct mysql_config
{
std::string ip;
int port;
std::string user;
std::string passwd;
std::string database_name;
}mysql_cfg; typedef struct mysql_field_information
{
std::string Field;
std::string Type;
std::string Null;
std::string Key;
std::string Default;
std::string Extra;
}mysql_field_info; typedef std::vector<mysql_field_info> mysql_table_info; typedef struct mysql_field_data
{ short SHORT;
int INTEGER;
long long BIGINT;
float FLOAT;
double DOUBLE; std::string DATETIME; std::string VARCHAR;
}mysql_field; typedef std::map<std::string, std::vector<mysql_field>> mysql_table; enum mysql_database_info
{
SHOW_VERISON,
SHOW_DATABASES,
SHOW_TABLES
}; class DMMySQL
{
public:
DMMySQL();
~DMMySQL(); void show_databases_info(int flag, std::vector<std::string>& databases); bool get_table_desc(std::string table_name, mysql_table_info& table_info); bool insert_mysql(std::string sql); bool insert_mysql(std::string table_name, std::map<std::string, std::string>& insert_data); bool update_mysql(std::string sql); bool update_mysql(std::string table_name, std::string field_name, std::string field_value,
std::string filter_key, std::string filter_value); bool select_mysql(std::string table_name, mysql_table& table_data); bool select_mysql(std::string table_name, std::string field_name, std::vector<mysql_field>& field_data); bool select_mysql(std::string table_name, std::string field_name,
std::string filter_key, std::string filter_value,
std::vector<mysql_field>& field_data, std::string filter_opt = "="); private:
bool load_mysql_config(); void init(); bool conncet_mysql(); void disconnect_mysql(); void trans_data_type(std::string input_data, std::string data_type, mysql_field& field_data); private:
mysql_cfg _mysql_cfg;
mysqlpp::Connection _conn;
};
 #include "json/json.h"
#include <fstream>
#include <ace/Log_Msg.h>
#include "DMMySQL.h"
#include <cxxabi.h> #define TRY_SQL \
try{ #define CATCH_SQL_ERROR \
}\
catch(const mysqlpp::BadQuery& error)\
{\
ACE_DEBUG((LM_ERROR,"MySQL Query error:%s!\n",error.what()));\
return false;\
}\
catch (const mysqlpp::BadConversion& error)\
{\
ACE_DEBUG((LM_ERROR,"MySQL Conversion error:%s!\n",error.what()));\
return false;\
}\
catch (const mysqlpp::Exception& error)\
{\
ACE_DEBUG((LM_ERROR,"MySQL Exception error:%s!\n",error.what()));\
return false;\
} DMMySQL::DMMySQL()
{
init();
} DMMySQL::~DMMySQL()
{
disconnect_mysql();
} bool DMMySQL::load_mysql_config()
{
std::ifstream cfg_file;
cfg_file.open(MYSQL_CFG_FILE, std::ios::binary); if (!cfg_file.is_open())
{
return ;
} Json::Reader Reader;
Json::Value Root; if (Reader.parse(cfg_file,Root))
{
_mysql_cfg.ip = Root["mysql_ip"].asString();
_mysql_cfg.port = Root["mysql_port"].asInt();
_mysql_cfg.user = Root["mysql_user"].asString();
_mysql_cfg.passwd = Root["mysql_passwd"].asString();
_mysql_cfg.database_name = Root["database_name"].asString();
}
else
{
ACE_DEBUG((LM_ERROR,"parse mysql config file failure!\n"));
return false;
} return true;
} void DMMySQL::init()
{
if (load_mysql_config())
{
conncet_mysql();
}
} bool DMMySQL::conncet_mysql()
{
if (!_conn.connect(_mysql_cfg.database_name.c_str(), _mysql_cfg.ip.c_str(),
_mysql_cfg.user.c_str(), _mysql_cfg.passwd.c_str(), _mysql_cfg.port))
{
ACE_DEBUG((LM_ERROR,"connect MySQL database failure!\n"));
return false;
} return true;
} void DMMySQL::show_databases_info(int flag, std::vector<std::string>& databases)
{
std::string opration; switch (flag)
{
case SHOW_VERISON:
{
std::string version_info = _conn.client_version();
databases.push_back(version_info);
return;
}
case SHOW_DATABASES:
{
opration = "show databases";
break;
}
case SHOW_TABLES:
{ opration = "show tables";
break;
}
default:
{
return;
}
} mysqlpp::Query query = _conn.query(opration);
if (mysqlpp::StoreQueryResult res = query.store())
{
mysqlpp::StoreQueryResult::iterator rit;
for (rit = res.begin(); rit != res.end(); ++rit)
{
databases.push_back((*rit)[].c_str());
}
}
} bool DMMySQL::get_table_desc(std::string table_name, mysql_table_info& tbl_info)
{
TRY_SQL
std::string opration = "describe " + table_name;
mysqlpp::Query query = _conn.query(opration);
mysqlpp::StoreQueryResult res = query.store(); int field_num = res.size();
for (int i = ; i < field_num; ++i)
{
mysql_field_info field_i; field_i.Field = res[i]["field"].c_str();
field_i.Type = res[i]["type"].c_str();
field_i.Null = res[i]["null"].c_str();
field_i.Key = res[i]["key"].c_str();
field_i.Default = res[i]["default"].c_str();
field_i.Extra = res[i]["extra"].c_str(); tbl_info.push_back(field_i);
}
CATCH_SQL_ERROR
return true;
} void DMMySQL::disconnect_mysql()
{
_conn.disconnect();
} bool DMMySQL::insert_mysql(std::string sql)
{
TRY_SQL
mysqlpp::Query query = _conn.query(sql);
query.execute();
CATCH_SQL_ERROR
return true;
}

完整代码参考: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. Javascript学习笔记2.2 Javascript与DOM选项卡(滑动门)案例详解

    学习了DOM的知识,今天开始做些练习,想到了一个网页滑动门的特效,见下图: 1.通过建立索引实现 <!doctype html> <html> <head> < ...

  2. 苹果下如果安装nginx,给nginx安装markdown第三方插件

    用brew install nginx 这样安装的是最新版的nginx, 但是在有些情况下,安装第三方插件需要特定的版本,更高一级的版本可能装不上. 它的原理是下载安装包进行自动安装,建立软链,这样就 ...

  3. [IOS 开发] 懒加载 (延迟加载) 的基本方式,好处,代码示例

    懒加载的好处: 1> 不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强 2> 每个属性的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合 ...

  4. zabbix-agent配置文件说明

    zabbix-agent配置文件:/etc/zabbix/zabbix_agentd.conf Server=zabbix server IP,网关IP hostname=本机IP ServerAct ...

  5. UIImagePickerController和UIAlertController结合使用

    在处理个人资料 - 头像的时候,通常有两个选项,一个是调用系统相机,一个是调用系统相册.这里要使用的就是UIImagePickerController方法. 在头像位置的imageView添加一个手势 ...

  6. SpringMVC 视图和视图解析器&表单标签

    视图和视图解析器 请求处理方法执行完成后,最终返回一个 ModelAndView 对象.对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它 ...

  7. Eclipse中怎么安装TestNG单元测试框架

    在进行使用的eclipse的进行开发的代码中,必然就会需要进行单元测试,在单元测试的情况提供较多的框架单元测试,例如使用junit单元测试,而在国外进行开发较好的单元测试,提供了较好的测试的报告,ju ...

  8. 基于Flask的Web应用部署到SAE上遇到的问题

    我的应用底层数据库用的是MySQL,利用Flask-SQLALchemy实现接口操作.我遇到的问题是: 在我把代码部署到SAE上后,当数据向数据库insert的时候总是出现“2006,MySQL ha ...

  9. 用PowerMock spy mock private方法

    在实际的工作中,经常碰到只需要mock一个类的一部分方法,这时候可以用spy来实现. 被测类: public class EmployeeService { public boolean exist( ...

  10. Android两个页面之间的切换效果工具类

    import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; ...