最近在学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

本文详细介绍如何在Ubuntu环境中安装MySQL数据库,并通过示例代码演示如何进行基本的数据库操作,如创建数据库、表及插入数据等。
1484

被折叠的 条评论
为什么被折叠?



