目錄
使用 yum 配置 mysqld 環境
查看 mysqld 服務的版本
創建 mysql 句柄?
鏈接數據庫?
使用數據庫?
增加數據?
修改數據
?查詢數據
?獲取查詢結果的行數
?獲取查詢結果的列數?
獲取查詢結果的列名?
獲取查詢結果所有數據
斷開鏈接?
C語言訪問mysql數據庫整體源碼
????????通過前段時間的 mysql 數據庫的學習,我們知道了 mysql 數據庫本質上就是一個網絡服務,本期的主要內容在于講解如何使用 C 語言相關的接口連接 mysqld 網絡服務。
使用 yum 配置 mysqld 環境
? ? ? ? centos7 版本的操作系統使用一下指令安裝 mysqld 服務的配置文件。
sudo yum install mysql-devel
? ? ? ? 配置好之后,mysqld 相關的頭文件在 /usr/include/mysql 目錄下。我們連接 mysqld 服務時主要使用 mysql.h 頭文件。
? ? ? ? 配置好后。mysqld 對應的庫文件在 /usr/lib64/mysql 下。
? ? ? ? 在鏈接 mysqlclient 庫時,需要使用 -L 字段指明庫的路徑。?
g++ -o $@ $^ -std=c++11 -L/usr/lib64/mysql -lmysqlclient
查看 mysqld 服務的版本
- 使用 mysql_get_client_info() 函數查看 mysqld 云服務版本。?
std::cout<<"client version: "<<mysql_get_client_info()<<std::endl;
? ? ? ? 作者的版本是 mysql 5.7.44 版本。
創建 mysql 句柄?
- 使用 mysql_init()?函數創建 mysql 句柄。
MYSQL *my=mysql_init(nullptr);
鏈接數據庫?
- 使用 mysql_real_connect() 函數鏈接數據庫。
#include<iostream>
#include<cstdio>
#include<mysql/mysql.h>const std::string host="127.0.0.1";
const std::string user="jd";
const std::string password="YJD010918madeinchina...";
const std::string db="study";
const unsigned int port=8088;int main()
{std::cout<<"client version: "<<mysql_get_client_info()<<std::endl;//1.創建mysql句柄MYSQL *my=mysql_init(nullptr);//2.鏈接數據庫if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0)==nullptr){std::cout<<"connect failed!"<<std::endl;return 1;}std::cout<<"connect success!"<<std::endl;
}
? ? ? ? 第一個參數為剛開始創建的 mysql 句柄,第二個參數為要訪問的 mysqld 的 ip,第三個參數為使用哪個 mysql 用戶訪問數據庫,?第四個參數為訪問數據庫的這個 mysql 用戶的密碼是多少,第四個參數為當前用戶訪問的數據庫的名稱,第五個參數為訪問的 mysqld 的端口號,后面兩個參數不需要了解。返回值為 MYSQL* 數據庫句柄類型,如果為空則連接數據庫失敗,如果不為空則鏈接數據庫成功。
使用數據庫?
? ? ? ? 數據庫的使用其實就是對數據庫表的使用,數據庫表的使用包含四個部分數據記錄的?增加,查詢,修改,刪除。
? ? ? ? 無論是 增加,查詢,修改還是刪除,都使用下面的函數進行操作。
int mysql_query(MYSQL *mysql, const char *q);
? ? ? ? 在對數據進行操作之前,我們應該先設置 mysql 句柄的編碼格式。
//設置句柄的編碼格式mysql_set_character_set(my,"utf8");
增加數據?
? ? ? ? 向 study 數據庫中的 students 表中插入數據。
insert into students values (6,66,'張三','297599');
? ? ? ? 成功插入。?
修改數據
????????向 study 數據庫中的 students 表中修改數據。?
update from students set name='李四' where id =6;
? ? ? ? 成功修改。?
?查詢數據
? ? ? ? 查詢數據是數據操作中較為復雜的一個操作,因為涉及到了將數據查詢出來,并將數據顯示出來。查詢出來數據很簡單,但是復雜的是將查詢出來的數據顯示出來,如何顯示出來,我們需要使用 多個接口共同搭配使用將插敘出來的數據顯示出來。
? ? ? ? 查詢 students 表中的所有記錄。
select * from students;
? ? ? ? 使用下述函數讀取? mysql_query()??接口執行之后,mysql 句柄中查詢的結果。
MYSQL_RES *mysql_store_result(MYSQL *mysql);
MYSQL_RES* res=mysql_store_result(my);
? ? ? ? 讀取的結果存儲在了 MYSQL_RES* 類型的返回值指向的特定結構體中。后續使用這個返回值獲取相關的結果字段。
?獲取查詢結果的行數
? ? ? ? 使用以下函數查詢行數。
my_ulonglong mysql_num_rows(MYSQL_RES *res);
//4.2獲取查詢的行數unsigned int rows = mysql_num_rows(res);std::cout << rows << std::endl;
? ? ? ? 查詢列數成功。?
?獲取查詢結果的列數?
? ? ? ? 使用以下函數查詢列數。
unsigned int mysql_num_fields(MYSQL_RES *res);
unsigned int fields = mysql_num_fields(res);std::cout << fields << std::endl;
? ? ? ? 查詢列數成功。
獲取查詢結果的列名?
? ? ? ? 使用以下函數查詢列名。
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
//4.3獲取查詢記錄的每一列的列名稱MYSQL_FIELD* fields_name=mysql_fetch_field(res);for(int i=0;i<fields;i++){std::cout<<fields_name[i].name<<"\t";}std::cout<<std::endl;
? ? ? ? 查詢結果的列名稱獲取成功。
獲取查詢結果所有數據
? ? ? ? 1.先使用以下函數獲取查詢結果的所有行數據。
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
? ? ? ? 可以將 MYSQL_ROW 看做一個二維數組。
for(int i=0;i<rows;i++){MYSQL_ROW lines=mysql_fetch_row(res);//line[i]表示第幾行的數據,直接獲取是無法獲取的,因為無法知道這一行數據的列數//就相當于如果只知道二維數組的行標不知道列表也是無法訪問二維數組的元素的}
? ? ? ? 2.通過列數,然后再訪問每行的每個元素,最終實現所有查詢結果的訪問。但是要注意,每列的元素都不應為空,否則會出現一些異常打印的問題。
? ? ? ? 基于此,對 students 中為空的字段進行修改。
std::cout << std::endl;for (int i = 0; i < rows; i++){MYSQL_ROW lines = mysql_fetch_row(res);// line[i]表示第幾行的數據,直接獲取是無法獲取的,因為無法知道這一行數據的列數// 就相當于如果只知道二維數組的行標不知道列表也是無法訪問二維數組的元素的for (int j = 0; j < fields; j++){std::cout << lines[j] << "\t";}std::cout << std::endl;}
? ? ? ? 查詢結果的所有數據獲取成功。?
斷開鏈接?
? ? ? ? 使用以下函數斷開鏈接。
void mysql_close(MYSQL *sock);
free(res);mysql_close(my);
C語言訪問mysql數據庫整體源碼
#include <iostream>
#include <stdlib.h>
#include <string>
#include <mysql/mysql.h>const std::string host = "127.0.0.1";
const std::string user = "jd";
const std::string password = "YJD010918madeinchina...";
const std::string db = "study";
const unsigned int port = 8088;int main()
{std::cout << "client version: " << mysql_get_client_info() << std::endl;// 1.創建mysql句柄MYSQL *my = mysql_init(nullptr);// 2.鏈接數據庫if (mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr){std::cout << "connect failed!" << std::endl;return 1;}// 3.設置鏈接的編碼格式mysql_set_character_set(my, "utf8");std::cout << "connect success!" << std::endl;// 4.進行數據庫表操作std::string sql = "select * from students";int code = mysql_query(my, sql.c_str());if (code != 0){std::cout << "execute: " << sql << "failed!" << std::endl;return 2;}std::cout << "execute: " << sql << " success!" << std::endl;// 4.1獲取查詢的結果到res中MYSQL_RES *res = mysql_store_result(my);// 4.2獲取查詢的行數int rows = mysql_num_rows(res);std::cout << rows << std::endl;int fields = mysql_num_fields(res);std::cout << fields << std::endl;// 4.3獲取查詢記錄的每一列的列名稱MYSQL_FIELD *fields_name = mysql_fetch_field(res);for (int i = 0; i < fields; i++){std::cout << fields_name[i].name << "\t";}// 4.4獲取查詢結果的每一行的數據std::cout << std::endl;for (int i = 0; i < rows; i++){MYSQL_ROW lines = mysql_fetch_row(res);// line[i]表示第幾行的數據,直接獲取是無法獲取的,因為無法知道這一行數據的列數// 就相當于如果只知道二維數組的行標不知道列表也是無法訪問二維數組的元素的for (int j = 0; j < fields; j++){std::cout << lines[j] << "\t";}std::cout << std::endl;}//5.斷開鏈接mysql_close(my);
}
? ? ? ? 至此,C語言鏈接數據庫的操作全部完成。
? ? ? ? 本期內容到此結束^_^