mysql connector/c++库i JDBC版本各个API的使用

官方文档:
https://dev.mysql.com/doc/dev/connector-cpp/latest/

mysql client的c/c++ api一共三个版本:
在这里插入图片描述
这里使用最后一个JDBC的版本,该版本按照Java版本JDBC进行编写,实现了80%Java版本JDBC的接口,使用该版本是因为用Java JDBC的人多,容易解决搜到疑难杂症的解决方法。

接口介绍及代码
环境:已安装mysql server在本机
表中右部分数据:
/* 现有数据库testdatabase中user表

  • ---- + ---------- + ---------------- + ------------ + ---------- - ±----- +
    | id | username | email | birthdate | is_active | name |
    ±— + ---------- + ---------------- + ------------ + ---------- - ±----- +
    | 1 | a | 123456@xxx.com | 2000 - 01 - 01 | 1 | NULL |
    | 2 | b | 123456@xxx.com | 2000 - 01 - 01 | 1 | NULL |
    | 3 | c | 123456@xxx.com | 2000 - 01 - 01 | 1 | NULL |
    | 4 | 3 | 123456@xxx.com | 2000 - 01 - 01 | 1 | NULL |
    ±— + ---------- + ---------------- + ------------ + ---------- - ±----- +
    */
#include "jdbc/mysql_driver.h"
#include "jdbc/mysql_connection.h"
#include "jdbc/cppconn/driver.h"
#include "jdbc/cppconn/connection.h"
#include "jdbc/cppconn/statement.h"
#include "jdbc/cppconn/prepared_statement.h"
#include "jdbc/cppconn/resultset.h"
#include "jdbc/cppconn/metadata.h"
#include "jdbc/cppconn/resultset_metadata.h"
#include "jdbc/cppconn/exception.h"
#include "jdbc/cppconn/warning.h"
#include "mysql/jdbc.h"

#include <vector>
#include <chrono>

using namespace std;

#define DEFAULT_URI "tcp://127.0.0.1:3306"
#define EXAMPLE_USER "user"
#define EXAMPLE_PASS "password"
#define EXAMPLE_DB "testdatabase"

int main()
{
    const char* url = DEFAULT_URI;
    const string user(EXAMPLE_USER);
    const string pass(EXAMPLE_PASS);
    const string database(EXAMPLE_DB);

    // 获取驱动 该驱动不要在代码中显式的析构 connector会自动处理的
    // get_driver_instance也不是线程安全的 多线程使用要加锁 确保多个线程不会同时执行该函数
    sql::Driver* driver = sql::mysql::get_driver_instance();

    /* 连接数据库 */
    cout << "Creating session on " << url << " ..."
        << endl << endl;
    // sql::Connection需要程序员来负责析构 因此使用智能指针
    std::unique_ptr< sql::Connection > con(driver->connect(url, user, pass)); 
    
    if (!con->isValid()) { // checks whether the connection is alive
        cout << "connect falied, reconnected" << endl;
        con->reconnect(); // reconnects if the connection has gone down
    }
    else {
        cout << "connect success" << endl;
    }

    /* 查询数据库 */
    con->setSchema(database); // 选择数据库
    std::unique_ptr< sql::Statement > stmt(con->createStatement()); // sql::Statement 用于执行sql语句等
    // sql::Statement执行查询语句 sql::ResultSet中保存查询结果
    std::unique_ptr< sql::ResultSet > res(stmt->executeQuery("SELECT * FROM users"));
    /* 如下方法用于执行一些简单的查询
    * sql::Statement::execute()
    * sql::Statement::executeQuery() : if your query does not return a result set or if your query returns more than one result set.
    * sql::Statement::executeUpdate()
    */
    // 注意sql::Statement 和 sql::ResultSet 需要析构 因此采用了unique_ptr

    /* 获取查询结果 */
    try {
        while (res->next()) {
            int id = res->getInt(1); // 1为列数 从1开始算 但要保查询的结果中有该列 否则抛出异常 getInt用于将该列的值以int方式返回
            string username = res->getString("username"); // 也可用字段的名称获取该列的值 getString返回std::string
            bool isActive = res->getBoolean("is_active");

            cout << id << " " << username << " " << (isActive ? "true" : "false") << endl;
        }
    }
    catch (sql::SQLException& e) { // 派生关系 std::runtime_error->sql::SQLException 
        cout << "# ERR: " << e.what();
        cout << " (MySQL error code: " << e.getErrorCode();
        cout << ", SQLState: " << e.getSQLState() << " )" << endl;
    }

    /* 开启事务 */
    try {
        con->setAutoCommit(false); // 关闭自动提交 即不会在每次执行完sql语句后就commit
        string sql1 = "INSERT INTO users VALUES(10, 'Lucy1', '123456@xxx.com', '2000-02-02', true, '')";
        string sql2 = "INSERT INTO users VALUES(11, 'Lucy2', '123456@xxx.com', '2000-02-02', true, '')";
        stmt->executeUpdate(sql1);
        stmt->executeUpdate(sql2);
        con->commit();
    }
    catch (sql::SQLException& e) {
        std::cout << "update failed : " << e.what() << std::endl;
        con->rollback(); // 执行出错就回滚
    }
    return 0;
}

执行sql语句的三个接口:

1、executeUpdate 执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,该方法返回 int 类型的值,显示数据库中改变的行数
2、executeQuery 方法,用于执行查询语句的方法,执行后返回代表查询结果的ResultSet对象,在ResultSet对象中存储查询产生的结果。
ResultSet.next()方法是判断这个结果集中下一行是否有内容,如果有内容,返回true,逐行判断,ResultSet.get×××(参数)方法是用来获取这一行的某一个字段,这里的‘参数’,可以是字段的名字也可以相对来说字段名的位置(从1开始)
2、execute返回boolean类型,true表示执行的是查询语句,false表示执行的是insert,delete,update等等。
如果返回值为true ,则用 statement.getResultSet();方法返回一个ResultSet对象,就可以对ResultSet对象遍历输出,查看结果。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你的操作系统是 CentOS 或 RHEL,应该选择 MySQL Yum Repository。 如果你的操作系统是 Debian 或 Ubuntu,应该选择 MySQL APT Repository。 如果你的操作系统是 SUSE Linux Enterprise Server 或 openSUSE,应该选择 MySQL SUSE Repository。 如果你需要安装 MySQL 数据库,应该选择 MySQL Community Server。 如果你需要安装 MySQL 集群,应该选择 MySQL Cluster。 如果你需要安装 MySQL 路由器,应该选择 MySQL Router。 如果你需要使用 MySQL 命令行工具,应该选择 MySQL Shell。 如果你需要使用 MySQL Kubernetes 操作符,应该选择 MySQL Operator。 如果你需要使用 MySQL NDB Kubernetes 操作符,应该选择 MySQL NDB Operator。 如果你需要使用 MySQL GUI 工具,应该选择 MySQL Workbench 或 MySQL Installer for Windows。 如果你需要使用 MySQL C API,应该选择 C API (libmysqlclient)。 如果你需要使用 MySQL C++ Connector,应该选择 Connector/C++。 如果你需要使用 MySQL JDBC Connector,应该选择 Connector/J。 如果你需要使用 MySQL .NET Connector,应该选择 Connector/NET。 如果你需要使用 MySQL Node.js Connector,应该选择 Connector/Node.js。 如果你需要使用 MySQL ODBC Connector,应该选择 Connector/ODBC。 如果你需要使用 MySQL Python Connector,应该选择 Connector/Python 或 MySQL Native Driver for PHP。 如果你需要进行性能测试,应该选择 MySQL Benchmark Tool。 如果你需要下载时区描述表,应该选择 Time zone description tables。 具体选择哪个取决于你的需求和操作系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值