Linux 下C++ 操作 MySQL

末点 2019-12-31

再插播一下C++对 MySQL的操作。

前边在 Red Hat 上安装了 MySQL 数据库,接下来我需要用C++ 在 Linux 上对 MySQL 读写操作。

我们先模拟一个相对真实的生产环境。

我有两台 Linux 机器,一台安装 MySQL 数据库,一台作为我的 Application 用的应用服务器。或者传统的,我的数据库服务器可能会用 HP 小型机,IBM AIX。整体结果如下图:

Linux 下C++ 操作 MySQL

所以我准备了两台Linux VM, 其中一台是前边用到的安装 MySQL的 RedHat, 另外一台是新安装的 RH。

我需要在这台新的VM 中连接并操作MySQL数据库。首先需要保证我能够在这台机器上telnet MySQL的服务端口号。

因为我需要用到 MySQL 提供的lib 库,所以我将MySQL服务器中的头文件和lib库都拷贝过来。我放在这个目录中  /daniel/mysql

[ mysql]$ pwd
/daniel/mysql
[ mysql]$ ll
total 8
drwxrwxr-x. 3 daniel daniel 4096 Dec 29 17:18 include
drwxrwxr-x. 7 daniel daniel 4096 Dec 29 15:26 lib
[ mysql]$

我在另一台机器上需要连接数据库,我不能将root 密码告诉别人,而是创建了一个数据库,再创建一个用户,这个用户在对应的数据库中有类似DBA 的权限,可以对所有变执行增删改查,同时可以创建表,修改表结构。

delimiter $$

CREATE DATABASE `CRM` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION=‘N‘ */$$

创建用户,赋权限

create user ‘user1‘@‘%‘ identified by ‘123456‘;

GRANT ALL ON CRM.* TO ‘CRM‘@‘%‘;

创建表和存储过程。(为了简单我只给出表结构和存储过程在MySQL Workbench中的截图)

Linux 下C++ 操作 MySQL

Linux 下C++ 操作 MySQL

接下来我需要用到 MySQL提供的 API 函数进行操作了。

具体代码可以看这里 https://github.com/danielhu1983/Tools/tree/master/MySQLSample 下的代码

1. MySQL connection 类

调用  mysql_init 初始化connection

调用 mysql_real_connect 连接数据库

最后使用 mysql_close 关闭连接

2. MySQL DBHelper 类

提供Init 接口,调用 MySQL connection 的 init 方法,connect 方法

提供Exec 接口,调用 mysql_real_query 执行 SQL 命令

3. main 函数

调用MySQL DBHelper中的 init 函数和 exec 函数。

Makefile 中,

我需要再次单独指定需要查找头文件的路径。

MYSQL_ROOT = /daniel/mysql

HEADER_PATH=-I$(MYSQL_ROOT)/include

这只是编译用的,最终link 的时候还需要指定用到的 so 文件。这时候我从安装了 MySQL Server 的机器中执行如下命令,得到输出结果

[ ~]$ mysql_config --libs
-L/mysql/mysqlroot/lib -Wl,-R,/mysql/mysqlroot/lib -lmysqlclient -lpthread -lm -lrt -lssl -lcrypto -ldl
[ ~]$

上边红色高亮部分,在我没安装 MySQL 的机器上要改为对应的目录,比如我的 Makefile 文件中是这么写的

LIBS=-L$(MYSQL_ROOT)/lib -Wl,-R,$(MYSQL_ROOT)/lib -lmysqlclient -lpthread -lm -lrt -lssl -lcrypto -ldl

然后在机器中执行 make 命令,生成的可执行文件为 MySQL.1.0.0.1

在使用前,我需要在我的环境中配置好环境变量,打开 home 目录下的 .bash_profile 文件

export MYSQL_HOME=/daniel/mysql

export LD_LIBRARY_PATH=$MYSQL_HOME/lib:$LD_LIBRARY_PATH

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

这里我指定了LD_LIBRARY_PATH的路径,让程序可以从/daniel/mysql/lib 目录下找到MySQL 对应的lib库

代码中的SQL 我使用的是调用存储过程,所以最后结果可能是这样

[ MySQLSample]$ ./MySQL.1.0.0.1 
1 Daniel 
2 Daniel

完成收工。

相关推荐