目录

一、前言(下载地址)

二、代码

2.1 MysqlManager.h头文件

2.2 MysqlManager.cpp实现

2.2.1 包含头文件

2.2.2 Init初始化函数

2.2.3 RunSql增、删、改操作

2.2.4 SelectData查询select操作

2.2.5 FreeConnect释放MySQL连接与查询结果集合

2.3 main

一、前言(下载地址)

本文是在简单学习过SQL语句后,打算使用C++语言对Mysql数据库实现相同功能。因为在项目中数据库的建立,表的创建都是最开始就定好的,可以在MySQL中直接执行SQL语句建立,并且项目过程中很少会对表的结构再做修改,所以自己练习只是实现一些C++对MySQL的简单操作,熟悉在C++中对MySQL操作的流程和方法。后期加入网络通讯自动接收并存储进数据库中。

下载地址:

通过API函数对Mysql数据库实现增、删、改、查操作C++实现-C++文档类资源-CSDN下载

二、代码

2.1 MysqlManager.h头文件

#pragma once
#include<iostream>
using namespace std;
#include<mysql.h>
#include<iomanip>
class MysqlManager
{
public:
    bool Init(); // 初始化数据库连接
    void FreeConnect(); // 释放连接
    bool RunSql(const char* sql); // 执行对Mysql的增、删、改sql语句
    bool SelectData(const char* sql); // 查询select
    void PrintData(); // 打印结果集合,在QueryData()后使用

public:
    const char* m_host; // 主机地址
    const char* m_username; // 用户名
    const char* m_password; // 密码
    const char* m_database; // 连接的数据库名称database
    unsigned int m_port; // Mysql端口号,默认3306
    const char* m_unix_socket; // unix连接标识
    unsigned long m_clientflag; // 客户端连接标志

private:
    MYSQL* m_Mysql = new MYSQL(); // Mysql连接句柄
	MYSQL_RES* m_SelectResult; // 用于存储Mysql查询结果集合
};

2.2 MysqlManager.cpp实现

2.2.1 包含头文件

#include "MysqlManager.h"

2.2.2 Init初始化函数

  • 初始化过程中,先使用 mysql_init函数初始化MySQL句柄,之后通过mysql_real_connect函数输入ip,用户名,密码,数据库名称,端口号等进行连接。连接成功后,该MySQL句柄可以对设定的ip数据库进行操作。
bool MysqlManager::Init() {

	// Mysql初始化函数,返回Mysql句柄
	mysql_init(m_Mysql);

	// 连接Mysql数据库,检测是否连接成功,成功返回连接句柄,失败返回 NULL
	if (!mysql_real_connect(m_Mysql, m_host, m_username, m_password, 
		m_database, m_port, m_unix_socket, m_clientflag)) {
		return false;
	}

	// 连接成功
	return true;

}

MYSQL *mysql_init(MYSQL *mysql)

  • 这个函数用来分配或初始化一个MySQL对象,用于连接MySQL服务端。

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag)

  • 尝试与主机上的MySQL数据库引擎建立连接,成功返回MySQL句柄,失败返回NULL
  • mysql -- MySQL句柄指针                         host -- 连接主机ip地址
    user -- 用户名                                           passwd -- 用户登陆密码
    db -- 要连接的数据库                                port -- 端口号,MySQL默认为3306
    unix_socket -- 本地套接字 ,一般填NULL  client_flag -- 一般填0

2.2.3 RunSql增、删、改操作

  • 成功连接到MySQL数据库后就可以开始执行SQL语句,对数据库进行一些简单操作了,这里将增删改和查的函数分开,因为查询语句后要显示结果,所以分隔开。
bool MysqlManager::RunSql(const char* sql) {

	// mysql_query数据库操作函数,传入SQL语句执行。成功返回0
	if (mysql_query(m_Mysql, sql))
	{
		// 输出警告和错误信息给程序的使用者
		// cerr错误消息可以直接发送到显示器,而无需等到缓冲区或者新的换行符
		cerr << "Error: " << mysql_error(m_Mysql) << endl;
		return false;
	}
	else
	{
		cout << "Mysql数据库操作成功!" << endl;
	}

	return true;
}

int mysql_query(MYSQL *mysql, const char *query) 

  • 执行由“Null终结的字符串”表示的SQL语句。字符串必须包含1条SQL语句,并且不需要以分号结束。如果查询成功,返回0。如果出现错误,返回非0值。需要注意返回值,成功的时候是0而不是1.

cerr是 一个iostream对象,关联到标准错误,默认情况下,写到cerr的数据是不缓冲的,直接显示到屏幕,每个流插入到cerr都会被立即输出。

2.2.4 SelectData查询select操作

  • 执行查询SQL语句和 增、删、改操作区别就在于查询后的输出结果部分,在拿到结果后,对结果的格式输出。
bool MysqlManager::SelectData(const char* sql) {
	if (mysql_query(m_Mysql, sql))
	{
		// 输出警告和错误信息给程序的使用者
		// cerr错误消息可以直接发送到显示器,而无需等到缓冲区或者新的换行符
		cerr << "Error: " << mysql_error(m_Mysql) << endl;
		return false;
	}
	else
	{
		cout << sql << "查询结果如下:" << endl;
	}

	// 获得结果集
	m_SelectResult = mysql_store_result(m_Mysql);

	// 显示输出
	this->PrintData();
	return true;
}

void MysqlManager::PrintData() {
	// 如果mysql_fetch_row(m_SelectResult)为空表示没有查询结果
	if (mysql_fetch_row(m_SelectResult) == NULL)
	{
		cout << "Empty set." << endl;
		return;
	}

	// 首先打印表头字段名
	MYSQL_FIELD* field = nullptr; // 定义字段列数组
	int len = 12; // 定义输出格式最大宽大,不够用空格补齐
	// mysql_fetch_field每次返回下一个字段名
	while (field = mysql_fetch_field(m_SelectResult)) {

		cout << setw(len) << field->name; // 设置输出格式
	}
	cout << endl;

	// 打印字段值,表信息
	int num_field = mysql_num_fields(m_SelectResult); // 获取列数
	MYSQL_ROW row;
	// mysql_fetch_row每次取出一行信息并打印
	while (row = mysql_fetch_row(m_SelectResult))
	{
		for (int i = 0; i < num_field; ++i)
		{
			if (row[i] == NULL) {
				cout << setw(len) << "NULL";
			}
			else {
				cout << setw(len) << row[i];
			}
		}
		cout << endl;
	}
}

MYSQL_RES *mysql_store_result(MYSQL *mysql) 

  • 对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result()返回结果集合。mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)

  • 查询结果集中的列字段信息,也就是表头的相关信息。每次返回一个列的字段信息,每调用一次mysql_fetch_field,会向后移动一个字段。当重新使用查询是,会重新回到第一个字段信息。当指向最后一列后,再次调用返回为NULL。

cout << setw(len)

  • 用于调整输出格式,将每列对齐,len表示最大长度,不够时将用空格补齐

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

  • 检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。用于查询结果集中的字段值。与前面使用的mysql_fetch_field对应,一个查看字段名信息(表头),一个查看具体字段值。也是每调用一个会返回新的一行的数据。

2.2.5 FreeConnect释放MySQL连接与查询结果集合

  • 释放MySQL连接时,需要对查询的数据和MySQL句柄一起释放,释放空间和连接。 
void MysqlManager::FreeConnect() {

	// 释放存储的查询结果集合
	mysql_free_result(m_SelectResult);

	// 释放Mysql连接资源
	mysql_close(m_Mysql);
}

void mysql_free_result(MYSQL_RES  *result)

  • 释放结果集。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。释放完成后,不要尝试访问结果集。

void mysql_close(MYSQL *sock)

  • 关闭前面打开的连接。如果句柄是由mysql_init()或mysql_connect()自动分配的,mysql_close()还将解除分配由mysql指向的连接句柄。

2.3 main

#include<iostream>
using namespace std;
#include"MysqlManager.h"

int main() {
	MysqlManager Mysql; // 初始化一个Mysql管理类对象
	Mysql.m_host = "localhost"; // 主机地址
	Mysql.m_username = "root"; // 用户名
	Mysql.m_password = "123456"; // 密码
	Mysql.m_database = "test"; // 连接的数据库名称database
	Mysql.m_port = 3306; // Mysql端口号,默认3306
	Mysql.m_unix_socket = NULL; // unix连接标识
	Mysql.m_clientflag = 0; // 客户端连接标志

	// mysql连接
	if (!Mysql.Init())
	{
		return -1;
	}

	// 增、删、改模板
	// const char* sql1 = "此处填入 增、删、改SQL语句,不需要分号结尾";
	// Mysql.RunSql(sql1);

	 // 查询数据测试
	 //const char* sql4 = "此处查询的SQL语句,不需要分号结尾";
	 //Mysql.SelectData(sql4);

	// 释放mysql资源
	Mysql.FreeConnect();

	return 0;
}

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐