最近在學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.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