ubuntu16.04 用mysql数据库进行数据管理项目实例(笔记)

主要包含以下文件: 

data.hpp:

#include <iostream>
#include <string>
#include <jsoncpp/json/json.h>
#include<cstdlib>
#include<mutex>
#include<mysql/mysql.h>

namespace order_sys{
#define DB_HOST "127.0.0.1"
#define DB_USER "root"
#define DB_PASS "1111"
#define DB_NAME "db_96"
 //返回一个初始化完成的Mysql操作句柄
 MYSQL *MysqlInit()
{
  //初始化句柄
   MYSQL *mysql = mysql_init(NULL);
  if(mysql == NULL)
  {
   std::cout<<"init mysql handler failed!\n";
   return NULL;
  }
  //连接mysql服务器
  if(mysql_real_connect(mysql,DB_HOST,DB_USER,DB_PASS,DB_NAME,0,NULL,0)==NULL)
  {
   std::cout<<"connect mysql server failed:"<<mysql_error(mysql)<<std::endl;
   mysql_close(mysql);
   return NULL;
  }
  //设置字符集
  if(mysql_set_character_set(mysql,"utf8")!=0)
  {
   std::cout<<"set client character failed:"<<mysql_error(mysql)<<std::endl;
   mysql_close(mysql);
   return NULL;
  }
  //返回句柄
  return mysql;
}

 //mysq1句柄的销毁接口
 void MysqlDestroy(MYSQL *mysql)
 {
  if(mysql!=NULL)
  {
   mysql_close(mysql);
   return;
  }
 }


 //Mysq1语句执行接口
bool MysqlQuery(MYSQL *mysql, const std::string &sql)
{
 int ret = mysql_query(mysql,sql.c_str());
 if(ret!=0)
 {
  std::cout<<sql<<std::endl;
  std::cout<<"query failed:"<<mysql_error(mysql)<<std::endl;
  return false;
 }
return true;
}


class TableDish {
  private :
     std::mutex _mutex;
     MYSQL *_mysql;
  public :
//初始化数据库操作句柄
    TableDish():_mysql(NULL)
    {
      _mysql = MysqlInit();
      if(_mysql == NULL)
     {
      exit(-1);
     }
    }
//释放销毁数据库操作句柄

~TableDish()
{
 MysqlDestroy(_mysql);
}

//dish传入要新增的菜品信息
bool Insert(const Json::Value &dish)
{
 if(dish["name"].empty()==true || dish["name"].asString().size()==0)
 {
  std::cout<<"new dish name is not exists!\n";
  return false;
 }
 if(dish["price"].empty()==true||dish["price"].asInt() <= 0)
 {
  std::cout<<"new dish price is error!\n";
  return false;
 }
 if(dish["info"].empty()==true || dish["info"].asString().size()==0)
 {
  std::cout<<"new dish info is null!\n";
  return false;
 }
  char sql[4096]={0};
 #define INSERT_DISH "insert tb_dish values(null,'%s','%d','%s',now());"
 sprintf(sql,INSERT_DISH,dish["name"].asCString(),dish["price"].asInt(),dish["info"].asCString());
 return MysqlQuery(_mysql,sql);
}


//将dish_ id对应的菜品信息修改为新的dish菜品信息
bool Update(int dish_id, const Json::Value &dish)
{
 char sql[4096]={0};
 #define UPDATE_DISH "update tb_dish set name='%s',price=%d,info='%s',ctime=now() where id=%d"
 sprintf(sql,UPDATE_DISH,dish["name"].asCString(),dish["price"].asInt(),dish["info"].asCString(),dish_id);
 return MysqlQuery(_mysql,sql);
}

//dish__id就是要删除的菜品信息ID
bool Delete(int dish_id)
{
 #define DELETE_DISH "delete from tb_dish where id=%d;"
 char sql[4096] = {0};
 sprintf(sql,DELETE_DISH,dish_id);
 return MysqlQuery(_mysql,sql);
}

//dishes作为输出参数,返回所有菜品信息
bool GetAll(Json::Value *dishes)
{
 #define SELECT_ALLDISH "select id,name,price,info,ctime from tb_dish;"
 _mutex.lock();
  bool ret =MysqlQuery(_mysql,SELECT_ALLDISH);
 if(ret==false)
 {
  _mutex.unlock();
  return false;
 }
 MYSQL_RES *res= mysql_store_result(_mysql);
 if(res==NULL)
 {
  printf("store result failed!:%s\n",mysql_error(_mysql));
  _mutex.unlock();
 return -1;
 }
 _mutex.unlock();
 int num_row = mysql_num_rows(res);

  if(num_row<1)
 {
  std::cout<<"have no dish!\n";
  return false;
 }

 for(int i=0;i<num_row;i++)
 {
 MYSQL_ROW row = mysql_fetch_row(res);
 Json::Value dish;
 dish["id"] = atoi(row[0]);
 dish["name"] = row[1];
 dish["price"] = atoi(row[2]);
 dish["info"]=row[3];
 dish["ctime"] = row[4];
 dishes->append(dish);
 }
mysql_free_result(res);
return true;
}


bool GetOne(int dish_id,Json::Value *dish)
{
 #define SELECT_ONEDISH "select name,price,info,ctime from tb_dish where id=%d;"
char sql[4096]={0};
 sprintf(sql,SELECT_ONEDISH,dish_id);
  _mutex.lock();
 bool ret=MysqlQuery(_mysql,sql);
  if(ret ==false)
  {
    _mutex.unlock();
   return false;
  
  }
  MYSQL_RES *res=mysql_store_result(_mysql);
  if(res==NULL)
  {
   printf("store result failed!:%s\n",mysql_error(_mysql));
  _mutex.unlock();
   return false;
  }
_mutex.unlock();
 int num_row = mysql_num_rows(res);
 if(num_row<1)
 {
  std::cout<<"have no dish:"<<dish_id<<std::endl;
  return false;
 }
   
  MYSQL_ROW row = mysql_fetch_row(res);
 (*dish)["id"] = dish_id;
 (*dish)["name"] = row[0];
 (*dish)["price"]= atoi(row[1]);
 (*dish)["info"] = row[2];
 (*dish)["ctime"]= row[3];
 mysql_free_result(res);
return true;
}

};


class TableOrder {
  private :
     std::mutex _mutex;
     MYSQL *_mysql;
  public :
//初始化数据库操作句柄
    TableOrder():_mysql(NULL)
    {
      _mysql = MysqlInit();
      if(_mysql == NULL)
     {
      exit(-1);
     }
    }
//释放销毁数据库操作句柄

~TableOrder()
{
 MysqlDestroy(_mysql);
}

//order传入要新增的菜品信息
bool Insert(const Json::Value &order)
{
 //id dishes status ctime mtime
  char sql[4096]={0};
 #define INSERT_ORDER "insert tb_order values(null,'%s',0,now(),now());"
 //order["dishes"]存放的是一个序列化完成的菜品id的json字符串,具体的解析外借管
 sprintf(sql,INSERT_ORDER,order["dishes"].asCString());
 return MysqlQuery(_mysql,sql);
}


//将order_ id对应的菜品信息修改为新的order菜品信息
bool Update(int order_id, const Json::Value &order)
{
 char sql[4096]={0};
 #define UPDATE_ORDER "update tb_order set status=%d,mtime=now() where id=%d"
 sprintf(sql,UPDATE_ORDER,order["status"].asInt(),order_id);
 return MysqlQuery(_mysql,sql);
}

//order__id就是要删除的菜品信息ID
bool Delete(int order_id)
{
 #define DELETE_ORDER "delete from tb_order where id=%d;"
 char sql[4096] = {0};
 sprintf(sql,DELETE_ORDER,order_id);
 return MysqlQuery(_mysql,sql);
}

//orderes作为输出参数,返回所有菜品信息
bool GetAll(Json::Value *orderes)
{
 #define SELECT_ALLORDER "select id,dishes,status,ctime,mtime from tb_order;"
 _mutex.lock();
  bool ret =MysqlQuery(_mysql,SELECT_ALLORDER);
 if(ret==false)
 {
  _mutex.unlock();
  return false;
 }
 MYSQL_RES *res= mysql_store_result(_mysql);
 if(res==NULL)
 {
  printf("store result failed!:%s\n",mysql_error(_mysql));
  _mutex.unlock();
 return -1;
 }
 _mutex.unlock();

 int num_row = mysql_num_rows(res);
 
 if(num_row<1)
 {
  std::cout<<"have no orders!\n";
  return false;
 }


 for(int i=0;i<num_row;i++)
 {
 MYSQL_ROW row = mysql_fetch_row(res);
 Json::Value order;
 order["id"] = atoi(row[0]);
 order["dishes"] = row[1];
 order["status"] = atoi(row[2]);
 order["ctime"]=row[3];
 order["mtime"] = row[4];
 orderes->append(order);
 }
mysql_free_result(res);
return true;
}


bool GetOne(int order_id,Json::Value *order)
{
 #define SELECT_ONEORDER "select dishes,status,ctime,mtime from tb_order where id=%d;"
char sql[4096]={0};
 sprintf(sql,SELECT_ONEORDER,order_id);
  _mutex.lock();
 bool ret=MysqlQuery(_mysql,sql);
  if(ret ==false)
  {
    _mutex.unlock();
   return false;
  
  }
  MYSQL_RES *res=mysql_store_result(_mysql);
  if(res==NULL)
  {
   printf("store result failed!:%s\n",mysql_error(_mysql));
  _mutex.unlock();
   return false;
  }
_mutex.unlock();
 int num_row = mysql_num_rows(res);
 if(num_row<1)
 {
  std::cout<<"have no order:"<<order_id<<std::endl;
  return false;
 }
   
  MYSQL_ROW row = mysql_fetch_row(res);
 (*order)["id"] = order_id;
 (*order)["dishes"] = row[0];
 (*order)["status"]= atoi(row[1]);
 (*order)["ctime"] = row[2];
 (*order)["mtime"]= row[3];
 mysql_free_result(res);
return true;
}

};




}

makefile:

main:main.cpp data.hpp
	g++ -std=c++11 $^ -o $@ -L/usr/lib/mysql -ljsoncpp -lmysqlclient

1.新增一条数据: 

main.cpp:

  #include "data.hpp"
 
  int main()
  {
   order_sys::TableDish *pdish = new order_sys::TableDish();
   Json::Value dish;
   dish["name"]="红烧肉";
   dish["price"]=18000;
   dish["info"]="红色的肉肉,真好吃!";

   pdish->Insert(dish);
   return 0;
 }

2.修改:

main.cpp:

  #include "data.hpp"
  
  int main()
  {
    order_sys::TableDish *pdish = new order_sys::TableDish();
    Json::Value dish;
    dish["name"]="牛排";
    dish["price"]=20000;
    dish["info"]="招牌菜";
 
    // pdish->Insert(dish);
    pdish->Update(1,dish);
    return 0;
  }

再次插入:

  #include "data.hpp"
  
  int main()
   {
    order_sys::TableDish *pdish = new order_sys::TableDish();
    Json::Value dish;
    dish["name"]="糖醋里脊";
    dish["price"]=900;
    dish["info"]="正宗、新鲜、好吃!";
 
    pdish->Insert(dish);
    // pdish->Update(1,dish);
    return 0;
  }

 3.查询所有:

main.cpp:

  #include "data.hpp"
  
  int main()
  {
    order_sys::TableDish *pdish = new order_sys::TableDish();
    Json::Value dish;
    // dish["name"]="糖醋里脊";
    // dish["price"]=900;
    // dish["info"]="正宗、新鲜、好吃!";
 
   // pdish->Insert(dish);
   // pdish->Update(1,dish);
    pdish->GetAll(&dish);
    Json::StyledWriter writer;
    std::cout<<writer.write(dish)<<std::endl;
    return 0;
  }

 4.查询单个:

main.cpp:

   #include "data.hpp"
  
   int main()
   {
     order_sys::TableDish *pdish = new order_sys::TableDish();
     Json::Value dish;
     // dish["name"]="糖醋里脊";
     // dish["price"]=900;
     // dish["info"]="正宗、新鲜、好吃!";
 
     // pdish->Insert(dish);
     // pdish->Update(1,dish);
     pdish->GetOne(1,&dish);
     Json::StyledWriter writer;
     std::cout<<writer.write(dish)<<std::endl;
     return 0;
  }

 5.删除:

main.cpp:

  #include "data.hpp"
  
  int main()
   {
     order_sys::TableDish *pdish = new order_sys::TableDish();
     Json::Value dish;
     // dish["name"]="糖醋里脊";
     // dish["price"]=900;
     // dish["info"]="正宗、新鲜、好吃!";
 
     // pdish->Insert(dish);
     // pdish->Update(1,dish);
     // pdish->GetOne(1,&dish);
     pdish->Delete(2);
     pdish->GetAll(&dish);
     Json::StyledWriter writer;
     std::cout<<writer.write(dish)<<std::endl;
     return 0;
  }

 数据库中:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值