前言
为什么要使用mysql数据库?
设想一下有一个很大的(如10G)数据,我们不能将之存放在内存中,只能够放在磁盘上,每一次CPU读取数据都需要进行慢到吐血的磁盘IO
操作,那这时使用mysql这种关系型数据库就显得尤为重要的。
记住mysql的数据也是存放在磁盘上面的,不过读取速度更快!
一.关于关系型数据库mysql的介绍,网上已经有很多资料,不用我再多做介绍
二.不同的环境添加mysql的链接包方式不同,在这里介绍Linux环境下的添加方法
首先将mysql文件包放到 /usr/include
目录下:
注意文件包中我们需要添加的是这个头文件:mysql.h
C++封装
注意在编译时需要加上: mysql_config --cflags --libs
Mysql.h
:
#pragma once
#include <string>
#include <mysql/mysql.h>
#include <iostream>
using namespace std;
namespace wd
{
class Mysql
{
public:
Mysql();
~Mysql();
bool initDB(string host, string user, string pwd, string db_name, int port);
bool exeSQL(string sql); //执行sql语句
bool select_one_SQL(std::string sql, string &str); //只查找一个字段一行,并存入str中, 如果查找的不存在,那么str仍将会为空值
bool select_many_SQL(std::string sql, string &str); //查找多个字段多个行,并存入str中
private:
MYSQL *mysql;
MYSQL_RES *result;
MYSQL_ROW row;
};
} // namespace wd
Mysql.cpp
:
#include "Mysql.h"
namespace wd
{
Mysql::Mysql()
{
mysql = mysql_init(NULL);
if (!mysql)
{
cout << "Error:" << mysql_error(mysql);
exit(1);
}
}
Mysql::~Mysql()
{
if (mysql)
{
mysql_close(mysql);
}
}
bool Mysql::initDB(std::string host, std::string user, std::string passwd, std::string db_name, int port = 3306)
{
mysql = mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), port, NULL, 0);
if (!mysql)
{
cout << "Error: " << mysql_error(mysql);
return false;
}
return true;
}
bool Mysql::exeSQL(std::string sql)
{
//mysql_query()执行成功返回0,执行失败返回非0值。
if (mysql_query(mysql, sql.c_str()))
{
cout << "Query Error: " << mysql_error(mysql);
return false;
}
result = mysql_store_result(mysql);
if (result)
{
//获取结果集中总共的字段数,即列数
int num_fields = mysql_num_fields(result);
unsigned long long num_rows = mysql_num_rows(result);
for (unsigned long long i = 0; i < num_rows; i++)
{
row = mysql_fetch_row(result);
if (!row)
{
break;
}
for (int j = 0; j < num_fields; j++)
{
cout << row[j] << "\t\t";
}
cout << endl;
}
}
else
{
//代表执行的是update,insert,delete类的非查询语句
if (mysql_field_count(mysql) == 0)
{
// 返回update,insert,delete影响的行数
unsigned long long num_rows = mysql_affected_rows(mysql);
return num_rows;
}
else
{
cout << "Get result error: " << mysql_error(mysql);
return false;
}
}
return true;
}
//只查找一个字段一行,并存入str中, 如果查找的不存在,那么str仍将会为空值
bool Mysql::select_one_SQL(std::string sql, string &str)
{
//mysql_query()执行成功返回0,执行失败返回非0值。
if (mysql_query(mysql, sql.c_str()))
{
cout << "Query Error: " << mysql_error(mysql);
return false;
}
result = mysql_store_result(mysql);
if (result)
{
//获取结果集中总共的字段数,即列数
int num_fields = mysql_num_fields(result);
unsigned long long num_rows = mysql_num_rows(result);
for (unsigned long long i = 0; i < num_rows; i++)
{
row = mysql_fetch_row(result);
if (!row)
{
break;
}
for (int j = 0; j < num_fields; j++)
{
str = row[j];
}
}
}
return true;
}
//查找多个字段多个行,并存入str中
bool Mysql::select_many_SQL(std::string sql, string &str)
{
//mysql_query()执行成功返回0,执行失败返回非0值。
if (mysql_query(mysql, sql.c_str()))
{
cout << "Query Error: " << mysql_error(mysql);
return false;
}
result = mysql_store_result(mysql);
if (result)
{
//获取结果集中总共的字段数,即列数
int num_fields = mysql_num_fields(result);
unsigned long long num_rows = mysql_num_rows(result);
for (unsigned long long i = 0; i < num_rows; i++)
{
row = mysql_fetch_row(result);
if (!row)
{
break;
}
for (int j = 0; j < num_fields; j++)
{
str += row[j];
str += "|\t\t";
}
str += "\n";
}
}
return true;
}
} // namespace wd
test.cpp
:
#include "Mysql.h"
using namespace wd;
/*
g++ test.cpp Mysql.cpp `mysql_config --cflags --libs`
*/
int main()
{
Mysql mysql;
if (!mysql.initDB("localhost", "root", "123", "crashcourse", 3306))
{
cout << "connect fails" << endl;
exit(-1);
}
mysql.exeSQL("SELECT * FROM orders;");
return 0;
}
输出结果
: