目录
前言
最近项目需要使用到Mysql,以前用的是Qt封装好的数据库操作类,十分简单,这次用在服务器上打算学习下用MysqlConnector来进行数据库的连接和操作。
Mysql版本
MysqlConnector有JDBC版和XDEVAPI版,Mysql5.7.12后就有X Plugin
,使用它可以十分方便的完成数据库操作,但因为5.7还有一些小问题,因此直接安装Mysql8并使用MysqlConnector8比较好。
Windows下连接Mysql
准备工作
- 如果以前安装了mysql5.7,可以先去windows自带的卸载里去将
mysql server5.x
卸载,然后再安装mysql8 安装Mysql8
:点我下载
下载后点击安装选Development Default
,然后一路默认安装即可,只需要设置个密码,为了方便,我这里设置了123456
作为root用户的密码。测试
:- 点击开始菜单
- 找到Mysql文件夹
- 点击
Mysql 8.0 Command Line Client
- 输入刚设置的密码进行登录
- 登录成功
创建表用于测试
- 进入Mysql的控制台,进行登录
- 创建数据库:
create database test;
- 选择数据库:
use test;
- 创建数据表:
create table if not exists `person`( `uid` int unsigned, `age` int unsigned, `name` varchar(40) not null, PRIMARY KEY ( `uid` ) )engine=InnoDB default charset=utf8;
- 插入数据:
insert into person values(10001,18,"小明"); insert into person values(10002,17,"小红");
- 查看数据:
select * from person;
下载MysqlConnector8
- 一般安装Mysql8时就已经自带了MysqlConnector,在Mysql的安装目录下:
- 如果没有,可在官网下载:点我下载
也可以下载Zip的压缩文件,解压即可。
连接Mysql
使用Cmake构建项目
- CMake提供了一个统一的语法以在不同的平台构建我们的项目,且使用十分简单。在Win平台下CMake可以创建Visual Studio的项目,在Linux下也可创建Makefile,十分方便。
- CMake安装十分简单,不用多说。
- 编写CMakeLists:
- 创建文件:
CMakeLists.txt
- 编辑
里面有些Linux的设置,现在可以不用看,不影响。# CMake的最低版本 cmake_minimum_required(VERSION 3.10) # 设置是否是在Win平台下编译 option( BUILD_IN_WIN "windows msvc build" ON) # 设置使用的C++标准 set(CMAKE_CXX_STANDARD 11) # 设置项目名称 project(TestMysql) # 设置源码路径 set(SOURCE_DIR ./project) # 设置项目目录为CMake指定的目录 set(PROJECT_DIR ${CMAKE_BINARY_DIR}) # 设置编译结果的输出目录 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_DIR}/build) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_DIR}/build) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_DIR}/build) if(BUILD_IN_WIN) # 如果在Win下编译 set(MYSQL_CONNECTOR_DIR "D:/Softwares/mysql-connector-c++-8.0.19-winx64") # 设置Connector的目录 set(MYSQL_LIB ${MYSQL_CONNECTOR_DIR}/lib64/vs14/mysqlcppconn8.lib # 设置lib ) else() # Linux下编译 set(MYSQL_CONNECTOR_DIR "/home/lib/mysqlconn8-x86-64") # 设置Connector目录 set(MYSQL_LIB ${MYSQL_CONNECTOR_DIR}/lib64/libmysqlcppconn8.so # 设置lib ) endif() include_directories(${MYSQL_CONNECTOR_DIR}/include) # 添加头文件目录 # 指定生成可执行文件 aux_source_directory(${SOURCE_DIR} SOURCE_CODES) add_executable(${PROJECT_NAME} ${SOURCE_CODES}) if( BUILD_IN_WIN ) target_link_libraries(${PROJECT_NAME} ${MYSQL_LIB} # 添加lib ) else() target_link_libraries(${PROJECT_NAME} ${MYSQL_LIB} ) endif()
- 创建文件:
- 在
CMakeLists.txt
同个文件夹创建project
文件夹,并在里面创建一个空的main.cpp
- 生成Vs的项目:
cmake -B TestMysql -G "Visual Studio 15 2017 Win64"
-B
表示创建项目的目录
-G
表示创建vs2017的x64项目 - 现在生成了Vs的项目,进入
TestMysql
文件夹,点击TestMysql.sln
打开项目 - 编辑
main.cpp
:#include <mysqlx/xdevapi.h> #include <iostream> namespace MySqlConf { //uri: mysqlx://user:password@host:port/db_name static const std::string& connect_url = "mysqlx://root:123456@127.0.0.1/test"; bool test() { try { mysqlx::Session sess(connect_url); mysqlx::SqlResult rset = sess.sql("SELECT * FROM person").execute(); mysqlx::Row row; while (rset.hasData()) { //判断结果集中是否有数据 row = rset.fetchOne(); //从结果集中提取一行数据,同时此函数会自动指向下一行数据 if (row.isNull()) { //判断此行是否为空 std::cout << "row is null." << std::endl; break; } //提取行中每一列的数据,注意下标从 0 开始 //使用C++中的类的强制转换 std::cout << "--------------" << std::endl; #ifdef OTHER std::cout << " id: " << int(row.get(0)) << std::endl; std::cout << " age: " << int(row.get(1)) << std::endl; std::cout << "name: " << std::string(row.get(1)) << std::endl; #else std::cout << " uid: " << row.get(0).get<int>() << std::endl; std::cout << " age: " << row.get(1).get<int>() << std::endl; std::cout << "name: " << row.get(2).get<std::string>() << std::endl; #endif std::cout << std::endl; } sess.close(); std::cout << "Done!" << std::endl; } catch (mysqlx::Error &err) { std::cout << "ERROR : " << err << std::endl; return false; } /*try { const std::string& connect_url = "mysqlx://root:123456@148.70.60.56:33060"; mysqlx::Session sess(connect_url); mysqlx::Schema sch = sess.getSchema("test"); mysqlx::Table table = sch.getTable("info"); mysqlx::Result ret = table.insert("id", "age").values(2, 18).execute(); } catch (const std::exception& e) { std::cout << e.what() << std::endl; return false; }*/ return true; } } int main() { MySqlConf::test(); return 0; }
- 编译运行:
- 解决:把
MysqlConnector/lib64/
下的dll文件拷贝到生成的exe目录下。
- 然而运行还是有异常,因为选的Debug版本,有Bug,因此选择release版本编译运行,拷贝dll
这里有乱码,因为控制台是GBK编码的,而我们存的是UTF8,所以显示乱码。
- 编译运行:
Linux下连接Mysql8
我使用centos7系统,用docker来运行mysql8:
准备工作
安装docker
docker安装请根据你的系统百度。
docker里安装mysql8.0
- 搜索mysql镜像:
docker search mysql
- 下载mysql镜像(默认最新版本):
docker pull mysql
- 运行镜像:
# 设置root密码为123456,映射本地端口3306到docker端口3306 docker run -it --rm --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql
- 查看已运行的容器:
docker ps -a
- 进入mysql容器:
docker exec -it mysql bash
- 容器内登录musql:
mysql -uroot -p123456
- 创建数据库:
create database test;
- 选择数据库:
use test;
- 创建数据表:
create table if not exists `person`( `uid` int unsigned, `age` int unsigned, `name` varchar(40) not null, PRIMARY KEY ( `uid` ) )engine=InnoDB default charset=utf8;
- 插入数据:
insert into person values(10001,18,"xiaoming"); insert into person values(10002,17,"xiaohong");
- 退出mysql:
mysql> exit
- docker指令:
- 查看docker运行情况:
docker ps
- 退出容器且关闭:
ctrl + d
- 退出容器但不关闭:
ctrl + p + q
- 查看docker运行情况:
下载MysqlConnector
- 下载地址:点我下载
- 下载完成后解压:
tar -xzvf mysql-connector-c++-8.0.19-linux-glibc2.12-x86-64bit.tar.gz
- 把解压后的文件夹移动到
/home/lib/
目录下,也可不移动,只是为了便于管理:mv mysql-connector-c++-8.0.19-linux-glibc2.12-x86-64bit /home/lib/mysqlconn8-x86-64
。名字太长,所以顺便换了个文件夹名字。
连接Mysql
使用Cmake构建项目
- CMake提供了一个统一的语法以在不同的平台构建我们的项目,且使用十分简单。在Win平台下CMake可以创建Visual Studio的项目,在Linux下也可创建Makefile,十分方便。
- CMake安装十分简单,不用多说。
- 编写CMakeLists:
- 创建文件:
CMakeLists.txt
- 编辑
# CMake的最低版本 cmake_minimum_required(VERSION 3.10) # 设置是否是在Win平台下编译 option( BUILD_IN_WIN "windows msvc build" ON) # 设置使用的C++标准 set(CMAKE_CXX_STANDARD 11) # 设置项目名称 project(TestMysql) # 设置源码路径 set(SOURCE_DIR ./project) # 设置项目目录为CMake指定的目录 set(PROJECT_DIR ${CMAKE_BINARY_DIR}) # 设置编译结果的输出目录 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_DIR}/build) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_DIR}/build) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_DIR}/build) if(BUILD_IN_WIN) # 如果在Win下编译 set(MYSQL_CONNECTOR_DIR "D:/Softwares/mysql-connector-c++-8.0.19-winx64") # 设置Connector的目录 set(MYSQL_LIB ${MYSQL_CONNECTOR_DIR}/lib64/vs14/mysqlcppconn8.lib # 设置lib ) else() # Linux下编译 set(MYSQL_CONNECTOR_DIR "/home/lib/mysqlconn8-x86-64") # 设置Connector目录 set(MYSQL_LIB ${MYSQL_CONNECTOR_DIR}/lib64/libmysqlcppconn8.so # 设置lib ) endif() include_directories(${MYSQL_CONNECTOR_DIR}/include) # 添加头文件目录 # 指定生成可执行文件 aux_source_directory(${SOURCE_DIR} SOURCE_CODES) add_executable(${PROJECT_NAME} ${SOURCE_CODES}) if( BUILD_IN_WIN ) target_link_libraries(${PROJECT_NAME} ${MYSQL_LIB} # 添加lib ) else() target_link_libraries(${PROJECT_NAME} ${MYSQL_LIB} ) endif()
- 创建文件:
- 在
CmakeLists.txt
同一文件夹下创建project
文件夹,创建main.cpp
并编辑`:#include <mysqlx/xdevapi.h> #include <iostream> namespace MySqlConf { // localhost7.0.0.1kersqlp static const std::string& connect_url = "mysqlx://root:123456@172.17.0.3:33060/test"; bool test() { try { //uri: mysqlx://user:password@host:port/db_name mysqlx::Session sess(connect_url); mysqlx::SqlResult rset = sess.sql("SELECT * FROM person").execute(); mysqlx::Row row; while (rset.hasData()) { row = rset.fetchOne(); if (row.isNull()) { std::cout << "row is null." << std::endl; break; } std::cout<<"-------------"<<std::endl; std::cout << " uid: " << row.get(0).get<int>() << std::endl; std::cout << " age: " << row.get(1).get<int>() << std::endl; std::cout << "name: " << row.get(2).get<std::string>() << std::endl; std::cout<<std::endl; } sess.close(); std::cout << "Done!" << std::endl; } catch (mysqlx::Error &err) { std::cout << "ERROR : " << err << std::endl; return false; } return true; } } int main() { MySqlConf::test(); return 0; }
注意
:此处connect_url
连接的ip是docker里的mysql的ip地址,可使用docker inspect 容器名字
查看配置,如docker inspect mysql
,然后查看名字:
确认这是我们运行的那个mysql,然后继续往下找到:
这个就是我们mysql的ip地址。- 生成makefile:
# 指定生成makefiel,并设置BUILD_IN_WIN标志位OFF,以使用另一套配置,指定生成release
cmake -B TestMysql -G "Unix Makefiles" -DBUILD_IN_WIN=OFF -DCMAKE_BUILD_TYPE=release
- 进入TestMysql目录:
cd TestMysql
- 编译:
make
- 运行:
- 如果频繁修改main.cpp再编译会发现有点麻烦,因此可以写个shell,放在
CMakeLists.txt
同一个目录下,一键编译运行:#!/bin/bash PROJECT_NAME="TestMysql" rm -rf ${PROJECT_NAME} # 删除上次生成的目录 # 生成makefile cmake3 -B ${PROJECT_NAME} -G "Unix Makefiles" -DBUILD_IN_WIN=OFF -DCMAKE_BUILD_TYPE=release # 进入生成的构建目录 cd ./${PROJECT_NAME} make # 编译 # 运行 ./build/${PROJECT_NAME}
结束语
折腾了一天,总算弄出来了,之前没有卸载以前装的mysql5.5,出了些奇怪的错误,后面删掉重新装了mysql8.0,总算成功了。