mysql访问
点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃
1.引入MySQL 客户端库
从开始到选择我们用的都是命令行式的mysql访问mysqld,向mysqld下达我们的指令,其实在数据库层面上,连接数据库的客户端除了现在命令行式的客户端,还有图形化界面、网页版的,当然也包括语言级别的库或者包帮我们去访问数据库。
下面我们就用C/C++访问数据库。关于访问数据库我们要做两个准备工作,一是创建一个远端或者本地访问的请求也就是创建一个专门用来进行用C/C++访问客户端的账号。
reate user 'connector'@'localhost' identified by 'xxx';
然后创建一个数据库,赋予这个账号对数据库中表的所有权限。
二是安装C/C++要能访问的库,这个库有两种准备,第一种是从官网下载库,
下面这个是用不同语言连接MYSQL,官方提供的库。
下载推荐的8.0
我们用的是linux,所以选择linux系统x86 64位
下载好,上传到linux,然后解压一下,mysql-connector是解压后重命名的
这是解压后的文件,最重要的就是include 头文件,还有一个lib64 库
未来头文件给我们提供连接mysql的方法,库 提供连接mysql的库函数
我们就可以根据头文件,直接调用头文件的的方法,在编译连接的时候把库连入进来。如果忘记怎么引入,在Linux哪里基础IO动静态库就有对应的方法!
但是这种方式不推荐了!之间不是下载mysql,用yum源下载吗。yum源它会给我们找到合适的服务器,客户端,甚至是开发包。所以我们直接在yum哪里去找进行了。
没下载过mysql 可以下一下如果你安装过yum对应msyql源的话,如果不会下请移步于
【MySQL】MySQL在 Linux下环境安装
yum install -y mysql-community-server
如果你下载过,你就可以看到这里有对应的头文件,未来我们主要用的就是mysql.h
如果你下载过但是找不到头文件,执行下面的命令,就可以看到了
install -y mysql-devel
mysql库在系统默认安装路径下
开发环境我们有已经准备好了,接下来我们学习具体的接口。不过我们通过 mysql_get_client_info() 函数,来验证我们的引入是否成功。
#include <iostream>
#include <mysql/mysql.h>
using namespace std;
int main()
{
//获取当前客户端版本信息
cout<<"mysql client Version: "<<mysql_get_client_info()<<endl;
return 0;
}
如果直接编译肯定会报错,说的是未定义的引用,也就是这个mysql_get_client_info()找不到。
之前基础IO就说过,你要保证这个外来库能被正确连接,gcc/g++默认会选择C和C++的库,虽然你的mysql在系统中,系统也会默认会去/lib64路径下去找,
但是现在的问题是我怎么知道我需要连接那个库,尽管能找到这个库,但是我怎么知道我们该连那个库呢?所以我们需要需要在编译的时候就指明需要连那个库,
g++ -o mytest test.cc -L/lib64/mysql -lmysqlclient
然后就可以打出来所有mysql客户端的版本,说明这个库就被重新引入了
以前引入外来库不是还带上面-I选项,今天这里咋没有带。这是因为g++默认会去include里去找。然后拿着代码里的
去找,所有不会报头文件找不到的问题。如果你非得带-I,就把前面去掉
g++ -o mytest test.cc -I/usr/include/mysql -L/lib64/mysql -lmysqlclient
接下来我们我们通过这个库它内部给我提供对应的方法来让我们连接mysqld服务端,然后进行访问。
2.C/C++ 进行增删改
接下来我们先认识mysql常用接口。msyql接口介绍
这里还有mysql库为了方便操作mysql,然后提前在库中给我创建很多的数据结构
msyql的是一套网络服务,就注定了实际在进行mysql操作之前比如下达sql,一定在之前要连接mysql,而在连接mysql之前,我们还要先来创建一下mysql基础数据结构。要使用库,必须先进行初始化。mysql_init()帮我们创建一个MYSQL对象
MYSQL *mysql_init(MYSQL *mysql);
成功返回MYSQL对象,失败返回nullptr,用的时候必须要调用mysql_close()对应的链接。
MYSQL是 C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。
MYSQL实际上就是一个结构体里面包含连接mysql相关保存好的一些属性。这相当于FILE*,用来标识mysql客户端一些资源,我们把这些东西可以称之为句柄。
#include <iostream>
#include <mysql/mysql.h>
using namespace std;
int main()
{
// 1. 初始化mysql,构建mysql对象,得到mysql访问句柄
MYSQL* my=mysql_init(nullptr);
if (my == nullptr)
{
cerr << "init MySQL error" << endl;
return 1;
}
// 3.用完之后close,释放资源
mysql_close(my);
return 0;
}
把数据库对应的MYSQL结构体对象创建初始化好,最终不用它了把它释放。可是要访问mysql之前要先连接数据库,连接数据库的函数。
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned long clientflag);
第一个参数就是刚才创建的MYSQL对象。连接成功后把连接成功套接字信息保存到MYSQL对象中。然后要连接的mysql的主机在哪里,用户是谁,密码是多少,连接那个数据库,数据库的端口号是多少,剩下设置为nullptr,0就可以了。
成功时把我们传入的MYSQL给我们返回,失败返回nullptr。
最开始创建的只允许在本地主机连接数据库的用户就用上了。
#include <iostream>
#include <mysql/mysql.h>
#include <string>
using namespace std;
const string host="localhost"; //host="127.0.0.1" 也是可以的
const string user="connector";
const string passwd="xxx";
const string db="conn";
unsigned int port=xxx; //自己的端口号不要暴露
int main()
{
// 1. 初始化mysql,构建mysql对象,得到mysql访问句柄
MYSQL* my=mysql_init(nullptr);
if (my == nullptr)
{
cerr << "init MySQL error" << 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)
{
cerr << "connect MySQL error" << endl;
return 2;
}
cout<<"connect success"<<endl;
// 3.用完之后close,释放资源
mysql_close(my);
return 0;
}
自此我们完成了连接mysql的第工作
- 初始化mysql,构建mysql对象,得到mysql访问句柄
- 进行mysql 的connect连接
- 用完mysql之后close
然后就可以对mysql下达sql指令了。这个下达sql指令的函数是mysql_query对数据库下达指令。第一个参数就是刚才的MYSQL对象,第二个参数就是下达的sql指令。以前我们在命令行写单sql后面会带;,但是在这里并不需要带;or \g,成功时返回0,失败时返回非0。
在此之前可以自己先创建一个表
create table user(
id bigint primary key auto_increment,
name varchar(32) not null,
age int not null,
telphone varchar(32) unique
);
之前我们学过一个sql指令,查看正在连接数据库的用户
show processlist;
可以看到我们C/C++库确实连接到数据库了
int main()
{
// 1. 初始化mysql,构建mysql对象,得到mysql访问句柄
MYSQL *my = mysql_init(nullptr);
if (my == nullptr)
{
cerr << "init MySQL error" << 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)
{
cerr << "connect MySQL error" << endl;
return 2;
}
// cout<<"connect success"<<endl;
string sql;
while (true)
{
cout << " mysql> ";
if (!getline(cin, sql) || sql == "quit")
{
cout << "Bye" << endl;
break;
}
int n = mysql_query(my, sql.c_str());
if (n == 0)
{
cout << sql << " success" << endl;
}
else
{
cerr << sql << " error" << endl;
return 3;
}
}
// 3.用完之后close,释放资源
mysql_close(my);
return 0;
}
这里名字我们先输入英文,具体原因等会说。下达的这个sql执行可带;或者不带;。然后看到我们确实把信息插入到数据库了。我们其实也可以自己搞一