MySQL数据模块搭建

85 阅读2分钟

如果把业务层代码和数据模块代码掺杂到一块,如果将来不想在MySQL上存储了,想直接全部存储在redis上,那么业务模块代码就需要大量改动。

ORM(Object Relation Map)对象关系映射框架:在业务层操作的都是对象,数据层才是具体有数据库的操作。

在上一节中已经把网络模块和业务模块的代码通过事件回调完全地拆分开,现在我们需要把业务模块的和数据层的代码区分开。检查一下是否有MySQL开发包libmysqlclient.so,命令sudo find /usr -name libmysqlclient* image.png

我们在include/server下创建一个文件夹db,并在项目根目录下的CMakeLists.txt中添加相应的头文件搜索路径

image.png

src/server下的CMakeLists.txt中添加MySQL的依赖库mysqlclient

image.png 在include/server/db下,创建头文件db.h

#ifndef DB_H
#define DB_H

#include <mysql/mysql.h>
#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.h"

#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;
}

为了让db.cpp也参与编译,我们需要修改/src/server/CMakeLists.txt,添加编译的源文件目录

image.png

image.png