(三)MySQL模块封装

封装MySQL接口

项目需要使用 MySQL 模块连接数据库,并进行增删改查操作。这里使用的是 MySQL 提供的 C 语言接口。这里创建 MySQL 类将这些接口封装,向上层 model 层提供各种服务。

我们会按照多层封装,如果在上层随意调用 SQL 语句,那么代码结构将是混乱的。而且如果以后更改数据库,基本全部重写。

MySQL模块使用的API

分配或初始化与mysql_real_connect()相适应的MYSQL对象

MYSQL* mysql_init(MYSQL* mysql)

连接 MySQL server

MYSQL* mysql_real_connect(MYSQL* mysql,const char* host,const charuser,
              const char passwd,const char* db,unsigned int port,
              const char* unix_socket,unsigned long client_flag)

执行SQL查询语句

int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)

从结果集中获取下一行

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

MySQL 类提供了这几种方法:

  1. 初始化数据库连接MySQL()
  2. 释放数据库连接~MySQL()
  3. 连接数据库bool connect()
  4. 更新操作bool update(string sql)
  5. 查询操作MYSQL_RES *query(string sql)
  6. 获取连接MYSQL* getConnection()

MySQL模块源代码

db.h

// TODO:封装太简单,可以增加MySQL连接池
#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;
};

db.cpp

#include "db.h"
#include <muduo/base/Logging.h>

// 数据库配置信息
static const string server = "127.0.0.1";
static const string user = "root";
static const string password = "123456";
static const 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");
    }
    else
    {
        LOG_INFO << "connect mysql failed!";
    }

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

参考

https://blog.csdn.net/qq_41455322/article/details/123720024

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值