MySQL API的介绍与封装

71 阅读4分钟

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;
    }
};