mysql c++ jdbc 示例

使用注意事项

 

 1 # wget https://cdn.mysql.com//Downloads/Connector-C++/mysql-connector-c++-8.0.13-linux-glibc2.12-x86-64bit.tar.gz
 2 
 3 如果出错, 试试安装
 4 # yum install -y boost
 5 # yum install -y boost-devel
 6 
 7 
 8 https://dev.mysql.com/downloads/connector/cpp/
 9 
10 官网提供的 Windows 版本 mysql-connector-c++-8.0.13-win 在Debug下运行Crash, 更改为Release。
11 调试: VS工程属性--链接器--调试--生成调试信息
# g++ main.cpp JdbcHelper.cpp -std=c++11 -I/usr/local/mysql_cpp/include/jdbc -L/usr/local/mysql_cpp/lib64 -lmysqlcppconn -lssl -lcrypto 

 

JdbcHelper.h

 

#pragma once
#include <iostream>
#include <string>
#include <functional>

//#include <mysql_driver.h>
//#include <mysql_connection.h>

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
#include <cppconn/prepared_statement.h>


class JdbcHelper
{
public:
    /** host: tcp://192.168.6.80:23306 自动重连*/
    JdbcHelper(const std::string& host, const std::string& username, const std::string& passwd, const std::string& database);
    virtual ~JdbcHelper();

    /** 连接 */
    int jdbc_connect(bool enableSSL);
    /** 断开连接 */
    int jdbc_close_connect();


    /** 设置是否自动提交事务 */
    int jdbc_set_auto_commit(bool auto_commit);
    /** 提交事务 */
    int jdbc_commit();
    /** 创建一个保存点 */
    sql::Savepoint* jdbc_save_point(const std::string& name);
    /** 回滚到一个保存点 */
    int jdbc_rollback_save_point(sql::Savepoint* point);
    /** 释放保存点, 必须调用(内存泄漏) */
    int jdbc_release_save_point(sql::Savepoint* point);


    /** stmt: setXXX(index, data), index是从1开始
    返回值: 受影响的行数 affected_rows , 修改没有发生变化, 会返回0  */
    int jdbc_executeUpdate(const std::string& sql,
        std::function<void (sql::PreparedStatement* stmt)> prepCallBack,
        std::function<void (sql::SQLException &e)> exceptionCallBack);

    /** stmt: setXXX(index, data), index是从1开始
    返回值: 0: 成功  */
    int jdbc_executeQuery(const std::string& sql,
        std::function<void (sql::PreparedStatement* stmt)> prepCallBack,
        std::function<void (sql::ResultSet* result)> resultCallBack,
        std::function<void (sql::SQLException &e)> exceptionCallBack);

protected:
    void printSQLException(sql::SQLException &e);

private:
    std::string host;
    std::string username;
    std::string passwd;
    std::string database;

    sql::Driver* driver;
    sql::Connection* conn;
};
View Code

 

 

 

JdbcHelper.cpp

 

#include "JdbcHelper.h"
#include <cppconn/parameter_metadata.h>


JdbcHelper::JdbcHelper(const std::string& host, const std::string& username, const std::string& passwd, const std::string& database)
{
    this->host = host;
    this->username = username;
    this->passwd = passwd;
    this->database = database;

    this->conn = NULL;

    try {
        this->driver = get_driver_instance();
    }
    catch (sql::SQLException &e) {
        this->printSQLException(e, "get_driver_instance");
    }
    
    if (driver == NULL) {
        std::cout << "driver is null" << std::endl;
    }
}


JdbcHelper::~JdbcHelper()
{
}


int JdbcHelper::jdbc_connect(bool enableSSL)
{
    if (NULL != conn) {
        return -1;
    }
    this->m_enableSSL = enableSSL;

    try {
        sql::ConnectOptionsMap opts;
        opts["hostName"] = this->host;
        opts["userName"] = this->username;
        opts["password"] = this->passwd;
        if (enableSSL) {
            // 默认使用SSL
        }
        else {
            opts["OPT_SSL_MODE"] = sql::SSL_MODE_DISABLED;
        }
        opts["OPT_RECONNECT"] = sql::ConnectPropertyVal(true);

        this->conn = driver->connect(opts);

        if (NULL == conn) {
            printf("conn id null\n");
            return -2;
        }

        // 选择数据库
        sql::SQLString catalog(this->database);
        conn->setSchema(catalog);

        return 0;
    }
    catch (sql::SQLException &e) {
        this->printSQLException(e, "connect");
    }

    return -3;
}


int JdbcHelper::jdbc_close_connect()
{
    if (conn) {
        conn->close();
        delete conn;
        conn = NULL;

        return 0;
    }

    return -1;
}

bool JdbcHelper::jdbc_is_connected()
{
    if (conn) {
        return (conn->isClosed() == false);
    }
    else {
        this->jdbc_connect(m_enableSSL);
    }

    return false;
}

int JdbcHelper::jdbc_set_auto_commit(bool auto_commit)
{
    if (NULL == conn || conn->isClosed()) {
        printf("jdbc conn is closed\n");
        return -1;
    }

    try {
        conn->setAutoCommit(auto_commit);
        return 0;
    }
    catch (sql::SQLException &e) {
        this->printSQLException(e, "setAutoCommit");
    }

    return -2;
}

int JdbcHelper::jdbc_commit()
{
    if (NULL == conn || conn->isClosed()) {
        printf("jdbc conn is closed\n");
        return -1;
    }

    try {
        conn->commit();
        return 0;
    }
    catch (sql::SQLException &e) {
        this->printSQLException(e, "commit");
    }

    return -2;
}

sql::Savepoint* JdbcHelper::jdbc_save_point(const std::string& name)
{
    if (NULL == conn || conn->isClosed()) {
        printf("jdbc conn is closed\n");
        return NULL;
    }

    try {
        sql::SQLString savePointName(name);
        return conn->setSavepoint(savePointName);
    }
    catch (sql::SQLException &e) {
        this->printSQLException(e, "setSavepoint");
    }

    return NULL;
}

int JdbcHelper::jdbc_rollback_save_point(sql::Savepoint* point)
{
    if (NULL == conn || conn->isClosed()) {
        printf("jdbc conn is closed\n");
        return -1;
    }
    if (NULL == point) {
        return -2;
    }

    try {
        conn->rollback(point);
        return 0;
    }
    catch (sql::SQLException &e) {
        this->printSQLException(e, "rollback");
    }

    return -3;
}

int JdbcHelper::jdbc_release_save_point(sql::Savepoint* point)
{
    if (NULL == conn || conn->isClosed()) {
        printf("jdbc conn is closed\n");
        return -1;
    }
    if (NULL == point) {
        return -2;
    }

    int rc = -1;
    try {
        conn->releaseSavepoint(point);
        rc = 0;
    }
    catch (sql::SQLException &e) {
        this->printSQLException(e, "releaseSavepoint");
        rc = -3;
    }

    delete point;

    return rc;
}

int JdbcHelper::jdbc_executeUpdate(
    const std::string& sql,
    std::function<void(sql::PreparedStatement* stmt)> prepCallBack,
    std::function<void(sql::SQLException &e)> exceptionCallBack)
{
    if (NULL == conn || conn->isClosed()) {
        printf("jdbc conn is closed\n");
        return -1;
    }

    int row_affected = -1;
    sql::PreparedStatement* stmt = NULL;

    try {
        do
        {
            sql::SQLString sqlString(sql);
            stmt = conn->prepareStatement(sqlString);
            if (NULL == stmt) {
                row_affected = -2;
                break;
            }

            sql::ParameterMetaData* paramMetaData = stmt->getParameterMetaData();
            if (paramMetaData) {
                if (paramMetaData->getParameterCount() > 0) {
                    if (prepCallBack) {
                        prepCallBack(stmt);
                    }
                }
            }

            row_affected = stmt->executeUpdate(); // 插入数据
        } while (false);
    }
    catch (sql::SQLException &e)
    {
        this->printSQLException(e, sql);

        if (exceptionCallBack) {
            exceptionCallBack(e);
        }
    }

    if (stmt) {
        try {
            stmt->close();
        }
        catch (sql::SQLException &e) {
            this->printSQLException(e, "close stmt res");
        }
        delete stmt;
    }

    return row_affected;
}


int JdbcHelper::jdbc_executeQuery(
    const std::string& sql,
    std::function<void(sql::PreparedStatement* stmt)> prepCallBack,
    std::function<void(sql::ResultSet* result)> resultCallBack,
    std::function<void(sql::SQLException &e)> exceptionCallBack)
{
    if (NULL == conn || conn->isClosed()) {
        printf("jdbc conn is closed\n");
        return -1;
    }

    int rc = -1;
    sql::PreparedStatement* prep_stmt = NULL;
    sql::ResultSet* res = NULL;

    try {
        do
        {
            // std::cout << "SQL: " << sql << std::endl;
            sql::SQLString sqlString(sql);

            prep_stmt = conn->prepareStatement(sqlString);
            if (NULL == prep_stmt) {
                rc = -2;
                break;
            }

            if (prepCallBack) {
                sql::ParameterMetaData* paramMetaData = prep_stmt->getParameterMetaData();
                if (paramMetaData && paramMetaData->getParameterCount() > 0) {
                    prepCallBack(prep_stmt);
                }
            }

            res = prep_stmt->executeQuery(); // 查询数据
            if (NULL == res) {
                rc = -3;
                break;
            }

            if (resultCallBack) {
                sql::ResultSetMetaData* metaData = prep_stmt->getMetaData();
                if (metaData && metaData->getColumnCount() > 0) {
                    // printSQLMeta(metaData);
                    resultCallBack(res);
                }
            }
            
            rc = 0;
        } while (false);
    }
    catch (sql::SQLException &e)
    {
        // if (e.getErrorCode() == CR_SERVER_LOST) { } // in errmsg.h of mysqlclient
        printSQLException(e, sql);

        if (exceptionCallBack) {
            exceptionCallBack(e);
        }
    }

    if (prep_stmt) {
        try {
            prep_stmt->close();
        }
        catch (sql::SQLException &e) {
            this->printSQLException(e, "close stmt");
        }
        delete prep_stmt;
    }
    if (res) {
        try {
            res->close();
        }
        catch (sql::SQLException &e) {
            this->printSQLException(e, "close stmt res");
        }
        delete res;
    }

    return rc;
}

void JdbcHelper::printSQLException(sql::SQLException &e, const std::string& sql)
{
    std::cout << "message: " << e.what() << std::endl;
    std::cout << "code: " << e.getErrorCode() << std::endl;
    std::cout << "state: " << e.getSQLState() << std::endl;
    std::cout << "sql: " << sql << std::endl;
}

void JdbcHelper::printSQLMeta(sql::ResultSetMetaData* metaData)
{
    int columnCount = metaData->getColumnCount();
    for (int i = 1; i <= columnCount; i++) {
        std::cout << "column: " << i << ", name: " << metaData->getColumnName(i) << ", type: " << metaData->getColumnTypeName(i) << std::endl;
    }
}
View Code

 

 

 

main.cpp

/**
  g++ main.cpp JdbcHelper.cpp -std=c++11 -I/usr/local/mysql_cpp/include/jdbc -L/usr/local/mysql_cpp/lib64 -lmysqlcppconn -lssl -lcrypto
*/
#include <stdlib.h>
#include <stdio.h>
#include <iostream>

#include "JdbcHelper.h"

#ifdef _MSC_VER
#pragma comment(lib, "mysqlcppconn.lib")
#endif // _MSC_VER


int main(int argc, char* argv[])
{
    int data = 3;

    JdbcHelper jdbc("tcp://192.168.6.80:23306", "root", "123456", "test");
    jdbc.jdbc_connect(true);

    std::string sql = "SELECT id, label FROM test WHERE id = ?";
    jdbc.jdbc_executeQuery(sql, [=](sql::PreparedStatement* stmt) {
        stmt->setInt(1, data);
    }, [](sql::ResultSet* result) {

        while (result->next())
        {
            int64_t id = result->getInt64(1);
            sql::SQLString label = result->getString(2);

            std::cout << "id: " << id << "  label: " << label << std::endl;
        }
    }, NULL);


    sql = "INSERT INTO test(id, label) VALUES(?, ?)";
    int affected_rows = jdbc.jdbc_executeUpdate(sql, [](sql::PreparedStatement* stmt) {
        stmt->setInt64(1, 1234);
        stmt->setString(2, "label_1234");
    }, [sql](sql::SQLException &e) {
        std::cerr << "exception, SQL: " << sql << std::endl;
    });

    std::cout << "affected_rows:  " << affected_rows << std::endl;

    jdbc.jdbc_close_connect();

    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/baigoogledu/p/10155911.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值