Mysql类的封装
1. 数据库简介
数据库指的是管理数据的软件,而不是存储数据的仓库。
1.1 为什么我们需要使用到数据库?
- 计算机的资源是有限的,不可能把所有的数据存储在内存中,并且内存掉电后数据会丢失
- 为了让数据在程序关闭重启后还继续使用,必须把数据存储到磁盘的文件中
- 随着程序的功能越来越复杂、数据越来越多,从文件中读取数据需要大量的重复性操作
,从文件中读取指定的数据需要复杂的逻辑 - 不同的程序它的数据不同、访问数据文件的操作也有所不同,意味着读写文件的代码不能复用
- 所以程序员非常需要一个统一的、快速的访问磁盘数据的工具
- 使用数据库时,程序员不需要自己管理数据,而是通过数据库提供统一的接口进行读写数据即可,至于数据在数据库文件中如何保存、查找、修改等与程序员无关
1.2 常用的数据库分类
- 商用型:OceanBase、Oracle、DB2、SQL Server
- 开源型:MySQL、mariaDB、PostgreSQL
- 桌面型:以微软的Access为代表,可以通过界面操作数据
- 嵌入式:以SQLLite为代表,适合嵌入式设备使用的小型数据库
2. Mysql数据库功能封装
当然我们Linux环境下使用MySQL数据库还需要安装对应的库文件(sudo apt-get install libmysqlclient-dev),使用到数据库的相关函数声明都放在了<mysql/mysql.h>头文件中。
封装参考b站学习视频:点击跳转
mysql.h文件实现
#ifndef MYSQL_H
#define MYSQL_H
#include <mysql/mysql.h>
#include <string>
using namespace std;
class Mysql
{
public:
//初始化mysql结构体
Mysql();
//删除释放mysql资源
~Mysql();
//连接mysql服务器
bool connect(string ip,string user,string pass,string db,unsigned int port=3306);
//更新信息
bool update(string cmd);
//查询信息
bool query(string cmd);
//遍历下一行信息
bool next(void);
//获取一行中第N个数据的值
string value(int index);
//设置不可自动提交
bool setAutoCommit(bool flag);
//提交事物
bool commit(void);
//回滚
bool rollback(void);
//列数目
int field_count(void);
private:
//释放存储的二维数组内存
void free_result(void);
MYSQL* m_sql; //mysql句柄
MYSQL_RES* m_res; //存放result
MYSQL_ROW m_row; //存放一行的数据
};
#endif//MYSQL_H
mysql.c文件实现
#include "Mysql.h"
//初始化mysql结构体
Mysql::Mysql()
{
m_sql = mysql_init(m_sql);
mysql_set_character_set(m_sql,"utf8");
mysql_autocommit(m_sql,false);
}
//删除释放mysql资源
Mysql::~Mysql()
{
free_result();
if(NULL != m_sql)
{
mysql_close(m_sql);
}
}
//连接mysql服务器
bool Mysql::connect(string ip,string user,string pass,string db,unsigned int port)
{
MYSQL *ptr = mysql_real_connect(m_sql,ip.c_str(),user.c_str(),pass.c_str(),db.c_str(),port,NULL,0);
return ptr!=nullptr;
}
//更新信息
bool Mysql::update(string cmd)
{
return 0 == mysql_real_query(m_sql,cmd.c_str(),cmd.size());
}
//查询信息
bool Mysql::query(string cmd)
{
free_result();
if(mysql_real_query(m_sql,cmd.c_str(),cmd.size()))
{
return false;
}
m_res = mysql_store_result(m_sql);
return true;
}
//遍历下一行信息
bool Mysql::next(void)
{
if(nullptr != m_res)
{
m_row = mysql_fetch_row(m_res);
}
return m_row!=nullptr;
}
//获取一行中第N个数据的值
string Mysql::value(int index)
{
int rowcnt = mysql_field_count(m_sql);
if(index<0 || index>=rowcnt)
{
return string();
}
char* val = m_row[index];
unsigned long length = mysql_fetch_lengths(m_res)[index];
return string(val,length);
}
//设置不可自动提交
bool Mysql::setAutoCommit(bool flag)
{
return mysql_autocommit(m_sql,flag);
}
//提交事物
bool Mysql::commit(void)
{
return mysql_commit(m_sql);
}
//回滚
bool Mysql::rollback(void)
{
return mysql_rollback(m_sql);
}
//得到字段的数量
int Mysql::field_count(void)
{
return mysql_field_count(m_sql);
}
//释放存储数据内存
void Mysql::free_result(void)
{
if(nullptr != m_res)
{
mysql_free_result(m_res);
m_res = nullptr;
}
}