Linux下使用C++连接MySql8.0一二三事

2023-05-16

一  连接前准备

1  正确安装数据库 MySql 8.0

官网下载对应自己操作系统以及版本的包即可,这一步一定要正确安装。

推荐在官网https://dev.mysql.com/downloads/下载包,之后使用 dpkg 命令安装。

2  安装 boost 库

命令:

sudo apt-get install libboost-all-dev

3  安装 libmysqlclient 库

命令:

sudo apt-get install libmysqlclient-dev

注意,不安装这个库会提示错误(可能有多个):

libmysqlclient.so: cannot open shared object file: No such file or directory

4  安装 C++Connector 库

官网地址:https://dev.mysql.com/downloads/connector/cpp/

注意这几个库是不一样的,选择:

libmysqlcppconn8-2_8.0.20-1ubuntu18.04_amd64.deb

安装之后linux便能链接到这个库了,不过我们还需要头文件,把头文件写入CMakeList,之后链接 mysqlcppconn8 即可:

include_directories(/usr/include/mysql-cppconn-8)

link_libraries(mysqlcppconn8)

target_link_libraries(your_prj_name mysqlcppconn8)

5  CMakeLists

cmake_minimum_required(VERSION 3.16)
project(your_prj_name)

set(CMAKE_CXX_STANDARD 11)

#自身编写的头文件
include_directories(./include)

#外部头文件
#使用自己安装 mysqlcppconn8 的目录即可
include_directories(/usr/include/mysql-cppconn-8)

#项目源文件
set(SOURCE
        main.cpp
        source/xxx.cpp
        source/yyy.cpp
        source/zzz.cpp
        )

#链接外部库
link_libraries(mysqlcppconn8)

add_executable(your_prj_name ${SOURCE})
target_link_libraries(your_prj_name mysqlcppconn8)

二  连接数据库

为了方便测试,首先在 MySql 8.0 中创建数据库:webserver,并在库中创建表:

CREATE TABLE `webserver`.`user` (
  `username` VARCHAR(16) NOT NULL,
  `email` VARCHAR(255) NULL,
  `password` VARCHAR(32) NOT NULL,
  `create_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`username`));

 在其中插入一条数据:

insert into user (`username`, `email`, `password`) values ('test', 'test@163.com', 'testpwd');

注意:`create_time`的数据类型是 TIMESTAMP,mysqlcppconn8 并不支持这样的数据类型(如果使用 C++ API 的话),使用C API中的 MYSQL_TIME 数据结构可以存取时间类型的数据,官方文档:

https://dev.mysql.com/doc/refman/8.0/en/c-api-prepared-statement-date-handling.html

若一定要使用 C++ API 官方建议在数据库中做类型转换(本文采取这种做法),官方文档:

https://forums.mysql.com/read.php?167,683855,683891#msg-683891

#include <iostream>
#include <mysqlx/xdevapi.h>

using namespace mysqlx;

void ptUser() {
    using std::cout;
    using std::endl;
    using std::vector;

    try {
        const char* url = "mysqlx://root:rootpwd@127.0.0.1:33060/webserver?ssl-mode=disabled";  
        //注意 mysqlcppconn8 默认使用的端口:33060,若连接3306端口会提示错误
        //使用用户名:root
        //用户 root 的密码是:rootpwd
        //主机:127.0.0.1
        //端口:33060
        //数据库:webserver

        cout << "Creating session on " << url
             << " ..." << endl;

        SessionSettings option("127.0.0.1", 33060, "root", "rootpwd");
        Session sess(option); //也可使用这种方式连接
        //Session sess(url);  第一种方式建立连接
        
        cout <<"Done!" <<endl;
        cout <<"Session accepted, creating collection..." <<endl;

        sess.sql("use webserver").execute();  //使用数据库 webserver

        //如何存取时间类型值,在 mysqlcppconn8 中并没有很好的规定
        //注意,我们在此处将字符串转为 timestamp 类型,以插入该条数据
        sess.sql(R"(insert into user (`username`, `email`, `password`, `create_time`) values
                         ('ice', 'kawaii@qq.com', '654321', timestamp('2020-06-14 17:00:00')))"
                         ).execute();

        //注意,我们在此处 timestamp 类型转换为字符串,以取出该条数据
        RowResult rs = sess.sql("select username, email, password, cast(create_time as char) from user").execute();
        for (auto it = rs.begin();it != rs.end();++it){
            cout << (*it).get(0).get<string>() <<" ";
            cout << (*it).get(1).get<string>() <<" ";
            cout << (*it).get(2).get<string>() <<" ";
            cout << (*it).get(3).get<string>();
            cout << endl;
        }

    } catch (const Error& e) {
        cout << e.what() <<endl;
    }
}

 输出结果如下:

Creating session on mysqlx://root:rootpwd@127.0.0.1:33060/webserver?ssl-mode=disabled ...
Done!
Session accepted, creating collection...
ice kawaii@qq.com 654321 2020-06-14 17:00:00
test test@163.com testpwd 2020-06-12 22:52:36

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下使用C++连接MySql8.0一二三事 的相关文章

随机推荐