封装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 类提供了这几种方法:
- 初始化数据库连接
MySQL()
- 释放数据库连接
~MySQL()
- 连接数据库
bool connect()
- 更新操作
bool update(string sql)
- 查询操作
MYSQL_RES *query(string sql)
- 获取连接
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;
}