Linux(C++)连接MySQL数据库

一、 环境安装

首先是MySQL的安装,直接只用apt-get命令安装(这里推荐使用这种方式安装,因为此方式在后面程序编译时,不需要自己链接相关路径)

sudo apt-get install mysql-server

本人安装后,相关头文件以及动态库在如下目录中:

// 头文件
/usr/include/mysql/ 
// 动态库
/usr/lib/x86_64-linux-gnu/

最后,保证MySQL服务在运行状态,相关命令如下:

// 启动MySQL
service mysqld start 
// 停止MySQL
service mysqld stop 
// 重启MySQL
service mysqld restart
// 查看MySQL运行状态
systemctl status mysql.service

二、 配置

第一次安装MySQL后,是如法直接用root用户登录的,会报错Access denied for user ‘root’@‘localhost’。此时,我们先查看MySQL配置文件,获取默认用户名和密码:

// 命令
sudo cat /etc/mysql/debian.cnf
// 配置文件内容
[client]
host     = localhost
user     = debian-sys-maint
password = ***(这里我隐藏了,是一串英文和数字)
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host     = localhost
user     = debian-sys-maint
password = ***(这里我隐藏了,是一串英文和数字)
socket   = /var/run/mysqld/mysqld.sock

我们直接使用配置文件中提供的用户名debian-sys-maint和密码,登录MySQL

$ mysql -udebian-sys-maint -p
Enter password: (这里输入配置文件中的密码)

进入MySQL后,配置root账户的密码

mysql> update user set password=password('密码') where user='root' and host='localhost'
mysql> flush privileges; //这一步不要忘记,让MySQL重新加载权限数据

此时,退出MySQL,我们就可以用root账户和设置的密码正常进入MySQL了。

三、 头文件

#include<mysql/mysql.h>

四、 函数

1. 分配或初始化MYSQL对象

MYSQL *mysql_init(MYSQL *mysql)

参数: mysql mysql的实例
待初始化的MYSQ对象,将对象地址传入,NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。

MYSQL mysql;
mysql_init(&mysql); 
// 或者
MYSQL mysql = mysql_init(NULL);

2. 连接一个mysql服务器

MYSQL *mysql_real_connect (MYSQL *mysql,
							const char*host,
							const char*user,
							const char*passwd,
							const char*db,
							unsigned intport,
							const char*unix_socket,
							unsigned long client_flag)

参数:mysql 前面一个函数的返回的mysql实例句柄。
host 要连接的数据库的主机,可以是ip地址或主机名。
user 表示登录数据库的用户名。
passwd 登录的密码。
db 就是访问的数据库。
port mysql的tcp/ip端口默认是3306。
unix_socket 表示连接类型。
client_flag 暂时为0即可。
如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同

if(mysql_real_connect(&mysql,"localhost","root","dxm242012","Student",0,NULL,0) == NULL){
    
    
	cout << "connect fial\n";
	return-1;
}

3. 执行指定查询语句字符串的SQL查询

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

参数: mysql mysql的实例。query 查询语句字符串
返回值: 成功返回0,失败返回非0
返回一个结果表,假定查询成功,可以调用 mysql_num_rows() 来查看对应于 SELECT 语句返回了多少行,或者调用mysql_affected_rows() 来查看对应于 DELETE,INSERT,REPLACE 或 UPDATE 语句影响到了多少行。

string sql = ”查询语句”;
mysql_query(&mysql,sql.c_str());

4. 获取最后一次查询语句字符串的SQL查询的结果集

MYSQL_RES *mysql_store_result(MYSQL *mysql)

检索完整的结果集至客户端。客户端处理结果集最常用的方式是通过调用mysql_store_result(),一次性地检索整个结果集。该函数能从服务器获得查询返回的所有行,并将它们保存在客户端。
对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result() 。
对于其他查询,不需要调用mysql_store_result()或mysql_use_result(),
但是如果在任何情况下均调用了mysql_store_result(),它也不会导致任何伤害或性能降低。
参数: mysql mysql的实例。query 查询语句字符串
返回值:成功返回MYSQL_RES结构体,该结构体中保存查询的结果

string sql = ”查询语句”;
mysql_query(&mysql,sql.c_str());
MYSQL_RES * result = mysql_store_result(&mysql);
if(result == NULL)
	cout << "fail\n";

5. 返回结果集中的行数

int mysql_num_rows(MYSQL_RES* result)

参数: result 结果集

6. 返回结果集中的列数

int mysql_num_fields(MYSQL_RES* result)

参数: result 结果集

7. 获取下一个列的类型

MYSQL_FIELD* mysql_fetch_field(MYSQL_RES *result);
参数: result 结果集
获取下一个列的类型,结束返回NULL。

do{
    
    
	MYSQL_FIELD* field = mysql_fetch_field (result);
	cout << field->name << "\t\t";
}while(row != NULL);

8. 从结果集中获取下一行

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

参数: result 结果集
成功返回一个数组,值大于0。

do{
    
    
	MYSQL_ROW row = mysql_fetch_row(result);
	for(inti=0; i<mysql_num_fields(result); i++){
    
    
		cout << row[i] << "\t\t";
	}
	cout << endl;
}while(row != NULL);

9. 获取对应列的类型

MYSQL_FIELD* mysql_fetch_field_direct(MYSQL_RES *result, int i);

给定列编号,返回列的类型,结束返回NULL。

for(int i=0; i<mysql_num_fields(result); i++){
    
    
	MYSQL_FIELD* field =  field = mysql_fetch_field_direct(result,i);
	cout << field->name << "\t\t";
}

10. 关闭MYSQL

MYSQL *mysql_close(MYSQL *mysql)

参数: mysql mysql的实例

五、C++封装MyDB类

后来又把这些函数简单的封装了一下,方便以后直接用。

class MyDB {
    
    

public:
	MyDB();
	~MyDB();
	bool InitDB(string host,string user,string pwd,string dbname);
	bool ExeSQL(string sql);
private:
	MYSQL* mysql;
	MYSQL_ROW row;
	MYSQL_RES* result;
	MYSQL_FIELD* field;
};

MyDB::MyDB() {
    
    
	mysql = mysql_init(NULL);
	if(mysql == NULL) {
    
    
		cout << "Error: "<< mysql_error(mysql);
		exit(-1);
	}
}

MyDB::~MyDB() {
    
    
	if(!mysql) {
    
    
		mysql_close(mysql);
	}
}

bool MyDB::InitDB(string host,string user,string pwd,string dbname) {
    
    
	/*连接数据库*/
	if(!mysql_real_connect(mysql,host.c_str(),user.c_str(),pwd.c_str(),dbname.c_str(),0,NULL,0)) {
    
    
		cout << "connect fial: "<< mysql_error(mysql);
		exit(-1);
	}
	return true;
}

bool MyDB::ExeSQL(string sql) {
    
    
	/*执行失败*/
	if(mysql_query(mysql,sql.c_str())) {
    
    
		cout << "query fail: "<< mysql_error(mysql);
		exit(1);
	}

	else {
    
    
		/*获取结果集*/
		result = mysql_store_result(mysql);

		int fieldnum = mysql_num_fields(result);
		for(int i=0; i<fieldnum; i++) {
    
    
			row = mysql_fetch_row(result);
			if(row <= 0)
				break;
			for(int j=0; j<fieldnum; j++) {
    
    
				cout << row[j] << "\t\t";

			}
			cout << endl;

		}
		mysql_free_result(result);
	}
	return true;
}

猜你喜欢

转载自blog.csdn.net/ymxyld/article/details/124871381
今日推荐