Ubuntu系統MySQL嵌入式開發入門(C++)

最近在學Ubuntu軟件開發,需要嵌入式數據庫,作爲備忘錄,也希望對初學者有所幫助


首先安裝MySQL

sudo apt-get install mysql-server mysql-client


再安裝G++依賴的mysql.h的依賴包,見另一篇博客:fatal error: mysql.h:沒有那個文件或目錄

sudo apt-get install libmysqlclient-dev


運行MySQL

mysql -u root -p


創建一個簡單的數據庫

mysql>create database test; 
mysql>use test;    //切換到test數據庫中
mysql> create table test(name varchar(255),num int(10) ); //創建一個叫test的表
mysql>show create table test;  //顯示剛纔創建的表信息
mysql> select * from test;   //查詢test表中數據
mysql>quit


用vim簡單寫一個test.cpp 的測試文件

#include <stdio.h>
#include <mysql.h>
int main(int argc,char *argv[])
{
    MYSQL conn;
    int res;
    mysql_init(&conn);
    if(mysql_real_connect(&conn,"localhost","root","8520","test",0,NULL,CLIENT_FOUND_ROWS))
    //"root":數據庫管理員 "":root密碼 "test":數據庫的名字
    {
        printf("connect success!\n");
        res=mysql_query(&conn,"insert into test values('user','123456')");
        if(res)
        {
            printf("error\n");
        }
        else
        {
            printf("OK\n");
        }
        mysql_close(&conn);
    }
    else
    {
        printf("Database can not connect!!!!");
    }
    return 0;
}


編譯命令:注意`是跟波浪線在一起的那個符號
g++ test.cpp `mysql_config --cflags --libs` -o test
運行test

./test
就可以把這條數據存儲進MySQL了

/×××××××××××××××××××××××××分割線×××××××××××××××××××××××××××××××××××××/

接下來是多文件,多線程訪問數據庫。目前還有bug。。。數據庫總報錯,連接不上

/*****************
main.cc
******************/
#include "MySQLManager.h"
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    MySQLManager *mysql = new MySQLManager("127.0.0.1", "root", "xufeiyang", "mytest", (unsigned int)3306);
    mysql->initConnection();
    if(mysql->getConnectionStatus())
    {
        if(mysql->runSQLCommand("select * from student"))
        {
            vector<vector<std::string> > result = mysql->getResult();
            for(auto & vec : result)
            {
                for(auto &str : vec)
                {cout << str.c_str() << " ";}
                    cout << endl;
            }
        }
        else
        cout << "執行失敗" << endl;
    }
    else
    cout << "連接未建立" << endl;
    return 0;
}
/*
* MySQLManager.h
*/
#ifndef MYSQLMANAGER_H_
#define MYSQLMANAGER_H_
#include <mysql.h>
#include <string>
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;
class MySQLManager
{
public:
MySQLManager(std::string hosts, std::string userName, std::string password, std::string dbName, unsigned int port);
~MySQLManager();
void initConnection();
bool runSQLCommand(std::string sql);
unsigned int insert(std::string sql);
void destroyConnection();
bool getConnectionStatus();
vector< vector<string> > getResult();
protected:
void setUserName(std::string userName);
void setHosts(std::string hosts);
void setPassword(std::string password);
void setDBName(std::string dbName);
void setPort(unsigned int port);
private:
bool IsConnected;
vector< vector<string> > resultList;
MYSQL mySQLClient;
unsigned int DEFAULTPORT;
char * HOSTS;
char * USERNAME;
char * PASSWORD;
char * DBNAME;
};
#endif /* MYSQLMANAGER_H_ */

/***************************************
MySQLManager.cc
***************************************/
#include "MySQLManager.h"    
MySQLManager::MySQLManager(string hosts, string userName, string password, string dbName, unsigned int port)    
{    
        IsConnected = false;    
        this ->setHosts(hosts);            //    設置主機IP地址    
        this ->setUserName(userName);            //    設置登錄用戶名    
        this ->setPassword(password);            //    設置登錄密碼    
        this ->setDBName(dbName);            //    設置數據庫名    
        this ->setPort(port);            //    設置端口號    
}
MySQLManager::~MySQLManager()    
{    
        this ->destroyConnection();    
}

void MySQLManager::setDBName(string dbName)    
{    
        if ( dbName.empty() )    
        {//        用戶沒有指定數據庫名    
                std::cout << "DBName is null! Used default value: mysql" << std::endl;    
                this ->DBNAME = new char[5];    
                strcpy(this ->DBNAME, "mysql");    
        }    
        else    
        {    
                this ->DBNAME = new char[dbName.length()];    
                strcpy(this ->DBNAME, dbName.c_str());    
        }    
}
void MySQLManager::setHosts(string hosts)    
{    
        if (hosts.empty())    
        {//    用戶沒有指定數據庫IP地址    
                std::cout << "Hosts is null! Used default value: localhost" << std::endl;    
                this ->HOSTS = new char[9];    
                strcpy(this ->HOSTS, "localhost");    
        }    
        else    
        {    
                this ->HOSTS = new char[hosts.length()];    
                strcpy(this ->HOSTS, hosts.c_str());    
        }    
}    

void MySQLManager::setPassword(string password)    
{//    用戶沒有指定密碼    
        if ( password.empty() )    
        {    
                std::cout << "Password is null! Used default value: " << std::endl;    
                this ->PASSWORD = new char[1];    
                strcpy(this ->PASSWORD, "");    
        }    
        else    
        {    
                this ->PASSWORD = new char[password.length()];    
                strcpy(this ->PASSWORD, password.c_str());    
        }    
}    

void MySQLManager::setPort(unsigned int port)    
{//    用戶沒有指定端口號,使用默認端口號    
        if ( port <= 0 )    
        {    
                std::cout << "Port number is null! Used default value: 0" << std::endl;    
                this->DEFAULTPORT = 0;
        }    
        else    
        {    
                this ->DEFAULTPORT = port;    
        }    
}    

void MySQLManager::setUserName(string userName)    
{//    用戶沒有指定登錄用戶名    
        if ( userName.empty() )    
        {    
                std::cout << "UserName is null! Used default value: root" << std::endl;    
                this ->USERNAME = new char[4];    
                strcpy(this ->USERNAME, "root");    
        }    
        else    
        {    
                this ->USERNAME = new char[userName.length()];    
                strcpy(this ->USERNAME, userName.c_str());    
        }    
}    

void MySQLManager::initConnection()    
{    
        if ( IsConnected )    
        {//    已經連接到服務器    
                std::cout << "Is connected to server!" <<std::endl;    
                return;    
        } 
        mysql_init(&mySQLClient);//    初始化相關對象    
        if ( !mysql_real_connect( &mySQLClient, HOSTS, USERNAME, PASSWORD, DBNAME, DEFAULTPORT, NULL, 0) )    
        {//    連接到服務器連接到服務器
                cout << "HHHHHHHHHHHHH"<<endl;
                std::cout << "Error connection to database: \n" << mysql_error(&mySQLClient) << std::endl;    
        }    
        IsConnected = true;//    修改連接標識    
}    

bool MySQLManager::runSQLCommand(string sql)    
{    
        if (!IsConnected )
        {
                std::cout << "Not connect to database!" << std::endl;    
                return false;    
        }    
        if (sql.empty())    
        {//    SQL語句爲空    
                std::cout << "SQL is null!" << std::endl;    
                return false;    
        }    

        MYSQL_RES *res;    
        MYSQL_ROW row;    

        unsigned int i,j = 0;    

        i = mysql_real_query(&mySQLClient,sql.c_str(),(unsigned int)strlen(sql.c_str()));//    執行查詢    
        if ( i < 0 )    
        {    
                std::cout << "Error query from database: \n" << mysql_error(&mySQLClient) << std::endl;    
                return false;    
        }    
        res = mysql_store_result(&mySQLClient);    
        vector<string> objectValue;    
        while( (row = mysql_fetch_row(res)) )    
        {//    遍歷結果集    
                objectValue.clear();    
                for ( j = 0 ; j < mysql_num_fields(res) ; j++ )    
                {    
                        objectValue.push_back(row[j]);    
                }    
                this ->resultList.push_back(objectValue);    
        }    
        mysql_free_result(res);         //free result after you get the result    

        return true;    
}
unsigned int MySQLManager::insert(std::string sql)
{
    if(!IsConnected)
    {
        cout << "" << endl;
        return -1;
    }
    if(sql.empty()){
        cout << "sql is null " << endl;
        return -1;
    }
    int rows = -1;
    int res = mysql_query(&mySQLClient, sql.c_str());
    if(res >= 0){
        // 返回受影響的行數
        rows = mysql_affected_rows(&mySQLClient);
        cout << "Inserted "<< rows << " rows\n";
        return rows;
    } else {
        cout << "Insert error " << mysql_errno(&mySQLClient) << "," << mysql_error(&mySQLClient) << endl;
        return -1;
    }
}
vector< vector<string> > MySQLManager::getResult()    
{    
        return resultList;    
}    

void MySQLManager::destroyConnection()    
{    
       mysql_close(&mySQLClient);    
       this ->IsConnected = false;    
}
bool MySQLManager::getConnectionStatus()    
{    
        return IsConnected;    
}

編譯

g++ main.cc MySQLManager.cc -o main -std=c++11 -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient

發佈了27 篇原創文章 · 獲贊 33 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章