文章目录
- 1、准备工作
- 2、操作
- 3、select
1、准备工作
root用户的mysql下,创建一个普通用户,创建一个库,通过这个库给普通用户所有权限
create user 'connector'@'localhost' identified by '123456';
create database conn;
grant all on conn.* to 'connector'@'localhost';
flush privileges;
//前提得在root用户下的mysql这个库中select User,Host from user;
安装C++和C的相关库。有两个办法,更推荐下一个yum源办法,因为第一个办法找不到匹配mysql版本的源。
浏览器输入mysql找到mysql官网
选择DOWNLOADS,找到这个
选择最下面的,来到这个页面
右边那一列最上面两个就是了。这里先下载C的
中间有个MySQL Connector/C++ 8.0,选择这个。
显示的是最新版本,archives里是旧版本。根据自己情况选择适合的系统
下载非debug的。在Linux系统中,在一个目录中,rz空格,找到下载的zip文件,然后传入,传输完成后是这样的,下图的第二个。
解压出来是一个很长的目录名,可以改一下目录名,目录里是这样
里面最重要的是include和lib64两个目录。
yum源办法。
mysql5.7版本的数据库,客户端的头文件在 /usr/linclude/mysql中。查看一下安装mysql时的动静态库
ls /lib64/mysql/*
最上方应当有后缀为so,以及a的文件。或者
ls /usr/lib64/mysql/
也和上面一样,so和a后缀的文件。如果没有
yum install mysql-devel
这样就好了。
2、操作
创建一个目录,目录有一个test.cc文件,在这个文件里引用下载好的库。
#include #include int main(){//此函数用来验证引入是否成功std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;return 0;}
如果编译的话就会报错。因为我们要连接库
g++ -o test test.cc -L/lib64/mysql -lmysqlclient
makefile
test:test.ccg++ -o $@ $^ -std=c++11 -L/lib64/mysql -lmysqlclient.PHONY:cleanclean:rm -f test
引入成功就会打印当前mysql的版本。
mysql官网中的文档页,有C API名字的文档,这个就是使用方法。我当前mysql版本要用的就是5.7。
创建一个mysql对象,初始化并关闭。
MYSQL* my = mysql_init(nullptr);if(nullptr == my){std::cerr << "init MySQL error" << std::endl;return 1;}mysql_close(my);
使用数据库前要先连接数据库。
#include #include #include const std::string host = "localhost";const std::string user = "connector";const std::string passwd = "123456";const std::string db = "conn";const unsigned int port = 8080;int main(){//此函数用来验证引入是否成功std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;MYSQL* my = mysql_init(nullptr);if(nullptr == my){std::cerr << "init MySQL error" << std::endl;return 1;}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 1;}mysql_close(my);return 0;}
在conn库里建一个表
create table user( id bigint primary key auto_increment, name varchar(32) not null, age int not null, telphone varchar(32) unique );
下达mysql指令用mysql_query函数,第一个参数是上面创建的mysql对象,第二个是mysql指令。
std::string sql;while(true){std::cout << "MySQL>>> ";if(!std::getline(std::cin, sql)|| sql == "quit"){std::cout << "数据库终止" << std::endl;break;}int n = mysql_query(my, sql.c_str());if(n == 0)std::cout << sql << "success: " << n << std::endl;elsestd::cerr << sql << "failed: " << n << std::endl;}mysql_close(my);
在输入时如果写错了字符,按住Ctrl再回退即可。这是模拟一下mysql,实际应用时是这样
std::string sql = "insert into user (name, age, telphone) values ('peter', 19, '4673842')";int n = mysql_query(my, sql.c_str());if(n == 0)std::cout << sql << "success: " << n << std::endl;elsestd::cerr << sql << "failed: " << n << std::endl;
增删改都可以,但是select是比较难处理的,虽然会成功,但不会显示出来,所以select还得有后续工作才能把内容显示在上层。
插入时如果插入中文,可以成功,但是插入后会成为乱码。这是因为服务端和客户端编码不一致造成的,连接数据库后默认的字符集是latin1,需要设置成utf8。
mysql_set_character_set(my, "utf8");
3、select
select在使用后,结果会保存在我们创建的mysql对象my这个句柄中,用提取函数来拿到结果。
std::string sql = "select * from user";int n = mysql_query(my, sql.c_str());if(n == 0)std::cout << sql << "success: " << n << std::endl;else{std::cerr << sql << "failed: " << n << std::endl;return 3;}//把内容转储到res中MYSQL_RES* res = mysql_store_result(my);if(nullptr == res){std::cerr << "mysql_store_result error" << std::endl;return 4;}
查询出来的数据会被mysql当作字符串,一条记录就是一个字符串,对于每一个字符串,多列的信息都聚合到一个字符串中,有一个数组,数组每一个元素都指向一个字符串的一列的内容,而MYSQL_RES结构体里也有指针去指向这样的每个数组。这样就能理解MYSQL_RES里的成员了。
从MYSQL_RES结构体中拿出内容,也有函数。
//获取结果行数my_ulonglong rows = mysql_num_rows(res);//获取结果列数my_ulonglong fields = mysql_num_fields(res);//获取内容, MYSQL_ROW是char**类型的for(int i = 0; i < rows; i++){MYSQL_ROW ret = mysql_fetch_row(res);//这个函数类似于迭代器for(int j = 0; j < fields; j++){std::cout << ret[j] << "\t";//*(ret + j)}std::cout << "\n";}
获取更详细信息
//获取每一条记录的属性MYSQL_FIELD* fields_array = mysql_fetch_fields(res);for(int i = 0; i < fields; i++){//获取列名std::cout << fields_array[i].name << "\t";}std::cout << "\n";
上面是把查询到的内容放到了res中,要释放它,也是有函数的
mysql_free_result(res);
释放最一开始创建的mysql对象则是
mysql_close(my);
官方文档中还有很多接口,比如回滚、提交等操作。
结束。