末点 2019-12-31
再插播一下C++对 MySQL的操作。
前边在 Red Hat 上安装了 MySQL 数据库,接下来我需要用C++ 在 Linux 上对 MySQL 读写操作。
我们先模拟一个相对真实的生产环境。
我有两台 Linux 机器,一台安装 MySQL 数据库,一台作为我的 Application 用的应用服务器。或者传统的,我的数据库服务器可能会用 HP 小型机,IBM AIX。整体结果如下图:
所以我准备了两台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中的截图)
接下来我需要用到 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
完成收工。