前面已经介绍了网络模块和业务模块,本章介绍数据模块,同样保持模块解耦的特性,即业务模块不能出现数据模块内容,如出现SQL语句,接下来看看怎么实现的。
1.环境安装
第一章已经介绍了MySql安装,但注意需要安装MySql开发包,如果没安装则不能调用MySqlAPI,可以使用以下命令检查:
cpp
sudo find /usr -name libmysqlclient*
查询结果如下:
2.数据模块代码
在include/server创建db文件夹,再在改文件下创建db.h头文件,用来链接、操作(增删改查)数据库。
cpp
#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;//和mysql的一条连接
};
#endif
在src/server/创建db文件夹,在改文件夹下创建db.cpp,代码作用卸载注释了。
cpp
#include "db.h"
#include <muduo/base/Logging.h> //使用了muduo的日志打印代码
// 数据库配置信息
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!"; //muduo日志打印
}
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;
}
其中更新和查询都使用mysql_query()函数,区别在于返回值。
3.更新各目录下CMakeLists.txt内容
项目目录下的CMakeLists.txt更新为:
cpp
cmake_minimum_required(VERSION 3.0)
project(chat)
# 配置编译选项
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)
# 配置最终的可执行文件输出的路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# 配置头文件的搜索路径
include_directories(${PROJECT_SOURCE_DIR}/include)
include_directories(${PROJECT_SOURCE_DIR}/include/server)
include_directories(${PROJECT_SOURCE_DIR}/include/server/db) //新添db加头文件路径
include_directories(${PROJECT_SOURCE_DIR}/thirdparty)
# 加载子目录
add_subdirectory(src)
src/server/CMakeLists.txt更新为:
cpp
# 定义了一个SRC_LIST变量,包含了该目录下所有的源文件
aux_source_directory(. SRC_LIST)
aux_source_directory(./db DB_LIST) //添加db的源文件
# 指定生成可执行文件
add_executable(ChatServer ${SRC_LIST} ${DB_LIST}) //添加db的源文件
# 指定可执行文件链接时需要依赖的库文件
target_link_libraries(ChatServer muduo_net muduo_base mysqlclient hiredis pthread) //添加mysqlclient库文件
总结
本章比较简单,编写了数据模块代码,并更新了相关的CMakeLists.txt文件。