这里采用连接外部库的方式,使用C语言连接MySQL
1.项目导入MySQL
建议先看一下Linux_动态库与静态库(制作与安装)
首先先看一下自己是否有MySQL的头文件和库,如果没有去官网下载一下
检查命令,检查头文件和库是否存在
find /usr/include/ -name mysql.h
find /usr/lib64/ -name libmysqlclient.*
下载好后将压缩包上传到Linux上(新建一个文件夹)
使用tar xzf 安装包名
解压,并使用mv命令将解压后的文件重命名
这时新创建一个项目文件,创建测试文件
使用软链接命令链接我们刚才解压的头文件和库
ln -s ~/LibMySQL/mysql_lib/include include;
//~/LibMySQL/mysql_lib/include 是解压后头文件的路径
//include 是软链接名
ln -s ~/LibMySQL/mysql_lib/lib lib;
建立好后结果如下:
注意:链接了外部库的话Makefile 编译时需要指定
具体看Linux_动态库与静态库(制作与安装)
Makefile如下
MySQL:TestConnect.cpp
g++ -o $@ $^ -std=c++11 -I./include -L./lib -lmysqlclient
.PHONY:clean
clean:
rm -f MySQL
此时可以编译了,但是执行错误
发现动态库系统还是没有找到
还是在这片文章中介绍了原因和解决方法Linux_动态库与静态库(制作与安装)
这里选择文章中的第三种方法,创建文件,更新系统配置
cd /etc/ld.so.conf.d/
创建一个配置文件
打开配置文件,将解压的动态库链接拷贝进去,我这里是
sudo vim
最后执行ldconfig即可
成功链接到动态库!!
测试代码如下:
#include<iostream>
#include "include/mysql.h"
int main(){
std::cout<<"MySQL Connect Version"<<mysql_get_client_info()<<std::endl;
return 0;
}
成功打印出MySQL版本,使用软链接让C语言调用MySQL成功。
2.调用MySQL测试
初始化
MYSQL *mysql_init(MYSQL *mysql);
要使用库,必须先进行初始化
MySQL 连接函数
MYSQL *mysql_real_connect(MYSQL *mysql,---- MySQL句柄
const char *host, -----连接IP
const char *user, ----使用人
const char *passwd, -----对应密码
const char *db, ----- 连接的数据库
unsigned int port, ------MySQL端口
const char *unix_socket, -----远端给nullptr即可
unsigned long clientflag);----其他参数
void mysql_close(MYSQL *sock);—关闭MySQL连接
注意:数据库在默认情况下不认识中文,在插入,查询是遇到中文会出现乱码情况
在来连接成功后还需要设置编码格式utf-8
//设置MySQL编码格式
mysql_set_character_set(sql,"utf8");
#include<iostream>
#include "include/mysql.h"
int main(){
//std::cout<<"MySQL Connect Version"<<mysql_get_client_info()<<std::endl;
MYSQL*sql=mysql_init(nullptr);//创建MySQL句柄
//连接数据库
if(nullptr==mysql_real_connect(sql,"121.5.176.41","dodamce","这个用户的密码","dodamce_test",3306,nullptr,0)){
std::cerr<<"MySQL Connect Error"<<std::endl;
return 1;
}
std::cout<<"MySQL 连接成功"<<std::endl;
//设置MySQL编码格式
mysql_set_character_set(sql,"utf8");
mysql_close(sql);//关闭数据库
std::cout<<"MySQL Close"<<std::endl;
return 0;
}
基本连接完成
这里要对这个数据库进行修改
下达MySQL增删改命令
修改数据库表:
下发mysql命令
int mysql_query(MYSQL *mysql, const char *q);
需要让MySQL执行那些命令就传入到q中
#include<iostream>
#include<string>
#include "include/mysql.h"
int main(){
//std::cout<<"MySQL Connect Version"<<mysql_get_client_info()<<std::endl;
MYSQL*sql=mysql_init(nullptr);//创建MySQL句柄
//连接数据库
if(nullptr==mysql_real_connect(sql,"121.5.176.41","dodamce","对应用户的密码","dodamce_test",3306,nullptr,0)){
std::cerr<<"MySQL Connect Error"<<std::endl;
return 1;
}
std::cout<<"MySQL 连接成功"<<std::endl;
//设置MySQL编码格式
mysql_set_character_set(sql,"utf8");
std::string insert="insert into msg values(6,\'tom\',\'213\',now())";
std::string modify="update msg set name=\'asd\' where id=3";
std::string del="delete from msg where id=4";
int ret=mysql_query(sql,insert.c_str());//通过mysql_query下方不同的命令
std::cout<<"resault code"<<ret<<std::endl;
mysql_close(sql);//关闭数据库
std::cout<<"MySQL Close"<<std::endl;
return 0;
}
调用MySQL查询数据
1. 通过mysql_store_result这个函数来读取结果
MYSQL_RES *mysql_store_result(MYSQL *mysql);
该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。
同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。
同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏
执行完mysql_store_result以后,其实数据都已经在MYSQL_RES 变量中了,下面的api基本就是读取MYSQL_RES 中的数据。
//1. 获取结果行数mysql_num_rows
my_ulonglong mysql_num_rows(MYSQL_RES *res);
//2.获取结果列数mysql_num_fields
unsigned int mysql_num_fields(MYSQL_RES *res);
//3.获取列名mysql_fetch_fields
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
//4.获取结果内容mysql_fetch_row
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
/**
它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **,可以理解为二维数组
*/
#include<iostream>
#include<string>
#include "include/mysql.h"
int main(){
//std::cout<<"MySQL Connect Version"<<mysql_get_client_info()<<std::endl;
MYSQL*sql=mysql_init(nullptr);//创建MySQL句柄
//连接数据库
if(nullptr==mysql_real_connect(sql,"121.5.176.41","dodamce","对应用户的密码","dodamce_test",3306,nullptr,0)){
std::cerr<<"MySQL Connect Error"<<std::endl;
return 1;
}
std::cout<<"MySQL 连接成功"<<std::endl;
//设置MySQL编码格式
mysql_set_character_set(sql,"utf8");
std::string insert="insert into msg values(6,\'tom\',\'213\',now())";
std::string modify="update msg set name=\'asd\' where id=3";
std::string del="delete from msg where id=4";
std::string find="select * from msg";
int ret=mysql_query(sql,find.c_str());//通过mysql_query下方不同的命令
if(ret!=0){
std::cerr<<"find error"<<std::endl;
}
MYSQL_RES* res=mysql_store_result(sql);
int rows=mysql_num_rows(res);//获取查询结果行数
int cols=mysql_num_fields(res);//获取查询结果列数
for(int i=0;i<rows;i++){
MYSQL_ROW row=mysql_fetch_row(res);//获取查询结果一行的数据
for(int j=0;j<cols;j++){
std::cout<<row[j]<<"\t";
}
std::cout<<std::endl;
}
free(res);//不要忘记释放空间
mysql_close(sql);//关闭数据库
std::cout<<"MySQL Close"<<std::endl;
return 0;
}
//获取MySQL所有列属性
MYSQL_FIELD*mysql_fetch_field(MYSQL_RES*);
#include<iostream>
#include<string>
#include "include/mysql.h"
int main(){
//std::cout<<"MySQL Connect Version"<<mysql_get_client_info()<<std::endl;
MYSQL*sql=mysql_init(nullptr);//创建MySQL句柄
//连接数据库
if(nullptr==mysql_real_connect(sql,"121.5.176.41","dodamce","对应用户的密码","dodamce_test",3306,nullptr,0)){
std::cerr<<"MySQL Connect Error"<<std::endl;
return 1;
}
std::cout<<"MySQL 连接成功"<<std::endl;
//设置MySQL编码格式
mysql_set_character_set(sql,"utf8");
std::string insert="insert into msg values(6,\'tom\',\'213\',now())";
std::string modify="update msg set name=\'asd\' where id=3";
std::string del="delete from msg where id=4";
std::string find="select * from msg";
int ret=mysql_query(sql,find.c_str());//通过mysql_query下方不同的命令
if(ret!=0){
std::cerr<<"find error"<<std::endl;
}
MYSQL_RES* res=mysql_store_result(sql);
int rows=mysql_num_rows(res);//获取查询结果行数
int cols=mysql_num_fields(res);//获取查询结果列数
MYSQL_FIELD* file=mysql_fetch_field(res);//获取列信息
for(int i=0;i<cols;i++){
//获取列名称
std::cout<<file[i].name<<'\t';
}
std::cout<<std::endl;
for(int i=0;i<rows;i++){
MYSQL_ROW row=mysql_fetch_row(res);//获取查询结果一行的数据
for(int j=0;j<cols;j++){
std::cout<<row[j]<<"\t";
}
std::cout<<std::endl;
}
free(res);//不要忘记释放空间
mysql_close(sql);//关闭数据库
std::cout<<"MySQL Close"<<std::endl;
return 0;
}
事务等其他操作
my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
my_bool STDCALL mysql_commit(MYSQL * mysql);
my_bool STDCALL mysql_rollback(MYSQL * mysql);