C/C++链接
- 一.前置工作
- 二.官方手册
- 三.基本接口
- 1.初始化和关闭
- 2.进行连接
- 3.下达命令
- 4.获取执行结果
- 5.释放空间
- 四.测试源代码
一.前置工作
进行C/C++链接时我们需要第三方库,但实际上在我们安装MySQL时就已经安装了,如果没有安装下面可以再执行该命令进行更新(安装)。
可以查看自己是否安装。
简单测试
以下函数是帮助获取mysql版本号的
由于是链接外部库,所以在编译时需要告诉编译器库的位置,如果不了解可以看我的博客基础静动态库部分。
如果它告诉你库找不到,那么就表明链接出错,找准库的位置,或者建立软链接到lib64目录下,具体操作可以看我的软硬链接部分(参考案例:Boost索引的建立,倒排索引部分,引入了jieba库,这里就建立了软链接,以方便我们使用)。这里不用手动连接头文件,是因为头文件本身我们就放在uer/include里,如果你没有,也记得手动连接。
二.官方手册
进入mysql官网。
可以在这里选择需要的函数。
可以在这里查找封装的数据结构。
三.基本接口
1.初始化和关闭
2.进行连接
1.host:连接的主机
2.user:连接的对象(用户)
3.passwd:密码
4.db:连接的库
5.port:端口号(我个人的端口号是3306)
6.unix_socket:预先套接(直接设为nullptr即可)
7.client_flag:设置为0即可
3.下达命令
1.SQL对象
2.下达的指令
为了测试,我们在库里建张表。
向表内进行插入。
在插入时有个小技巧,如果输错了,不能直接删除,要按ctrl+删除。
可以看到成功插入,如果我们插入的是中文呢?
可以看到出现乱码了,很明显是编码不同造成的,我的mysql编码是UTF8,而客户端默认是latin1。所以在链接成功后,应当将客户端编码也改成UTF8。
4.获取执行结果
增删改都没什么问题,但问题是查呢
很明显直接使用select是不会进行返回的,那么我们该如何让它显示出来呢?
实际上,在执行查找指令后,它会把数据保存在MYSQL结构体内,需要我们自己提取。
使用该函数会把数据库里的数据存放到MYSQL_RES的结构体内。
MySQL内的表结构分为列属性和内容,我们读取出来的就是内容。简单来看,MYSQL_RES的结果就像是方阵。
1.获取行数
2.获取列数
测试
3.查询结果
想要得到结果,其实遍历方阵就行了,而mysql有专门的函数来干这件事。
这里的MYSQL_ROW其实就是一个char**类型,它会指向每一行,所以就可以一次得到一行的信息,简单来说可以看作二维数组指针。
4.获取列属性
属性有很多,所以MYSQL_FIELD实际上是一个结构体,下面我们只打印列名。
5.释放空间
MYSQL_RES实际上malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的.
另外,mysql C api还支持事务等常用操作,大家下来自行了解:
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);
四.测试源代码
#include<iostream>
#include<mysql/mysql.h>const std::string host="127.0.0.1";
const std::string user="connector";
const std::string passwd="123456";
const std::string db="conn";
const unsigned int port=3306;int main()
{//1.初始化MYSQL *my=mysql_init(nullptr);//MYSQL就是一个结构体if(nullptr==my){std::cerr<<"init mysql error"<<std::endl;return 1;}//2.进行连接if(mysql_real_connect(my,host.c_str(),user.c_str(),passwd.c_str(),db.c_str(),port,nullptr,0)==nullptr){std::cerr<<"connect MYSQL error"<<std::endl;return 2;}mysql_set_character_set(my,"utf8");//更改编码格式//3.下达指令//std::string sql="insert into user(name,age,telephone) values('张三',18,'1527282345')";//细节:可以不带分号//std::string sql="delete from user where id=3";//删除std::string sql="select * from user";//查询int n=mysql_query(my,sql.c_str());if(n==0) std::cout<<"Sucess"<<std::endl;else {std::cout<<"Failed"<<std::endl;return 3;}//查询MYSQL_RES *res=mysql_store_result(my);if(nullptr==res){std::cerr<<"mysql_store_result err"<<std::endl;return 4;}my_ulonglong rows=mysql_num_rows(res);my_ulonglong cols=mysql_num_fields(res);std::cout<<"rows:"<<rows<<std::endl;std::cout<<"cols:"<<cols<<std::endl;//属性MYSQL_FIELD*fields_arr=mysql_fetch_field(res);for(int i=0;i<cols;i++){std::cout<<fields_arr[i].name<<' ';}std::cout<<'\n';//内容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]<<' ';}std::cout<<'\n';}mysql_free_result(res);//释放空间mysql_close(my);return 0;
}