Qt c++中使用mysql小工具

#ifndef DBUTIL_H
#define DBUTIL_H

#include "mysql.h"

#include <map>
#include <vector>

#include <QString>



/**
 * database util
 */
class DBUtil
{

public:
    DBUtil();
    ~DBUtil();


public:
    bool connect();

    void close();

    bool create_table(
            const std::string& sql_str);

    // return id of insert data
    // -1 invalid
    int insert_data(
            const std::string& sql_str);

    bool update_data(
            const std::string& sql_str);

    std::map<std::string, std::string> select_line_data(
            const std::string& sql_str);

    // select many row data
    const std::vector<std::map<std::string, std::string> >
    select_data(
            const std::string& sql_str);

    bool select_exist(const std::string& sql_str);

    bool delete_data(const std::string& sql_str);


private:
    // create database: database
    // if not exists
    bool create_database(
            const std::string& database_name);


    QString get_database_name();




private:
    QString get_sql_error();



private:
    MYSQL* d_mysql;

    // is connect ok?
    bool d_is_connected;




};

#endif // DBUTIL_H

#include "DBUtil.h"
#include "TableNameConstant.h"
#include "GLOBAL/util/CommonFileUtil.h"


#include <iostream>
//#include <sqlite3.h>

#include <QDebug>



DBUtil::DBUtil()
    : d_mysql(0),
      d_is_connected(false)
{

}



DBUtil::~DBUtil()
{}



void
DBUtil::close()
{
    if( d_mysql )
    {
        mysql_close(d_mysql);
        //qDebug() << __FILE__ << __LINE__ << " mysql = " << d_mysql;
        d_mysql = 0;
        d_is_connected = false;
    }
}



bool
DBUtil::connect()
{
    // already connected
    if( d_is_connected )
    {
        return true;
    }

    //qDebug() << __FILE__ << __LINE__ << " mysql = " << d_mysql << " d_is_connected " << d_is_connected;
    d_mysql = mysql_init(nullptr);
    //qDebug() << __FILE__ << __LINE__ << " mysql = " << d_mysql << " d_is_connected " << d_is_connected;
    if( !d_mysql )
    {
        return false;
    }

    if( !mysql_real_connect(d_mysql, "localhost", "root", "123456", "mysql", 3306, "/var/run/mysqld/mysqld.sock", 0) )
    {
        qDebug() << __FILE__ << __LINE__ << "warning: " << get_sql_error();

        d_is_connected = false;
        return false;
    }

    d_is_connected = create_database(HELWSP::TableNameConstant::s_DATABASE_NAME);

    //qDebug() << __FILE__ << __LINE__ << " mysql = " << d_mysql << " d_is_connected " << d_is_connected;
    return d_is_connected;
}



bool
DBUtil::create_database(
        const std::string& database_name)
{
    std::string sql_str = "create database if not exists " + database_name;
    if( mysql_query(d_mysql, sql_str.c_str()) )
    {
        qDebug() << __FILE__ << __LINE__ << "error: " << get_sql_error();
        return false;
    }

    sql_str = "use " + database_name;
    if( mysql_query(d_mysql, sql_str.c_str()) )
    {
        qDebug() << __FILE__ << __LINE__ << "error: " << get_sql_error();
        return false;
    }

    return true;
}




QString
DBUtil::get_database_name()
{
    return CommonFileUtil::get_db_dir() + HELWSP::TableNameConstant::s_SQLITE3_DATABASE_NAME;
}



bool
DBUtil::create_table(
        const std::string& sql_str)
{
    const bool& connect_ok = connect();
    if( !connect_ok )
    {
        qDebug() << __FILE__ << __LINE__ << "warning: mariadb not connect.";
        return false;
    }

    if( mysql_query(d_mysql, sql_str.c_str()) )
    {
        qDebug() << __FILE__ << __LINE__ << "error: " << get_sql_error();
        return false;
    }

    return true;
}



int
DBUtil::insert_data(
        const std::string& sql_str)
{
    const bool& connect_ok = connect();
    if( !connect_ok )
    {
        qDebug() << __FILE__ << __LINE__ << "warning: mariadb not connect.";
        return -1;
    }

    if( mysql_query(d_mysql, sql_str.c_str()) )
    {
        qDebug() << __FILE__ << __LINE__ << "error: " << get_sql_error();
        return -1;
    }

    //qDebug() << __FILE__ << __LINE__ << " insert id =  " << d_mysql->insert_id;
    return d_mysql->insert_id;
}



bool
DBUtil::update_data(
        const std::string& sql_str)
{
    const bool& connect_ok = connect();
    if( !connect_ok )
    {
        qDebug() << __FILE__ << __LINE__ << "warning: mariadb not connect.";
        return false;
    }

    if( mysql_query(d_mysql, sql_str.c_str()) )
    {
        qDebug() << __FILE__ << __LINE__ << "error: " << get_sql_error();
        return false;
    }

    //qDebug() << __FILE__ << __LINE__ << " insert id =  " << d_mysql->insert_id;
    return true;
}



std::map<std::string, std::string>
DBUtil::select_line_data(
        const std::string& sql_str)
{
    std::map<std::string, std::string> map_result_data;

    const bool& connect_ok = connect();
    if( !connect_ok )
    {
        qDebug() << __FILE__ << __LINE__ << "warning: mariadb not connect.";
        return map_result_data;
    }

    if( mysql_query(d_mysql, sql_str.c_str()) )
    {
        qDebug() << __FILE__ << __LINE__ << "error: " << get_sql_error();
        return map_result_data;
    }

    MYSQL_RES* result;

    result = mysql_store_result(d_mysql);

    const my_ulonglong& num_row = mysql_num_rows(result);
    const unsigned int& num_column = mysql_num_fields(result);

    if( num_row == 0 || num_column == 0 )
    {
         return map_result_data;
    }

    MYSQL_FIELD* field;
    MYSQL_ROW row;

    row = mysql_fetch_row(result);
    if( row )
    {
        for(unsigned int i = 0; i < num_column; i++)
        {
            field = mysql_fetch_field(result);
            map_result_data[field->name] = row[i];

            //qDebug() << __FILE__ << __LINE__ << " name = " << field->name << " row[i] = " << row[i];
        }
    }

    return map_result_data;
}



const std::vector<std::map<std::string, std::string> >
DBUtil::select_data(
        const std::string& sql_str)
{
    std::vector<std::map<std::string, std::string> > result_data;

    const bool& connect_ok = connect();
    if( !connect_ok )
    {
        qDebug() << __FILE__ << __LINE__ << "warning: mariadb not connect.";
        return result_data;
    }

    std::map<std::string, std::string> column_data;

    if( mysql_query(d_mysql, sql_str.c_str()) )
    {
        qDebug() << __FILE__ << __LINE__ << "error: " << get_sql_error();
        return result_data;
    }

    MYSQL_RES* result;

    result = mysql_store_result(d_mysql);
    const my_ulonglong& num_row = mysql_num_rows(result);
    const unsigned int& num_column = mysql_num_fields(result);

    if( num_row == 0 || num_column == 0 )
    {
         return result_data;
    }

    MYSQL_FIELD* field;
    MYSQL_ROW row = nullptr;

    //qDebug() << __FILE__ << __LINE__ <<  " num_row = " << num_row << " num_column = " << num_column;
    std::vector<std::string> key_vector;
    while( field = mysql_fetch_field(result) )
    {
        key_vector.push_back(field->name);
    }

    for(int i = 0; i < num_row; i++)
    {
        column_data.clear();
        row = mysql_fetch_row(result);

        for(int j = 0; j < num_column; j++)
        {
            column_data[key_vector.at(j)] = row[j];
        }

        result_data.push_back(column_data);
    }

    mysql_free_result(result);

    return result_data;
}



bool
DBUtil::select_exist(const std::string& sql_str)
{
    const std::vector<std::map<std::string, std::string> >& data = select_data(sql_str);

    return (!data.empty());
}



bool
DBUtil::delete_data(const std::string& sql_str)
{
    const bool& connect_ok = connect();
    if( !connect_ok )
    {
        qDebug() << __FILE__ << __LINE__ << "warning: mariadb not connect.";
        return false;
    }

    if( mysql_query(d_mysql, sql_str.c_str()) )
    {
        qDebug() << __FILE__ << __LINE__ << "error: " << get_sql_error();
        return false;
    }

    return true;
}



QString
DBUtil::get_sql_error()
{
    return QString("Error(%1) [%2] \"%3\"").arg(mysql_errno(d_mysql)).arg(mysql_sqlstate(d_mysql)).arg(mysql_error(d_mysql));
}





发现c++是一种很容易写整齐的语言,java的话有ctrl+shift+f format快捷键

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值