【菜鳥玩Linux開發】在C++裏操做MySQL

MySQL是一個的開源關係型數據庫,對於服務端開發來講是一個優秀的選擇。本篇內容將介紹如何在C++程序裏操做MySQL數據庫。html

—————————————————————————————————————————————————————————————node

閱讀本篇內容以前你須要先了解如下知識:mysql

C++編譯連接基本原理ios

make相關知識sql

SQL基礎知識和CRUD基礎操做能力數據庫

—————————————————————————————————————————————————————————————centos

 

一. MySQL在CentOS下的安裝

這部份內容至關簡單,也有很多資料,請參考本篇文章緩存

二. MySQL CRUD基本操做和SQL語法

數據庫的增刪改查沒什麼好說的,請參考這裏app

三. 在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/

相關文章
相關標籤/搜索