我们在上一节中把网络模块和业务模块的代码通过事件回调完全地拆分开。
现在我们需要把业务模块的和数据层的代码区分开。
(不在业务模块出现数据库的增删改查,增加中间的一层类)
我们需要libmysqlclient.so,对外的API方法,连接mysqlserver,进行增删改查。
我们在include下的server下创建一个文件夹:db
然后完善项目工程目录上的CMakeLists.txt
然后我们完善src下的server下的CMakeLists.txt
我们在include下的server下的db下,创建头文件:db.hpp
#ifndef DB_H
#define DB_H
#include <mysql/mysql.h>//mysql的头文件
#include <string>
using namespace std;
//数据库操作类
class MySQL
{
public:
//初始化数据库连接
MySQL();
//释放数据库连接资源
~MySQL();
//连接数据库
bool connect();
//更新操作
bool update(string sql);
//查询操作
MYSQL_RES *query(string sql);
//获取连接
MYSQL* getConnection();
private:
MYSQL *_conn;//连接
};
#endif
我们在src下的server下创建文件夹:db
我们在src下的server下的db下创建文件:db.cpp
#include "db.hpp"
#include <muduo/base/Logging.h>
//数据库配置信息
static string server = "127.0.0.1";
static string user = "root";
static string password = "123456";
static string dbname = "chat";
//初始化数据库连接
MySQL::MySQL()
{
_conn = mysql_init(nullptr);
}
//释放数据库连接资源
MySQL::~MySQL()
{
if (_conn != nullptr)
mysql_close(_conn);
}
//连接数据库
bool MySQL::connect()
{
MYSQL *p = mysql_real_connect(_conn, server.c_str(), user.c_str(),
password.c_str(), dbname.c_str(), 3306, nullptr, 0);
if (p != nullptr)
{
//C和C++代码默认的编码字符是ASCII,如果不设置,从MySQL上拉下来的中文显示?
mysql_query(_conn, "set names gbk");
LOG_INFO << "connect mysql success!";
}
else
{
LOG_INFO << "connect mysql fail!";
}
return p;
}
//更新操作
bool MySQL::update(string sql)
{
if (mysql_query(_conn, sql.c_str()))
{
LOG_INFO << __FILE__ << ":" << __LINE__ << ":"
<< sql << "更新失败!";
return false;
}
return true;
}
//查询操作
MYSQL_RES *MySQL::query(string sql)
{
if (mysql_query(_conn, sql.c_str()))
{
LOG_INFO << __FILE__ << ":" << __LINE__ << ":"
<< sql << "查询失败!";
return nullptr;
}
return mysql_use_result(_conn);
}
//获取连接
MYSQL* MySQL::getConnection()
{
return _conn;
}
我们完善src下的server的CMakeLists.txt
保存,编译成功