MySQL API
MySQL API介绍
• MySQL 是 C/S 模式, C API 其实就是⼀个 MySQL 客⼾端,提供⼀种⽤ C 语⾔代码操作数据库的流程
• 课堂上同学们已经学习了 MySQL 数据库的学习,在这⾥我们主要介绍⼀下 MySQL 的 C API 接口
// Mysql操作句柄初始化
// 参数说明:
// mysql为空则动态申请句柄空间进⾏初始化
// 返回值: 成功返回句柄指针, 失败返回NULL
MYSQL *mysql_init(MYSQL *mysql);
// 连接mysql服务器
// 参数说明:
// mysql--初始化完成的句柄
// host---连接的mysql服务器的地址
// user---连接的服务器的⽤⼾名
// passwd-连接的服务器的密码
// db ----默认选择的数据库名称
// port---连接的服务器的端⼝: 默认0是3306端⼝
// unix_socket---通信管道⽂件或者socket⽂件,通常置NULL
// client_flag---客⼾端标志位,通常置0
// 返回值:成功返回句柄指针,失败返回NULL
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 client_flag);
// 设置当前客⼾端的字符集
// 参数说明:
// mysql--初始化完成的句柄
// csname--字符集名称,通常:"utf8"
// 返回值:成功返回0, 失败返回⾮0
int mysql_set_character_set(MYSQL *mysql, const char *csname)
// 选择操作的数据库
// 参数说明:
// mysql--初始化完成的句柄
// db-----要切换选择的数据库名称
// 返回值:成功返回0, 失败返回⾮0
int mysql_select_db(MYSQL *mysql, const char *db)
// 执⾏sql语句
// 参数说明:
// mysql--初始化完成的句柄
// stmt_str--要执⾏的sql语句
// 返回值:成功返回0, 失败返回⾮0
int mysql_query(MYSQL *mysql, const char *stmt_str)
// 保存查询结果到本地
// 参数说明:
// mysql--初始化完成的句柄
// 返回值:成功返回结果集的指针, 失败返回NULL
MYSQL_RES *mysql_store_result(MYSQL *mysql)
// 获取结果集中的⾏数
// 参数说明:
// result--保存到本地的结果集地址
// 返回值:结果集中数据的条数
uint64_t mysql_num_rows(MYSQL_RES *result);
// 获取结果集中的列数
// 参数说明:
// result--保存到本地的结果集地址
// 返回值:结果集中每⼀条数据的列数
unsigned int mysql_num_fields(MYSQL_RES *result)
// 遍历结果集, 并且这个接⼝会保存当前读取结果位置,每次获取的都是下⼀条数据
// 参数说明:
// result--保存到本地的结果集地址
// 返回值:实际上是⼀个char **的指针,将每⼀条数据做成了字符串指针数组
// row[0]-第0列 row[1]-第1列 ...
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
// 释放结果集
// 参数说明:
// result--保存到本地的结果集地址
void mysql_free_result(MYSQL_RES *result)
// 关闭数据库客⼾端连接,销毁句柄
// 参数说明:
// mysql--初始化完成的句柄
void mysql_close(MYSQL *mysql)
// 获取mysql接⼝执⾏错误原因
// 参数说明:
// mysql--初始化完成的句柄
const char *mysql_error(MYSQL *mysql)
MySQL API使用
下⾯我们使⽤ C API 来实现 MySQL 的增删改查操作
• 创建测试数据库
create database if not exists test_db;
use test_db;
create table stu(
id int primary key auto_increment, -- 学⽣id
age int, -- 学⽣年龄
name varchar(32) -- 学⽣姓名
);
• 连接MySQL服务, 进⼊shell并执⾏sql语句
[zsc@node test_mysql]$ mysql -uroot -p123456
MariaDB [(none)]> create database if not exists test_db;
Query OK, 1 row affected (0.01 sec)
MariaDB [(none)]> use test_db;
Database changed
MariaDB [test_db]> create table stu(
-> id int primary key auto_increment, -- 学⽣id
-> age int, -- 学⽣年龄
-> name varchar(32) -- 学⽣姓名
-> );
Query OK, 0 rows affected (0.02 sec)
• 实现增删改查操作
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <mysql/mysql.h>
#define HOST "127.0.0.1"
#define USER "root"
#define PASSWD "123456"
#define DBNAME "test_db"
void add(MYSQL *mysql) {
char *sql = "insert into stu values(null, 18, '张三'), (null, 17, '李四');";
int ret = mysql_query(mysql, sql);
if (ret != 0) {
printf("mysql query error:%s\n", mysql_error(mysql));
return;
}
return;
}
void del(MYSQL *mysql) {
char *sql = "delete from stu where name='张三';";
int ret = mysql_query(mysql, sql);
if (ret != 0) {
printf("mysql query error:%s\n", mysql_error(mysql));
return;
}
return;
}
void mod(MYSQL *mysql) {
char *sql = "update stu set age=15 where name='张三';";
int ret = mysql_query(mysql, sql);
if (ret != 0) {
printf("mysql query error:%s\n", mysql_error(mysql));
return;
}
return;
}
void get(MYSQL *mysql) {
char *sql = "select * from stu;";
int ret = mysql_query(mysql, sql);
if (ret != 0) {
printf("mysql query error:%s\n", mysql_error(mysql));
return ;
}
MYSQL_RES *res = mysql_store_result(mysql);
if (res == NULL) {
printf("mysql store result error:%s\n", mysql_error(mysql));
return ;
}
int row = mysql_num_rows(res);
int col = mysql_num_fields(res);
printf("%10s%10s%10s\n", "ID", "年龄", "姓名");
for (int i = 0; i < row; i++) {
MYSQL_ROW row_data = mysql_fetch_row(res);
for (int i = 0; i < col; i++) {
printf("%10s", row_data[i]);
}
printf("\n");
}
mysql_free_result(res);
return ;
}
int main()
{
MYSQL *mysql = mysql_init(NULL);
if (mysql == NULL) {
printf("init mysql handle failed!\n");
return -1;
}
if (mysql_real_connect(mysql, HOST, USER, PASSWD, DBNAME, 0, NULL, 0) == NULL) {
printf("mysql connect error:%s\n", mysql_error(mysql));
return -1;
}
mysql_set_character_set(mysql, "utf8");
printf("===================== add =========================\n");
add(mysql);
get(mysql);
printf("===================== mod =========================\n");
mod(mysql);
get(mysql);
printf("===================== del =========================\n");
del(mysql);
get(mysql);
mysql_close(mysql);
return 0;
}
• 验证结果
[zsc@node test_mysql]$ g++ test_mysql.cpp -o test_mysql -L/usr/lib64/mysql -lmysqlclient
[zsc@node test_mysql]$ ./test_mysql
===================== add =========================
ID 年龄 姓名
11 18 张三
12 17 李四
===================== mod =========================
ID 年龄 姓名
15 张三
12 17 李四
===================== del =========================
ID 年龄 姓名
12 17 李四
封装MySQL⼯具类
class mysql_util
{
public:
// 创建mysql连接
static MYSQL *mysql_create(const std::string &host,
const std::string &user,
const std::string &pass,
const std::string &name,
uint16_t port)
{
// 初始化mysql句柄
MYSQL *mysql = mysql_init(nullptr);
if (mysql == nullptr) {
std::cout << "Init mysql instance failed!" << std::endl;
return nullptr;
}
// 连接mysql服务
if (mysql_real_connect(mysql, host.c_str(), user.c_str(), pass.c_str(), name.c_str(), port, nullptr, 0) == nullptr) {
std::cout << "Connect mysql server failed!" << std::endl;
std::cout << mysql_error(mysql) << std::endl;
mysql_close(mysql);
return nullptr;
}
// 设置字符集为utf-8
mysql_set_character_set(mysql, "utf8");
return mysql;
}
// 关闭mysql连接
static void mysql_destroy(MYSQL *mysql)
{
if (mysql != nullptr) {
mysql_close(mysql);
}
return;
}
// 执⾏sql语句
static bool mysql_exec(MYSQL *mysql, const std::string &sql)
{
int ret = mysql_query(mysql, sql.c_str());
if (ret != 0) {
std::cout << sql << std::endl;
std::cout << mysql_error(mysql) << std::endl;
return false;
}
return true;
}
};