上一节我们对网络模块和业务模块进行了解耦[集群聊天服务器]----(三)ChatService模块,解耦网络模块和业务模块,封装了回调函数。在项目中需要使用mysql数据库进行存储用户重要数据,并进行增删改查操作。,所以这一节我们对mysql的封装使用进行剖析,这里使用db类进行封装。
数据库配置信息
static string server = "127.0.0.1";
static string user = "root";
static string password = "xxxxxx";
static string dbname = "chat";
这里需要改为自己的相关配置,否则连不上数据库
成员变量
MYSQL *_conn;
成员函数
// 初始化数据库连接
MySQL();
// 释放数据库连接资源
~MySQL();
// 连接数据库
bool connect();
// 更新操作
bool update(string sql);
// 查询操作
MYSQL_RES *query(string sql);
//获取连接
MYSQL* getConnection();
- 在构造函数中,调用
mysql_init()
函数对MYSQL对象_conn
进行初始化
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;
}
- 使用
mysql_real_connect()
函数,原型为:
MYSQL *mysql_real_connect (MYSQL *mysql,
const char *host,
const char *user,
const char *passwd,
const char *db,
unsigned int port,
const char *unix_socket,
unsigned long client_flag);
其中,MYSQL *
为mysql_init函数返回的指针;
host
为null或 localhost时链接的是本地的计算机;
mysql用户名这里使用root,密码为xxxxxx;
db
为数据库名称,当db为空的时候,函数链接到默认数据库,在进行 mysql安装时会存在默认的test数据库,因此此处可以使用test数据库名称;
port
端口为3306,
使用 unix连接方式,unix_socket
为null时,表明不使用socket或管道机制,最后一个参数经常设置为0
mysql_real_connect()
尝试与运行在主机上的MySQL数据库引擎建立连接。在你能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,mysql_real_connect()必须成功完成。如果连接成功,返回MYSQL*
连接句柄。如果连接失败,返回NULL,调用mysql_error()函数显示出错信息,或使用mysql_errno()函数获取出错代号。对于成功的连接,返回值与第1个参数的值相同。
- 更新数据库
bool MySQL::update(string sql)
{
if (mysql_query(_conn, sql.c_str()))
{
LOG_INFO << __FILE__ << ":" << __LINE__ << ":"
<< sql << "更新失败!";
cout<<mysql_errno(_conn)<<endl;
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;
}