目录
一、准备工作
二、数据表操作
(一)初始化数据库
(二)连接数据库
(三)设置字符集
(四)操作数据表
1、插入数据
2、删除数据
3、更新数据
4、查询数据
一、准备工作
在之前的文章中都是利用 MySQL 客户端以下令行的形式举行数据库操作,但在现实开发中是以语言级别的形式对数据库举行操作。
首先需要创建一个用户以供操作,用户管理详见:【MySQL】视图与用户管理-CSDN博客
其次还需要准备一个测试表:
- mysql> create table person(
- -> id int primary key auto_increment,
- -> name varchar(20) not null,
- -> age int not null,
- -> telephone varchar(20) unique);
- Query OK, 0 rows affected (0.02 sec)
- mysql> insert into person values(1,'张三',18,'123456'), (2,'李四',20,'123789');
- Query OK, 2 rows affected (0.01 sec)
- Records: 2 Duplicates: 0 Warnings: 0
- mysql> select * from person;
- +----+--------+-----+-----------+
- | id | name | age | telephone |
- +----+--------+-----+-----------+
- | 1 | 张三 | 18 | 123456 |
- | 2 | 李四 | 20 | 123789 |
- +----+--------+-----+-----------+
- 2 rows in set (0.00 sec)
复制代码 接下来需要配置环境,只要正常下载了 MySQL,它会自动把相关的库也会给配置好,在利用时需要配置好项目标环境以及包含好相应的头文件即可。以下是用于验证代码环境是否配置成功:
- # 下载并安装 MySQL 仓库配置
- sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm
- # 更新仓库缓存
- sudo dnf update
- # 安装 MySQL 开发包(包含头文件和链接库)
- sudo dnf install mysql-devel
- # 若GBK报错
- sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
- sudo dnf clean all
- # 若无效
- sudo dnf install mysql-community-devel --nogpgcheck
- # 查看头文件路径(关键用于 C 编译)
- ls /usr/include/mysql //若输出包含 mysql.h 等头文件,则安装成功
复制代码 当配置优劣境以后,我们就可以利用 MySQL 提供的 API 举行编程了。
- #include <iostream>
- #include <mysql.h>
- using namespace std;
- int main()
- {
- printf("mysql client Version: %s\n", mysql_get_client_info());
- return 0;
- }
复制代码 在编译连接时需要指明 MySQL 头文件以及库文件,以下是makefile文件:
- mysql:mysql.cpp
- g++ -o $@ $^ -std=c++11 -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient
- .PHONY:clean
- clean:
- rm -rf mysql
复制代码 二、数据表操作
(一)初始化数据库
- //初始化数据库
- MYSQL *mysql_init(MYSQL *mysql);
复制代码 作用:初始化数据库,连接数据库前的必要条件;
参数:若传入NULL,则会新建并初始化一个MySQL对象;
若传入已有的MySQL指针,则会重置该指向的对象;
返回值:成功返回初始化后的对象,失败返回NULL。
(二)连接数据库
想对数据库举行操作,必须先举行初始化,之后再需要连接数据库。
- //连接数据库
- MYSQL *mysql_real_connect(
- MYSQL *mysql, // 已初始化的 MYSQL 结构体指针
- const char *host, // 服务器主机名或 IP 地址
- const char *user, // 登录用户名
- const char *passwd, // 登录密码
- const char *db, // 默认数据库名
- unsigned int port, // TCP/IP 端口号(0 表示默认 3306)
- const char *unix_socket,// Unix 套接字路径(NULL 表示不使用)
- unsigned long client_flag //客户端标志位(通常为 0)
- );
复制代码 作用:连接数据库;
参数:各个字段意义已在代码中解释;
返回值:成功返回传入的 MySQL 指针,失败返回NULL。
案例:
- #include <iostream>
- #include <string>
- #include <mysql.h>
- using namespace std;
- const string host = "127.0.0.1";
- const string user = "X";
- const string passwd = "Mht1412.";
- const string db_name = "test";
- int main()
- {
- MYSQL *mysql = mysql_init(nullptr);
- if (!mysql)
- {
- cerr << "初始化失败" << endl;
- return 1;
- }
- if (!mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 3306, nullptr, 0))
- {
- cerr << "数据库连接失败" << endl;
- return 2;
- }
- cout << "数据库连接成功" << endl;
- mysql_close(mysql); // 关闭MySQL
- return 0;
- }
复制代码 (三)设置字符集
连接数据库成功后,已经可以正常对表举行操作,但是获取中文会是乱码。这是因为原始默认的字符集时 latin1, 需要设置为 utf8。
- //设置字符集
- mysql_set_character_set(myfd, "utf8");
复制代码 (四)操作数据表
对数据表举行操作利用的是同一个接口,只是传入差别的参数从而到达差别的效果:
- int mysql_query(MYSQL *mysql, const char *q);
复制代码 作用:操作数据表;
参数:指针mysql 为初始化生成的mysql指针,也就是数据库句柄;
q 为传入的 MySQL 语句。
返回值:成功返回0,失败返回非0。
1、插入数据
- #include <iostream>
- #include <string>
- #include <mysql.h>
- using namespace std;
- const string host = "127.0.0.1";
- const string user = "X";
- const string passwd = "Mht1412.";
- const string db_name = "test";
- int main()
- {
- MYSQL *mysql = mysql_init(nullptr);
- if (!mysql)
- {
- cerr << "初始化失败" << endl;
- return 1;
- }
- if (!mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 3306, nullptr, 0))
- {
- cerr << "数据库连接失败" << endl;
- return 2;
- }
- cout << "数据库连接成功" << endl;
- string sql = "insert into person values (3, '王五', 19, 456789)";
- if (mysql_query(mysql, sql.c_str()))
- {
- cerr << "数据库操作失败" << endl;
- return 3;
- }
- cout << "数据库操作成功" << endl;
- mysql_close(mysql); // 关闭MySQL
- return 0;
- }
复制代码 运行效果:
2、删除数据
- #include <iostream>
- #include <string>
- #include <mysql.h>
- using namespace std;
- const string host = "127.0.0.1";
- const string user = "X";
- const string passwd = "Mht1412.";
- const string db_name = "test";
- int main()
- {
- MYSQL *mysql = mysql_init(nullptr);
- if (!mysql)
- {
- cerr << "初始化失败" << endl;
- return 1;
- }
- if (!mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 3306, nullptr, 0))
- {
- cerr << "数据库连接失败" << endl;
- return 2;
- }
- cout << "数据库连接成功" << endl;
- string sql = "delete from person where id = 3";
- if (mysql_query(mysql, sql.c_str()))
- {
- cerr << "数据库操作失败" << endl;
- return 3;
- }
- cout << "数据库操作成功" << endl;
- mysql_close(mysql); // 关闭MySQL
- return 0;
- }
复制代码 运行效果:
3、更新数据
- #include <iostream>
- #include <string>
- #include <mysql.h>
- using namespace std;
- const string host = "127.0.0.1";
- const string user = "X";
- const string passwd = "Mht1412.";
- const string db_name = "test";
- int main()
- {
- MYSQL *mysql = mysql_init(nullptr);
- if (!mysql)
- {
- cerr << "初始化失败" << endl;
- return 1;
- }
- if (!mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 3306, nullptr, 0))
- {
- cerr << "数据库连接失败" << endl;
- return 2;
- }
- cout << "数据库连接成功" << endl;
- string sql = "update person set name='王五' where name='张三'";
- if (mysql_query(mysql, sql.c_str()))
- {
- cerr << "数据库操作失败" << endl;
- return 3;
- }
- cout << "数据库操作成功" << endl;
- mysql_close(mysql); // 关闭MySQL
- return 0;
- }
复制代码 运行效果:
4、查询数据
差别于插入、删除与更新操作,查询数据实行成功后是需要显示数据的,因此需要获取查询效果。
- //获取查询结果
- MYSQL_RES *mysql_store_result(MYSQL *mysql);
- //获取查询结果列名
- MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);、
- //获取查询结果行数
- unsigned int mysql_num_rows(MYSQL_RES *res);
- //获取查询结果列数
- unsigned int mysql_num_fields(MYSQL_RES *res);
- //获取结果内容
- MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
- //释放存储结果
- void mysql_free_result((MYSQL_RES *result);
复制代码 其中 MYSQL_RES 布局体在利用层面上可以简朴理解为二维数组, MYSQL_ROW 是记载数据表中一行的数据,可以简朴理解为迭代器在整个返回的数据内容中举行遍历。
- #include <iostream>
- #include <string>
- #include <mysql.h>
- using namespace std;
- const string host = "127.0.0.1";
- const string user = "X";
- const string passwd = "Mht1412.";
- const string db_name = "test";
- int main()
- {
- MYSQL *mysql = mysql_init(nullptr);
- if (!mysql)
- {
- cerr << "初始化失败" << endl;
- return 1;
- }
- if (!mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 3306, nullptr, 0))
- {
- cerr << "数据库连接失败" << endl;
- return 2;
- }
- cout << "数据库连接成功" << endl;
- string sql = "select * from person";
- if (mysql_query(mysql, sql.c_str()))
- {
- cerr << "数据库操作失败" << endl;
- return 3;
- }
- cout << "数据库操作成功" << endl;
- // 获取查询结果
- MYSQL_RES *res = mysql_store_result(mysql);
- // 获取查询结果行列数
- unsigned int rows = mysql_num_rows(res);
- unsigned int fields = mysql_num_fields(res);
- // 获取查询结果列名
- MYSQL_FIELD *fifld = mysql_fetch_fields(res);
- for (int i = 0; i < fields; ++i)
- {
- cout << fifld[i].name << "\t";
- }
- cout << endl;
- for (int i = 0; i < rows; ++i)
- {
- // 依次获取查询结果中行信息
- MYSQL_ROW row = mysql_fetch_row(res);
- for (int j = 0; j < fields; ++j)
- {
- cout << row[j] << "\t";
- }
- cout << endl;
- }
- // 释放查询结果
- mysql_free_result(res);
- mysql_close(mysql); // 关闭MySQL
- return 0;
- }
复制代码 运行效果:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
|