MySQL是一個的開源關係型資料庫,對於服務端開發來說是一個優秀的選擇。本篇內容將介紹如何在C++程式里操作MySQL資料庫。 ...
MySQL是一個的開源關係型資料庫,對於服務端開發來說是一個優秀的選擇。本篇內容將介紹如何在C++程式里操作MySQL資料庫。
—————————————————————————————————————————————————————————————
閱讀本篇內容之前你需要先瞭解以下知識:
C++編譯鏈接基本原理
make相關知識
SQL基礎知識和CRUD基礎操作能力
—————————————————————————————————————————————————————————————
一. MySQL在CentOS下的安裝
這部分內容相當簡單,也有不少資料,請參考本篇文章。
二. MySQL CRUD基本操作和SQL語法
資料庫的增刪改查沒什麼好說的,請參考這裡。
三. 在C++中使用MySQL
本節內容是我們的重點。學好了MySQL對CRUD的基礎操作,那麼如何跟C++代碼結合起來呢?
MySQL其實提供了C實現的介面,而MySQL++則是一個C++實現的封裝MySQL C介面的一個Wrapper,遵循了標準C++的規則,是個跨平臺的開源工具。我們主要用MySQL++來開發C++程式。
1. 安裝和配置
還是萬年不變的新手主題——安裝和配置
安裝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
到這裡就配置完成了。
2. C++調用mysql++
我先用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/