安装Mysql
首先到官网下载MySQL,由于我们使用的是CentOS7, 所以这里选择红帽的 8.0.29 版本。
使用 XFtp 工具将一下 7 个包传至 CentOS 的 /opt 目录下,
使用 rpm -ivh 命令按照以下顺序依次安装:
- mysql-community-common-8.0.29-1.el7.x86_64.rpm
- mysql-community-client-plugins-8.0.29-1.el7.x86_64.rpm
- mysql-community-libs-8.0.29-1.el7.x86_64.rpm
- mysql-community-client-8.0.29-1.el7.x86_64.rpm
- mysql-community-icu-data-files-8.0.29-1.el7.x86_64.rpm
- mysql-community-server-8.0.29-1.el7.x86_64.rpm
- mysql-community-devel-8.0.29-1.el7.x86_64.rpm
其中安装第三个包的报错解决方法:yum remove mariadb-libs,安装最后一个包报错的解决方案:yum install openssl-devel
安装完毕之后使用初始密码(mysqld.log里面)登录,修改密码就可以正常使用了。
创建一个临时的数据库以及表以供测试
为了测试 cpp 代码,我们创建 test 数据库:Create database test;
再创建临时的 user 表:
编写Cpp Code
C++操纵数据库时几个常用的函数api如下,所需参数见代码段中:
函数 | 解释 |
mysql_init() | 初始化数据库句柄 |
mysql_options() | 设置额外的连接选项,如设置字符编码 |
mysql_real_connect() | 连接数据库 |
mysql_select_db() | 选择数据库 |
mysql_real_query() | 执行sql语句 |
mysql_store_result() | 获取查询结果集 |
mysql_fetch_row() | 获取查询到的每一行数据 |
mysql_free_result() | 释放结果集 |
mysql_close() | 关闭数据库 |
mysql_error() | 获取数据库当前操作失败的原因 |
操纵数据库所用到的变量类型:
类型 | 解释 |
MYSQL | 数据库句柄 |
MYSQL_RES | 查询结果集 |
MYSQL_ROW | 记录结果集结构体 |
完成代码如下,已做注释:
#include <iostream>
#include <string.h>
#include <mysql/mysql.h>
#define SQL_MAX 256
using namespace std;
// 连接数据库 与 选择数据库
bool connectDB(MYSQL& mysql) {
// 初始化数据库句柄
mysql_init(&mysql);
// 设置字符编码
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "utf8");
// 连接数据库
MYSQL* ret = mysql_real_connect(&mysql, "localhost", "root", "yetao1996", "test", 3306, NULL, 0);
if (ret == NULL) {
cout << "数据库连接失败!失败原因:" << mysql_error(&mysql) << endl;
return false;
} else cout << "数据库连接成功!" << endl;
// 选择数据库,成功返回0, 失败返回非0
int res = mysql_select_db(&mysql, "test");
if (res) {
cout << "数据库选择失败!失败原因:" << mysql_error(&mysql) << endl;
return false;
} else cout << "数据库选择成功!" << endl;
return true;
}
// 插入表数据
bool addTableData(int id, const char* user_name, const char* user_password) {
MYSQL mysql; // 数据库句柄
char sql[SQL_MAX]; // 存储语句
// 连接数据库
if (!connectDB(mysql)) return false;
// c语言字符串组合
snprintf(sql, SQL_MAX, "INSERT INTO user VALUES (%d, '%s', '%s');", id, user_name, user_password);
cout << "插入 sql 语句:" << sql << endl;
int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
cout << "执行插入语句,插入返回结果:" << ret << endl;
if (ret) {
cout << "插入表数据失败!失败原因:" << mysql_error(&mysql) << endl;
return false;
}
cout << "插入数据成功!" << endl;
mysql_close(&mysql);
return true;
}
//删除表数据
bool delTableData(int id) {
MYSQL mysql; // 数据库句柄
char sql[SQL_MAX]; // 存储sql语句
//连接数据库
if (!connectDB(mysql)) return false;
// c语言字符串组合
snprintf(sql, SQL_MAX, "DELETE FROM user where id = %d;", id);
cout << "删除 sql 语句:" << sql << endl;
// 执行sql,成功返回0
int ret = mysql_real_query(&mysql, sql, (unsigned)strlen(sql));
cout << "执行删除语句,插入返回结果:" << ret << endl;
if (ret) {
cout << "删除表数据失败!失败原因:" << mysql_error << endl;
return false;
}
cout << "删除表数据成功!" << endl;
mysql_close(&mysql);
return true;
}
// 修改表数据
bool alterTableData(int id, const char* password) {
MYSQL mysql; // 数据库句柄
char sql[SQL_MAX]; // sql语句
// 连接数据库
if (!connectDB(mysql)) return false;
// c语言组合字符串
snprintf(sql, SQL_MAX, "UPDATE user SET user_password = '%s' WHERE id = %d;", password, id);
cout << "修改 sql 语句:" << sql << endl;
// 执行sql语句,成功返回0
int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
cout << "执行修改语句,修改返回结果:" << ret << endl;
if (ret) {
cout << "数据修改失败!失败原因:" << mysql_error(&mysql) << endl;
return false;
}
cout << "修改表数据成功!" << endl;
mysql_close(&mysql);
return true;
}
// 查询表数据
bool queryTableData() {
MYSQL mysql; // 数据库句柄
MYSQL_RES* res; // 查询结果集
MYSQL_ROW row; // 记录结构体
char sql[SQL_MAX]; // SQL语句
// 连接数据库
if (!connectDB(mysql)) return false;
// C语言组合字符串
snprintf(sql, SQL_MAX, "SELECT id, user_name, user_password FROM user;");
cout << "查询 sql 语句:" << sql << endl;
int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
cout << "执行查询语句,查询返回结果:" << ret << endl;
if (ret) {
cout << "数据查询失败!失败原因:" << mysql_error(&mysql) << endl;
return false;
}
cout << "数据查询成功!" << endl;
// 获取结果集
res = mysql_store_result(&mysql);
while (row = mysql_fetch_row(res)) {
cout << "用户id:" << atoi(row[0]) << "\t"; // 转换为int类型,打印id
cout << "用户姓名:" << row[1] << "\t"; // 打印用户姓名
cout << "用户密码:" << row[2] << endl; // 打印用户密码
}
mysql_free_result(res);
mysql_close(&mysql);
return true;
}
int main() {
// addTableData(2, "zhuangqian", "66666666");
// delTableData(2);
// alterTableData(1, "88888888");
queryTableData();
return 0;
}
编译运行
很重要的一步是编写 makefile, 如下所示:
target=test
libs=test.cpp
$(target):$(libs)
@$(CXX) -std=c++11 -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient $^ -o $@
这里 -L 的地址可能有差别, 可是使用 mysql_config 指令查看,如果不加-I 或者 -L 的话,make 的时候可能找不到相应的库,或者链接的时候出问题!!!
make 一下生成 test 可执行文件, 运行验证结果:
[root@localhost test]# make
[root@localhost test]# ls
makefile test test.cpp
[root@localhost test]# ./test