在C++裡操作MySQL資料庫的例子

來源:互聯網
上載者:User

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 -L/usr/lib/mysql -L/usr/local/lib -lmysqlpp -Ilib -I/usr/include/mysql -I/usr/local/include/mysql++
解釋一下後面這段參數:

-Ldir(大寫/eL/):編譯時間尋找路徑dir,這裡分別是/usr/lib/mysql和/usr/local/lib,分別指mysql和mysql++所在目錄;

-llib(小寫/eL/):編譯時間連結的庫lib,這裡是mysqlpp,即libmysqlpp.o;

-Idir(大寫/ai/):編譯時間包含庫標頭檔路徑,這裡分別是/usr/include/mysql和/usr/local/include/mysql++;

寫成makefile就是如下:

main : hello.cpp
        @g++ -o main hello.cpp -L/usr/lib/mysql -L/usr/local/lib -lmysqlpp -Ilib -I/usr/include/mysql -I/usr/local/include/mysql++
clean:
        @rm main
執行結果如下:


資料庫連結成功並成功查詢了Student表裡的資料。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.