MySQL是一个的开源关系型数据库,对于服务端开发来讲是一个优秀的选择。本篇内容将介绍如何在C++程序里操做MySQL数据库。html
—————————————————————————————————————————————————————————————node
阅读本篇内容以前你须要先了解如下知识:mysql
C++编译连接基本原理ios
make相关知识sql
SQL基础知识和CRUD基础操做能力数据库
—————————————————————————————————————————————————————————————centos
这部份内容至关简单,也有很多资料,请参考本篇文章。缓存
数据库的增删改查没什么好说的,请参考这里。app
本节内容是咱们的重点。学好了MySQL对CRUD的基础操做,那么如何跟C++代码结合起来呢?工具
MySQL其实提供了C实现的接口,而MySQL++则是一个C++实现的封装MySQL C接口的一个Wrapper,遵循了标准C++的规则,是个跨平台的开源工具。咱们主要用MySQL++来开发C++程序。
仍是万年不变的新手主题——安装和配置
安装MySQL++以前须要先安装MySQL:
[root@localhost zhxilin]# yum install mysql-devel [root@localhost zhxilin]#
紧接着下载MySQL++源码并解压,咱们把压缩包解压到/usr/mysql++下:
[root@localhost zhxilin]# cd 下载 [root@localhost 下载]# wget http://www.tangentsoft.net/mysql++/releases/mysql++-3.2.2.tar.gz [root@localhost 下载]# tar -zxvf mysql++-3.2.2.tar.gz -C /usr/ [root@localhost usr]# mv mysql++-3.2.2 mysql++
进入mysql++目录下,开始编译,先执行./configure生成makefile文件,以后再make,编译出libmysqlpp.so库文件:
[root@localhost mysql++]# ./configure --enable-thread-check
[root@localhost mysql++]# make
[root@localhost mysql++]# make install
install成功后会将.so文件拷贝到/usr/local/lib下,并把.h头文件拷贝到/usr/local/include下。
到这里MySQL++已经安装到本机了,然而若是直接在C++代码里引用以下头文件是没法编译经过的!
#include <mysql++.h>
缘由是C++在编译时须要加载这个动态库,默认状况下,g++编译器只会使用/lib和/usr/lib这两个目录下的库文件。回头看一下make以前的./configure步骤,咱们并无指定--prefix=/some/path,因此库会默认安装到/usr/local目录下。既然libmysqlpp.so是在/usr/local/lib下,编译器固然就没法找到它的定义了。
那么编译器如何正确找到/usr/local/lib目录呢?
/etc/ld.so.conf文件记录了编译器编译时使用的动态库路径!那咱们把/usr/local/lib路径加入到文件末尾就能够了!
次配置文件修改保存后,经过ldconfig程序(在usr/sbin/下),将/etc/ld.so.conf文件列举的路径下的库文件缓存到/etc/ld.so.cache以供开发使用:
[root@localhost mysql++]# ldconfig
建议多作一步,建立so的链接:
[root@localhost mysql++]# ln -s /usr/local/lib/libmysqlpp.so /usr/lib/libmysqlpp.so
到这里就配置完成了。
我先用MySQL建立了一个test数据库,并添加了一张Student表,结构以下:
而且插入了以下一些测试数据:
在C++代码里,咱们链接这个test数据库以后,进行一个查询,并将结果打印出来:
1 #include <mysql++.h> 2 #include <iostream> 3 4 using namespace std; 5 int main() 6 { 7 const char* db = 0, *server = 0, *user = 0, *password = ""; 8 db = "test"; 9 server = "localhost"; 10 user = "zhxilin"; 11 password = ""; 12 13 mysqlpp::Connection conn(false); 14 if (conn.connect(db, server, user, password)) { 15 cout << "connect db succeed. " << endl; 16 mysqlpp::Query query = conn.query("SELECT * FROM Student"); 17 if (mysqlpp::StoreQueryResult res = query.store()) { 18 cout.setf(ios::left); 19 cout << setw(31) << "Sid" << 20 setw(10) << "Sname" << 21 setw(10) << "Sage" << 22 setw(10) << "Sgender" << 23 setw(10) << "SDepartment" << endl; 24 25 mysqlpp::StoreQueryResult::const_iterator it; 26 for (it = res.begin(); it != res.end(); ++it) { 27 mysqlpp::Row row = *it; 28 cout << setw(30) << row[0] << ' ' << 29 setw(9) << row[1] << ' ' << 30 setw(9) << row[2] << ' ' << 31 setw(9) << row[3] << ' ' << 32 setw(9) << row[4] << ' ' << 33 endl; 34 } 35 } 36 } else { 37 cout << "connect db fail. " << endl; 38 } 39 return 0; 40 }
编译命令以下,编译时须要连接mysql和mysql++:
g++ -o main hello.cpp -lmysqlpp -I/usr/include/mysql -I/usr/local/include/mysql++
解释一下后面这段参数:
-Ldir(大写/eL/):编译时查找路径dir,这里分别是/usr/lib/mysql和/usr/local/lib,分别指mysql和mysql++所在目录(<---修改:这里不须要写了,由于ld.so.conf已经加上/usr/local/lib,/usr/lib和/usr/local/lib都能默认找到)
-llib(小写/eL/):编译时连接的库lib,这里是mysqlpp,即libmysqlpp.o;(<---修改:编译器在查找的时候有隐式规则,即在指定的名字前加lib,后加.so来查找对应的库文件)
-Idir(大写/ai/):编译时包含库头文件路径,这里分别是/usr/include/mysql和/usr/local/include/mysql++;(<---修改:这里还须要是由于.h文件分别放在include目录下的mysql文件夹和mysql++文件夹下,若是.h直接在include目录中就没必要写了)
写成makefile就是以下:
main : hello.cpp @g++ -o main hello.cpp -lmysqlpp -I/usr/include/mysql -I/usr/local/include/mysql++ clean: @rm main
执行结果以下:
数据库连接成功并成功查询了Student表里的数据。
MySQL++的更多用法,请参考官方文档http://www.tangentsoft.net/mysql++/doc/html/userman/