直接操作MySQL,输入命令效率低,将MySQL嵌入程序中,封装接口,让程序去访问MySQL,才能最大效益利用MySQL。
MySQL C API移植
包含MySQL的工程文件不应直接关联电脑已安装的MySQL,因为不同电脑服务器安装的位置不一样,每次移植都需要重新部署安装环境。应该将MySQL的头文件以及操作的库文件一并拷贝到工程文件中,这样即使移植到别的安装有MySQL电脑或服务器,就不需要重新定位头文件以及相关的库文件,直接操作访问数据库。除非随着MySQL的版本升级导致接口参数改变,否则就可以直接利用。
移植之后即使设备没装MySQL也可以编译代码,只是没有MySQL不能运行而已,工程不因设备未MySQL而不能编译通过。
移植MySQL头文件
在linux中构建的Makefile工程要安装libmysqlclient-dev才能使用API接口的头文件。
命令:sudo apt-get install libmysqlclient-dev
安装好后的头文件在:/usr/include/mysql
ghost@ghost-machine:/usr/include$ ls mysql/
big_endian.h my_global.h plugin_audit.h
binary_log_types.h my_list.h plugin_auth_common.h
byte_order_generic.h mysql plugin_ftparser.h
byte_order_generic_x86.h mysql_com.h plugin_group_replication.h
decimal.h mysql_com_server.h plugin.h
errmsg.h mysqld_ername.h plugin_keyring.h
keycache.h mysqld_error.h plugin_validate_password.h
little_endian.h mysql_embed.h psi
m_ctype.h mysql.h sql_common.h
m_string.h mysql_time.h sql_state.h
my_alloc.h mysql_version.h sslopt-case.h
my_byteorder.h mysqlx_ername.h sslopt-longopts.h
my_command.h mysqlx_error.h sslopt-vars.h
my_compiler.h mysqlx_version.h thr_cond.h
my_config.h my_sys.h thr_mutex.h
my_dbug.h my_thread.h thr_rwlock.h
my_dir.h my_thread_local.h typelib.h
my_getopt.h my_xml.h
Windows的MySQL头文件即在安装目录里面。
MySQL头文件:C:\Program Files\MySQL\MySQL Server 5.7\include\
C++操作头文件:C:\Program Files\MySQL\Connector.C++ 1.1
windows和linux的头文件结构略有差异,但大体都是相等的,此次移植是linux的MySQL头文件。
不推荐使用C++操作头文件,因为需要用到boost库,boost库安装编译繁琐。
将头文件全部复制到工程头文件中。
命令:test_makefile/inc$ cp /usr/include/mysql/ ./ -rf
复制之后的工程头文件目录如下图所示
Makefile工程:
将头文件加入到Makefile中,编辑Makefile。
NC += -I$(DIR)/inc/mysql
Visual Studio工程
引用头文件如下图所示
移植MySQL库文件
Makefile工程
由于Makefile工程移植的库文件为.so或.a的库文件,因此一定要移植Linux下的MySQL库文件。
同头文件一样,linux要安装libmysqlclient-dev才能使用API接口的头文件。
命令:
sudo apt-get install libmysqlclient-dev
安装好后的库文件在:/usr/lib/mysql和/usr/lib下
Visual Studio工程
与Linux不同的是,Visual Studio工程移植的库文件为.lib或.dll的库文件。
库文件位置:
C:\Program Files\MySQL\MySQL Server 5.7\lib
文件位置即MySQL安装位置。
如下图所示
将库文件全部拷贝到工程库文件目录下
├── open_lib
│ ├── MySQL_lib
│ │ ├── libmysql.dll
│ │ ├── libmysql.lib
│ │ └── mysqlclient.lib
项目引用库文件,如下图所示
添加工程运行环境dll。为保证程序运行后不需要依赖系统的环境变量,需要将dll放到编译器的输出文件夹中,如定义了obj为输出文件夹,就dll放到该文件夹中。如下图所示。
添加MySQL示例
工程添加MySQL示例测试MySQL移植工程。
module_MySQL.cpp
#include "module_MySQL.h"
#include <iostream>
#include <string>
#include <mysql/mysql.h>
using namespace std;
void TestMySQL(void)
{
cout << __FUNCTION__ << " is called." << endl;
MYSQL mysql;
mysql_init(&mysql);
mysql_real_connect(&mysql, "localhost", "zxpro-admin", "qwerty", "zx_mysql", 3306, NULL, 0);
//MySQL命令
string sql = "select * from zx_users;";
mysql_query(&mysql, sql.c_str());
try
{
MYSQL_RES *result = mysql_store_result(&mysql);
if (!result)
throw string("MySQL not result!");
//获取字段数量
int num_fields = mysql_num_fields(result);
if(0 == num_fields)
throw string("MySQL fields number is 0!");
//获取字段名
MYSQL_FIELD *fields = mysql_fetch_fields(result);
if (!fields)
throw string("MySQL fields fetch is error!");
for (int i = 0; i < num_fields; i++)
{
cout << "field " << i << " name is " << fields[i].name << endl;
}
cout << "MySQL is OK." << endl;
}
catch (string &error_msg)
{
cout << error_msg << endl;
}
catch (...)
{
cout << "MySQL operation is error!" << endl;
}
mysql_close(&mysql);
}
数据库结构下图所示。
示例工程运行结果如下图所示。
MySQL C API
官方文档:https://dev.mysql.com/doc/refman/5.7/en/c-api.html
头文件包含
要使用MySQL的接口API,需要包含头文件
#include <mysql/mysql.h>
登录MySQL:mysql_init(),mysql_real_connect()
函数原型:
MYSQL * STDCALL mysql_init(MYSQL *mysql);
//成功返回*mysql指针,失败返回NULL。
MYSQL * STDCALL mysql_real_connect(MYSQL *mysql,
const char *host, //MySQL的IP,远程登录输入远程登录的IP地址
const char *user, //登录用户
const char *passwd, //登录密码
const char *db, //使用的数据库名称
unsigned int port, //MySQL端口
const char *unix_socket, //是否使用socket机制登录,NULL:否
unsigned long clientflag); //连接标志,通常为0
//成功返回*mysql指针,失败返回NULL。
clientflag连接标志在文件:mysql_com.h 以#define CLIENT_*定义
以下截取片段: