Linux(C++)连接MySQL数据库
一、 环境安装
首先是MySQL的安装,直接只用apt-get命令安装(这里推荐使用这种方式安装,因为此方式在后面程序编译时,不需要自己链接相关路径)
sudo apt-get install mysql-server
本人安装后,相关头文件以及动态库在如下目录中:
// 头文件
/usr/include/mysql/
// 动态库
/usr/lib/x86_64-linux-gnu/
最后,保证MySQL服务在运行状态,相关命令如下:
// 启动MySQL
service mysqld start
// 停止MySQL
service mysqld stop
// 重启MySQL
service mysqld restart
// 查看MySQL运行状态
systemctl status mysql.service
二、 配置
第一次安装MySQL后,是如法直接用root用户登录的,会报错Access denied for user ‘root’@‘localhost’。此时,我们先查看MySQL配置文件,获取默认用户名和密码:
// 命令
sudo cat /etc/mysql/debian.cnf
// 配置文件内容
[client]
host = localhost
user = debian-sys-maint
password = ***(这里我隐藏了,是一串英文和数字)
socket = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host = localhost
user = debian-sys-maint
password = ***(这里我隐藏了,是一串英文和数字)
socket = /var/run/mysqld/mysqld.sock
我们直接使用配置文件中提供的用户名debian-sys-maint和密码,登录MySQL
$ mysql -udebian-sys-maint -p
Enter password: (这里输入配置文件中的密码)
进入MySQL后,配置root账户的密码
mysql> update user set password=password('密码') where user='root' and host='localhost'
mysql> flush privileges; //这一步不要忘记,让MySQL重新加载权限数据
此时,退出MySQL,我们就可以用root账户和设置的密码正常进入MySQL了。
三、 头文件
#include<mysql/mysql.h>
四、 函数
1. 分配或初始化MYSQL对象
MYSQL *mysql_init(MYSQL *mysql)
参数: mysql mysql的实例
待初始化的MYSQ对象,将对象地址传入,NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。
MYSQL mysql;
mysql_init(&mysql);
// 或者
MYSQL mysql = mysql_init(NULL);
2. 连接一个mysql服务器
MYSQL *mysql_real_connect (MYSQL *mysql,
const char*host,
const char*user,
const char*passwd,
const char*db,
unsigned intport,
const char*unix_socket,
unsigned long client_flag)
参数:mysql 前面一个函数的返回的mysql实例句柄。
host 要连接的数据库的主机,可以是ip地址或主机名。
user 表示登录数据库的用户名。
passwd 登录的密码。
db 就是访问的数据库。
port mysql的tcp/ip端口默认是3306。
unix_socket 表示连接类型。
client_flag 暂时为0即可。
如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同
if(mysql_real_connect(&mysql,"localhost","root","dxm242012","Student",0,NULL,0) == NULL){
cout << "connect fial\n";
return-1;
}
3. 执行指定查询语句字符串的SQL查询
int mysql_query(MYSQL *mysql,const char *query)
参数: mysql mysql的实例。query 查询语句字符串
返回值: 成功返回0,失败返回非0
返回一个结果表,假定查询成功,可以调用 mysql_num_rows() 来查看对应于 SELECT 语句返回了多少行,或者调用mysql_affected_rows() 来查看对应于 DELETE,INSERT,REPLACE 或 UPDATE 语句影响到了多少行。
string sql = ”查询语句”;
mysql_query(&mysql,sql.c_str());
4. 获取最后一次查询语句字符串的SQL查询的结果集
MYSQL_RES *mysql_store_result(MYSQL *mysql)
检索完整的结果集至客户端。客户端处理结果集最常用的方式是通过调用mysql_store_result(),一次性地检索整个结果集。该函数能从服务器获得查询返回的所有行,并将它们保存在客户端。
对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result() 。
对于其他查询,不需要调用mysql_store_result()或mysql_use_result(),
但是如果在任何情况下均调用了mysql_store_result(),它也不会导致任何伤害或性能降低。
参数: mysql mysql的实例。query 查询语句字符串
返回值:成功返回MYSQL_RES结构体,该结构体中保存查询的结果
string sql = ”查询语句”;
mysql_query(&mysql,sql.c_str());
MYSQL_RES * result = mysql_store_result(&mysql);
if(result == NULL)
cout << "fail\n";
5. 返回结果集中的行数
int mysql_num_rows(MYSQL_RES* result)
参数: result 结果集
6. 返回结果集中的列数
int mysql_num_fields(MYSQL_RES* result)
参数: result 结果集
7. 获取下一个列的类型
MYSQL_FIELD* mysql_fetch_field(MYSQL_RES *result);
参数: result 结果集
获取下一个列的类型,结束返回NULL。
do{
MYSQL_FIELD* field = mysql_fetch_field (result);
cout << field->name << "\t\t";
}while(row != NULL);
8. 从结果集中获取下一行
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
参数: result 结果集
成功返回一个数组,值大于0。
do{
MYSQL_ROW row = mysql_fetch_row(result);
for(inti=0; i<mysql_num_fields(result); i++){
cout << row[i] << "\t\t";
}
cout << endl;
}while(row != NULL);
9. 获取对应列的类型
MYSQL_FIELD* mysql_fetch_field_direct(MYSQL_RES *result, int i);
给定列编号,返回列的类型,结束返回NULL。
for(int i=0; i<mysql_num_fields(result); i++){
MYSQL_FIELD* field = field = mysql_fetch_field_direct(result,i);
cout << field->name << "\t\t";
}
10. 关闭MYSQL
MYSQL *mysql_close(MYSQL *mysql)
参数: mysql mysql的实例
五、C++封装MyDB类
后来又把这些函数简单的封装了一下,方便以后直接用。
class MyDB {
public:
MyDB();
~MyDB();
bool InitDB(string host,string user,string pwd,string dbname);
bool ExeSQL(string sql);
private:
MYSQL* mysql;
MYSQL_ROW row;
MYSQL_RES* result;
MYSQL_FIELD* field;
};
MyDB::MyDB() {
mysql = mysql_init(NULL);
if(mysql == NULL) {
cout << "Error: "<< mysql_error(mysql);
exit(-1);
}
}
MyDB::~MyDB() {
if(!mysql) {
mysql_close(mysql);
}
}
bool MyDB::InitDB(string host,string user,string pwd,string dbname) {
/*连接数据库*/
if(!mysql_real_connect(mysql,host.c_str(),user.c_str(),pwd.c_str(),dbname.c_str(),0,NULL,0)) {
cout << "connect fial: "<< mysql_error(mysql);
exit(-1);
}
return true;
}
bool MyDB::ExeSQL(string sql) {
/*执行失败*/
if(mysql_query(mysql,sql.c_str())) {
cout << "query fail: "<< mysql_error(mysql);
exit(1);
}
else {
/*获取结果集*/
result = mysql_store_result(mysql);
int fieldnum = mysql_num_fields(result);
for(int i=0; i<fieldnum; i++) {
row = mysql_fetch_row(result);
if(row <= 0)
break;
for(int j=0; j<fieldnum; j++) {
cout << row[j] << "\t\t";
}
cout << endl;
}
mysql_free_result(result);
}
return true;
}