注意:
编译程序时需要指定头文件路径、mysql库,这里可以使用命令
$ mysql_config - -libs
mysql_config命令会为你编译,MYSQL客户端,并连接到MYSQL服务器提供有用的信息,- -libs参数连接MYSQL客户端函数库所需要的库和选项
封装类
class CMyDB
{
public:
CMyDB(const std::string server_host, const std::string user, const std::string passwd, const std::string db_name); //构造函数用来初始化数据库和连接数据库
~CMyDB(); //析构函数用来做数据库的善后处理
bool executeSQL(const std::string sql_str); //对数据库进行SQL操作
private:
MYSQL *connection;
MYSQL_RES *res;
MYSQL_ROW row;
};
基本步骤说明:
- 使用mysql_init()初始化数据库
- 使用mysql_real_connect()连接数据库,连接后,相关的API函数才可使用
- 使用mysql_query()执行参数指定的SQL命令
- 使用mysql_fetch_row(),mysql_num_field()等行列操作函数打印出查询结果
- 使用mysql_close()关闭打开的连接
程序中用到的结构体:
- MYSQL
这个结构表示对一个数据库连接的句柄,它被用于几乎所有的MySQL函数。 - MYSQL_RES
这个结构代表返回行的一个查询的(SELECT, SHOW, DESCRIBE, EXPLAIN)的结果。从查询返回的信息在本章下文称为结果集合。 - MYSQL_ROW
这是一个行数据的类型安全的表示。当前它实现为一个计数字节的字符串数组。(如果字段值可能包含二进制数据,你不能将这些视为空终止串,因为这样的值可以在内部包含空字节) 行通过调用mysql_fetch_row()获得。
#include "mydb.h"
/*关闭初始化连接数据库变量*/
CMyDB::~CMyDB() {
if (connection != NULL) {
mysql_close (connection);
}
}
/*初始化数据库,数据库连接*/
CMyDB::CMyDB(const std::string server_host, const std::string user, const std::string passwd, const std::string db_name) {
connection = mysql_init(NULL);
if(connection == NULL) {
perror("mysql_init\n");
exit(1);
}
connection = mysql_real_connect(connection,server_host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 0, NULL, 0);
if (connection == NULL) {
perror("mysql_real_connect\n");
exit(1);
}
}
/*执行SQL指令*/
bool CMyDB::executeSQL(const std::string sql_str)
{
mysql_query(connection, "set names utf8");
mysql_query(connection, sql_str.c_str()); //执行命令sql_str
res = mysql_use_result(connection); //返回当前连接打开的执行结果,存入结果集res
if(res) {
row = mysql_fetch_row(res); //返回结果集的下一行信息
while (row != NULL) {
if(row <= 0) break;
for(int r=0; r<mysql_num_fields(res); r++) //返回一个结果集中列的数量
cout << row[r] << " ";
cout << endl;
row = mysql_fetch_row(res);
}
}
}
int main(int argc, char **argv)
{
std::string command;
CMyDB my("127.0.0.1", "root", "yunting13", "student");
cout << "mysql>" ;
getline(cin, command);
my.executeSQL(command);
return 0;
}
主要函数介绍
- MYSQL *mysql_init(MYSQL *mysql)
分配或初始化与mysql_real_connect()相适应的mysql对象。如无足够内存以分配新的对象,返回NULL。正确返回值:一个被初始化了的MYSQL *handle。
如果参数为NULL,该参数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。
注意
因为这个函数初始化对象后,要主动调用mysql_close()释放这个对象,所以如果参数为NULL,该函数分配的新对象如果在之后的程序中多次被释放容易引起系统奔溃,这里参数尽量不为空,不要让函数自己创建对象,而使用由自己管理的对象,并且传入地址让它完成初始化。
- mysql_real_connect()
此函数尝试与运行在主机上的MySQL数据库引擎建立连接。 此函数成功完成之后,才能使用mysql的其他函数。
函数原型:
MYSQL *mysql_real_connect(MYSQL *mysql, const cahr *host, const cahr *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)
参数解释:
mysql: 已有mysql结构的地址
host: 主机名或者地址
user:用户的MYSQL登陆ID
passwd:用户的密码
db:数据库的名称
port:如果port不是0,其值将用作TCP/IP连接的端口号
unix_socket:如果次参数不为空,该字符串描述了应使用的套接字或命名管道
client_flag:通常为0
- mysql_query(query, connection)
mysql_query()向connection指定的连接标识符关联的服务器中的当前活动的数据库发送一条查询。成功返回TRUE,出错返回FALSE。若没有指定,则使用上一个打开的连接。如果还没有打开的连接,本函数将尝试无参数调用mysql_connect()来建立一个连接并使用之。
注意
查询字符串不应该以分号结束
- MYSQL_RES* mysql_use_result(MYSQL* connection);
将当前打开的连接的执行结果存入结果集
- MYSQL_ROW mysql_fetch_row(MYSQL_RES* res)
逐行读取参数指定的结果集,每次读取一行
int mysql_num_fields(MYSQL_RES* res)
返回一个结果集中列的个数,所以上述三个函数基本可以得到结果集的行数和列数,输出SQL命令运行结果即可
mysql_close(MYSQL* connection)
关闭打开的服务器链接