访问数据库的方式:
命令行:使用命令行输入SQL指令直接访问。需记忆命令和SQL语法,对新手不友好。正因如此推荐新手使用该方式访问,能倒逼学习者对SQL语法的记忆,并对MySQL更深入理解。图形化界面访问:使用图形化界面工具,如:DBeaver、DataGrip、Navicat、HeidiSQL(MySQL)、 MySQL Workbench。特点:有语法提示,可以直接对数据手动增删改。编程接口:在编写程序时,可以直接通过API接口来连接并访问数据库,嵌入代码,与业务逻辑结合。...... MySQL的访问者都属于客户端,如以上三种方式,这一期将要讲的是C/C++编程接口的访问。
第三方库的准备:C/C++原生库并不提供连接MySQL的API接口,需要导入第三方库,不过通常都在下载MySQL服务时就下好了,只需要在编译时加上动态库链接和相应地址。如果没有库,使用以下指令安装:
代码语言:javascript复制yum install myaql-community-server客户端初始化过程:
初始化mysql操作句柄连接mysql服务器设置客户端的字符集选择想要操作的数据库操作库(增删改查)初始化句柄句柄类似一个数据结构的地址,到时候用来找到MySQL的相关信息,类似FILE*。
代码示例:
代码语言:javascript复制MYSQL* mysql=mysql_init(nullptr);连接mysql服务器函数原型:
代码语言:javascript复制MYSQL *mysql_real_connect(
MYSQL *mysql, // MySQL 连接句柄
const char *host, // 主机名或IP地址
const char *user, // MySQL用户名
const char *passwd, // 密码
const char *db, // 默认数据库
unsigned int port, // 端口号
const char *unix_socket,// Unix域套接字路径
unsigned long client_flag // 客户端标志
);参数:
mysql:mysql句柄,由 mysql_init() 初始化的连接句柄指针。
host:主机名 (如 "localhost"或"127.0.0.1")。
user:用户名,如果为NULL,表示使用当前登录用户名。
passwd:用户密码。如果为NULL,表示不使用密码。
db:要使用的默认数据库名称,可以为NULL。
port:mysql服务的端口号,如果为0,使用默认端口(3306)。
unix_socket:套接字路径,暂不关心,设置为NULL,表示使用默认套接字。
client_flag:标志位,很少用到,暂时不关系,设置为0即可。
返回值:
成功:返回原来的mysql句柄。失败:返回nullptr。代码示例:
代码语言:javascript复制#include
#include
#define HOST "localhost" //或#define HOST "120.0.0.1"
#define USER "root"
#define PASSWORD "XyK@71986582"
#define DB "conn"
#define PORT 3306
main()
{
//......
mysql = mysql_real_connect(mysql,HOST,USER,PASSWORD,DB,PORT,nullptr,0);
if(mysql==nullptr)
{
std::cout<<"mysql_real_connect fail"< return 1; } //...... return 0; }在实际开发中最好不要用root用户访问。 设置客户端的字符集 在连接数据库后要保持客户端与mysqld的字符集一致,要不然会出现乱码。通常都统一设为utf8。 代码示例: 代码语言:javascript复制mysql_set_character_set(mysql,"utf8");实参mysql是由 mysql_init() 初始化的连接句柄指针。 选择需要操作的数据库 在做连接时已经选好了现在就不用选,只是考虑到中途需要换其他库的情况。 代码语言:javascript复制mysql_select_db(mysql,"conn");conn为一个准备好的数据库的库名。 执行sql语句(增删改查)使用 int mysql_query(MYSQL*, const char*) 其中参数为mysql句柄和SQL语句,SQL语句以字符串的形式传入。成功返回0,否则返回非0。 以增为例,如下: 代码语言:javascript复制std::string insert1 = "insert into stu values(null,'张三',18,187562354)"; n = mysql_query(mysql, insert1.c_str()); if (n != 0) { std::cout << "mysql_query fail" << std::endl; return 1; } 增删改都只要sql语句执行成功,数据库中的时间就发生改变了,没有反馈结果。而查询是不一样的,因为首先执行语句成功,结果在服务器里边,需要把它保存到本地进行访问。 数据查询流程:使用sql语句查询成功后把查询结果保存到本地(获取结果集)获取查询结果集的结果条数遍历结果集释放结果集的空间数据查询结果是在服务器端的,我们需要把它保存到本地内存才能进行访问。使用 MYSQL_RES* mysql_store_result(MYSQL*) 返回值为MYSQL_RES*类型,是一个结构体类型的指针,里面保存了查询结果和相关属性。其中mysqld把所有查询结果都当做字符串类型给我们返回。我们可以把结果当做char* [ ][ ](或char** []),即储存char*的二维数组。 获取结果集,代码示例: 代码语言:javascript复制MYSQL_RES *res = mysql_store_result(mysql); if (res == nullptr) { std::cout << "mysql_store_result fail" << std::endl; return 1; }接下来要做的从res中获取结果即可,如果做呢?需要知道它的行和列然后进行遍历。 获取行数: 代码语言:javascript复制int row = mysql_num_rows(res);获取列数: 代码语言:javascript复制int col = mysql_num_fields(res);遍历并打印数据: 使用函数 MYSQL_ROW mysql_fetch_row(MYSQL_RES*) 获取单个行信息, result会记录每次遍历的到行。代码示例: 代码语言:javascript复制for (int i = 0; i < row; i++) { MYSQL_ROW r = mysql_fetch_row(res); for (int j = 0; j < col; j++) { std::cout << r[j] << '/t'; } std::cout << std::endl; }释放结果集: 结果集在本地开辟了空间使用完后需要释放,使用mysql提供的接口: void mysql_free_result(MYSQL_RES*) 释放MySQL操作句柄,使用函数: void mysql_close(MYSQL*); 即: 代码语言:javascript复制mysql_free_result(res); mysql_close(mysql);源码: 代码语言:javascript复制#include #include #define HOST "localhost" // 或#define HOST "120.0.0.1" #define USER "root" #define PASSWORD "XyK@71986582" #define DB "conn" #define PORT 3306 int main() { // 创建MySQL句柄 MYSQL *mysql = mysql_init(nullptr); // 连接数据库 mysql = mysql_real_connect(mysql, HOST, USER, PASSWORD, DB, PORT, nullptr, 0); if (mysql == nullptr) { std::cout << "mysql_real_connect fail" << std::endl; return 1; } // 设置客户端字符集,与mysqld保持一致。 int n = mysql_set_character_set(mysql, "utf8"); if (n != 0) { std::cout << "mysql_setcharacter_set fail" << std::endl; return 1; } // 选择要操作的数据库 // 在做连接时已经选好了现在就不用选,只是考虑到中途需要换其他库的情况。 // n = mysql_select_db(mysql,"conn"); // 准备工作做好了,接下来操作库: // 执行SQL语句 std::string insert1 = "insert into stu values(null,'张三',18,187562354)"; std::string insert2 = "insert into stu values(null,'李四',18,187562154)"; std::string delete1 = "delete from stu where id=1"; std::string update = "update stu set name='王五' where name = '李四'"; std::string sel = "select * from stu"; n = mysql_query(mysql, sel.c_str()); if (n != 0) { std::cout << "mysql_query fail" << std::endl; return 1; } MYSQL_RES *res = mysql_store_result(mysql); if (res == nullptr) { std::cout << "mysql_store_result fail" << std::endl; return 1; } int row = mysql_num_rows(res); int col = mysql_num_fields(res); for (int i = 0; i < row; i++) { MYSQL_ROW r = mysql_fetch_row(res); for (int j = 0; j < col; j++) { std::cout << r[j] << '\t'; } std::cout << std::endl; } mysql_free_result(res); mysql_close(mysql); return 0; } 非常感谢您能耐心读完这篇文章。倘若您从中有所收获,还望多多支持呀!