• Mysql类的封装


    Mysql类的封装

    1. 数据库简介

    数据库指的是管理数据的软件,而不是存储数据的仓库。

    1.1 为什么我们需要使用到数据库?

    1. 计算机的资源是有限的,不可能把所有的数据存储在内存中,并且内存掉电后数据会丢失
    2. 为了让数据在程序关闭重启后还继续使用,必须把数据存储到磁盘的文件中
    3. 随着程序的功能越来越复杂、数据越来越多,从文件中读取数据需要大量的重复性操作
      ,从文件中读取指定的数据需要复杂的逻辑
    4. 不同的程序它的数据不同、访问数据文件的操作也有所不同,意味着读写文件的代码不能复用
    5. 所以程序员非常需要一个统一的、快速的访问磁盘数据的工具
    6. 使用数据库时,程序员不需要自己管理数据,而是通过数据库提供统一的接口进行读写数据即可,至于数据在数据库文件中如何保存、查找、修改等与程序员无关

    1.2 常用的数据库分类

    • 商用型:OceanBase、Oracle、DB2、SQL Server
    • 开源型:MySQL、mariaDB、PostgreSQL
    • 桌面型:以微软的Access为代表,可以通过界面操作数据
    • 嵌入式:以SQLLite为代表,适合嵌入式设备使用的小型数据库

    2. Mysql数据库功能封装

    当然我们Linux环境下使用MySQL数据库还需要安装对应的库文件(sudo apt-get install libmysqlclient-dev),使用到数据库的相关函数声明都放在了头文件中。

    封装参考b站学习视频:点击跳转

    mysql.h文件实现

    #ifndef MYSQL_H
    #define MYSQL_H
    
    #include 
    #include 
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    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;
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
  • 相关阅读:
    自动驾驶行业观察之2023上海车展-----智驾供应链(3)
    前端项目:小程序电商管理平台难点整理
    空间域图像增强处理-含Labview程序
    2 万字详解,彻底讲透 Elasticsearch
    A - Block Sequence
    Java面试之封装、继承和多态(简洁易懂版)
    C++《面向对象程序设计课程设计》
    【微搭低代码】美业小程序官方模板练习-绘制原型
    谈谈你对AOP的理解
    密集计算场景下的 JNI 实战
  • 原文地址:https://blog.csdn.net/m0_50711528/article/details/127645944