mysql数据库 C++封装

前言

为什么要使用mysql数据库?
设想一下有一个很大的(如10G)数据,我们不能将之存放在内存中,只能够放在磁盘上,每一次CPU读取数据都需要进行慢到吐血的磁盘IO操作,那这时使用mysql这种关系型数据库就显得尤为重要的。
记住mysql的数据也是存放在磁盘上面的,不过读取速度更快!

一.关于关系型数据库mysql的介绍,网上已经有很多资料,不用我再多做介绍


二.不同的环境添加mysql的链接包方式不同,在这里介绍Linux环境下的添加方法

首先将mysql文件包放到 /usr/include 目录下:
在这里插入图片描述
注意文件包中我们需要添加的是这个头文件:mysql.h
在这里插入图片描述

C++封装

注意在编译时需要加上: mysql_config --cflags --libs
Mysql.h:

#pragma once
#include <string>
#include <mysql/mysql.h>
#include <iostream>
using namespace std;

namespace wd
{
    class Mysql
    {
    public:
        Mysql();
        ~Mysql();
        bool initDB(string host, string user, string pwd, string db_name, int port);
        bool exeSQL(string sql);                            //执行sql语句
        bool select_one_SQL(std::string sql, string &str);  //只查找一个字段一行,并存入str中, 如果查找的不存在,那么str仍将会为空值
        bool select_many_SQL(std::string sql, string &str); //查找多个字段多个行,并存入str中

    private:
        MYSQL *mysql;
        MYSQL_RES *result;
        MYSQL_ROW row;
    };
} // namespace wd

Mysql.cpp:

#include "Mysql.h"

namespace wd
{
    Mysql::Mysql()
    {
        mysql = mysql_init(NULL);

        if (!mysql)
        {
            cout << "Error:" << mysql_error(mysql);
            exit(1);
        }
    }

    Mysql::~Mysql()
    {
        if (mysql)
        {
            mysql_close(mysql);
        }
    }

    bool Mysql::initDB(std::string host, std::string user, std::string passwd, std::string db_name, int port = 3306)
    {
        mysql = mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), port, NULL, 0);
        if (!mysql)
        {
            cout << "Error: " << mysql_error(mysql);
            return false;
        }

        return true;
    }

    bool Mysql::exeSQL(std::string sql)
    {
        //mysql_query()执行成功返回0,执行失败返回非0值。
        if (mysql_query(mysql, sql.c_str()))
        {
            cout << "Query Error: " << mysql_error(mysql);
            return false;
        }

        result = mysql_store_result(mysql);

        if (result)
        {
            //获取结果集中总共的字段数,即列数
            int num_fields = mysql_num_fields(result);
            unsigned long long num_rows = mysql_num_rows(result);
            for (unsigned long long i = 0; i < num_rows; i++)
            {
                row = mysql_fetch_row(result);
                if (!row)
                {
                    break;
                }

                for (int j = 0; j < num_fields; j++)
                {
                    cout << row[j] << "\t\t";
                }
                cout << endl;
            }
        }
        else
        {
            //代表执行的是update,insert,delete类的非查询语句
            if (mysql_field_count(mysql) == 0)
            {
                // 返回update,insert,delete影响的行数
                unsigned long long num_rows = mysql_affected_rows(mysql);

                return num_rows;
            }
            else
            {
                cout << "Get result error: " << mysql_error(mysql);
                return false;
            }
        }

        return true;
    }

    //只查找一个字段一行,并存入str中, 如果查找的不存在,那么str仍将会为空值
    bool Mysql::select_one_SQL(std::string sql, string &str)
    {
        //mysql_query()执行成功返回0,执行失败返回非0值。
        if (mysql_query(mysql, sql.c_str()))
        {
            cout << "Query Error: " << mysql_error(mysql);
            return false;
        }

        result = mysql_store_result(mysql);

        if (result)
        {
            //获取结果集中总共的字段数,即列数
            int num_fields = mysql_num_fields(result);
            unsigned long long num_rows = mysql_num_rows(result);

            for (unsigned long long i = 0; i < num_rows; i++)
            {
                row = mysql_fetch_row(result);
                if (!row)
                {
                    break;
                }

                for (int j = 0; j < num_fields; j++)
                {
                    str = row[j];
                }
            }
        }
        return true;
    }

    //查找多个字段多个行,并存入str中
    bool Mysql::select_many_SQL(std::string sql, string &str)
    {
        //mysql_query()执行成功返回0,执行失败返回非0值。
        if (mysql_query(mysql, sql.c_str()))
        {
            cout << "Query Error: " << mysql_error(mysql);
            return false;
        }

        result = mysql_store_result(mysql);

        if (result)
        {
            //获取结果集中总共的字段数,即列数
            int num_fields = mysql_num_fields(result);
            unsigned long long num_rows = mysql_num_rows(result);

            for (unsigned long long i = 0; i < num_rows; i++)
            {
                row = mysql_fetch_row(result);
                if (!row)
                {
                    break;
                }

                for (int j = 0; j < num_fields; j++)
                {
                    str += row[j];
                    str += "|\t\t";
                }
                str += "\n";
            }
        }
        return true;
    }
} // namespace wd

test.cpp:

#include "Mysql.h"
using namespace wd;
/*
g++ test.cpp Mysql.cpp  `mysql_config --cflags --libs`
*/
int main()
{
    Mysql mysql;
    if (!mysql.initDB("localhost", "root", "123", "crashcourse", 3306))
    {
        cout << "connect fails" << endl;
        exit(-1);
    }
    mysql.exeSQL("SELECT * FROM orders;");
    return 0;
}

输出结果
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值