前面一章讲了如何在CentOS7下面安装配置Mysql服务器,入个门
那么作为C语言开发选手,本章的重点就是介绍如何在C语言环境下,使用mysql数据库来存储数据。
编译环境的配置
首先要明白我们用的是C语言的接口API,所以要有mysql的库和头文件来支撑。
CentOS命令下运行安装命令
yum install mysql-devel
系统会将mysql的头文件及so文件帮我们安装好,库文件默认安装路径是
/usr/lib64/mysql/
头文件默认安装路径是
/usr/include/mysql/
其实介绍这个也没什么用。因为后面用不到
然后,我们在编译代码的时候,需要链接mysql的库,这里采用的方式是利用mysql自带的命令
mysql_config
自动获取编译参数,然后添加到Makefile中。
[root@localhost ~]# mysql_config
Usage: /usr/bin/mysql_config-64 [OPTIONS]
Compiler: GNU 4.8.5
Options:
--cflags [-I/usr/include/mysql -m64 ]
--cxxflags [-I/usr/include/mysql -m64 ]
--include [-I/usr/include/mysql]
--libs [-L/usr/lib64/mysql -lmysqlclient -lpthread -lm -lrt -ldl]
--libs_r [-L/usr/lib64/mysql -lmysqlclient -lpthread -lm -lrt -ldl]
--plugindir [/usr/lib64/mysql/plugin]
--socket [/var/lib/mysql/mysql.sock]
--port [0]
--version [5.7.35]
--libmysqld-libs [-L/usr/lib64/mysql -lmysqld -lpthread -lm -lrt -ldl -lcrypt -laio -lnuma]
--variable=VAR VAR is one of:
pkgincludedir [/usr/include/mysql]
pkglibdir [/usr/lib64/mysql]
plugindir [/usr/lib64/mysql/plugin]
所以,我们只需要修改我们的Makefile,增加如下两个参数,即可完美添加mysql库。
CFLAGS += `mysql_config --cflags`
LDFLAGS += `mysql_config --libs`
看看,人家成熟的软件,想的就是周到,咱们的修行之路还长着呢。
代码中的应用
接下来就介绍一下如何在c语言中编写使用mysql。
首先我们假设一个表格,叫mytable
有两列,name和value。
列 | 类型 |
---|---|
name | varchar[128] |
value | int |
头文件的包含
需要在你的c文件或者h文件头部,安装如下顺序进行关键头文件包含
#include <mysql/mysql.h>
#define __USE_GNU
#include <sched.h>
#include <pthread.h>
为何这么包含这三个文件,我也忘了。
你可以只包含第一个文件,看看报什么错误,增加一下印象。
初始化链接
然后是数据库的初始化,这里是单线程的写法,所以链接定义为全局变量。后面有多线程的写法。
通常定义两个初始化函数
MYSQL *MQ_CON=NULL;
int mysql_cn_init(void)
{
MQ_CON = mysql_init(NULL);
if (!mysql_real_connect(MQ_CON, "192.168.3.3", "root", "ACB123@abc", "mydb", 0, NULL, 0))
{
printf("%s\n", mysql_error(MQ_CON));
return -1;
}
return 0;
}
int mysql_cn_exit(void)
{
mysql_close(MQ_CON);
return 0;
}
mysql语句的调用
清空数据表
mysql_query(MQ_CON,"DELETE FROM mytable");
插入数据
mysql_query(MQ_CON,"INSERT INTO mytable(name,value) VALUES ('abc',1)");
更新数据
mysql_query(MQ_CON,"UPDATE mytable SET value=2 WHERE name='abc'");
删库跑路
所有能在mysql的交互窗口执行的命令,都可以拿来在此处运行。
调用结果的解析
查询结果是我们比较关注返回值的地方
MYSQL_ROW row;
MYSQL_RES *result;
int num_fields;
mysql_query(MQ_CON, "SELECT * FROM mytable");
result = mysql_store_result(MQ_CON);
//获取列数量,这里将会获得2,因为有name和value两个列
num_fields = mysql_num_fields(result);
//判断结果是否是两列,不是则不处理
if(num_fields==2)
{
//循环读取每行
while ((row = mysql_fetch_row(result)))
{
char name[128]={0};
int value=0;
//这里展示类两种比较标准的获取方法,防止出现空指针的时候,造成程序崩溃。
if(row[0])
strcpy(name,row[0]);
else
strcpy(name,"");
value = row[1] ? atoi(row[1]):0;
printf("name:%s,value:%d \n",name,value);
}
}
//最后一定要记得释放结果
mysql_free_result(result);
获取统计结果
mysql_query(MQ_CON, "SELECT SUM(value) AS allPvalue FROM mytable");
以上就是C语言的mysqlAPI调用范例,足够简单的读写操作。
更加详细的mysql操作可以参考菜鸟教程中的mysql教程
多线程下开发(未验证)
这部分资料网上倒是没有多少代码举例的,参考资料自己写了一组接口,不过还没有测试,哪位可以顺手帮我测试一下。
据可靠资料显示,大部分的API是线程安全的,只有在初始化和结束的时候,有些许的不同。
MYSQL *mysql_cn_init_pthread(void)
{
MYSQL *MQ_CON=NULL;
my_init();
mysql_thread_init();
//初始化 myData
MQ_CON= malloc(sizeof(MYSQL));
memset(&MQ_CON, 0, sizeof(MYSQL));
if (!mysql_real_connect(MQ_CON, db41_server, db41_user, db41_password, db41_database, 0, NULL, 0))
{
zlog_error(zlogc,"%s", mysql_error(MQ_CON));
return NULL;
}
return MQ_CON;
}
int mysql_cn_exit_pthread(MYSQL * MQ_CON)
{
mysql_close(MQ_CON);
mysql_thread_end();
return 0;
}
void pthread_1(void* para)
{
MYSQL *MQ_CON=NULL;
MQ_CON=mysql_cn_init_pthread();
//数据库操作
//数据库操作结束
mysql_cn_exit_pthread(MQ_CON);
}
网上还有一种说法,如果前面一种行不通,可以试试这个,估计也差不多
在主线程中:
mysql_library_init(0, NULL, NULL);
mysql_library_end()
其他线程中:
初始化:
mysql_thread_init();
MYSQL *mysql = mysql_init(NULL);
关闭:
mysql_close(mysql);
mysql_thread_end();
好了,就写到这吧。
以上就是最新一期更新的内容。感谢收看。