本篇文章介绍如何在Linux平台使用Connector/C++ 连接数据库,假定MySQL已经安装完成。如果还没有安装MySQL,请先安装。MySQL版本:8.0.19

目录

1. 安装Connector/C++

2. 编写代码

3. 创建数据库

4. 可能遇到的编译问题解决方案

参考文档:


示例是一个图书馆管理系统,拥有添加、删除、修改、查询功能。先看下实现效果图:

在看具体代码之前,先看下示例的设计文档:

下面进入正式教程:

1. 安装Connector/C++

下载地址(https://dev.mysql.com/downloads/connector/cpp/)。

下载解压完成后,如下图:

lib64存放库文件,include存放头文件。

2. 编写代码

新建library目录。然后在该目录下新建三个文件。library_main.cpp, library_sql.h, library_book.h Makefile 。代码如下:

library_main.cpp

/**  Desc: Linux c++ MySQL 示例,图书馆管理系统,主程序*  Author: mason*  Date: 20200203*/#include "library_book.h"
#include "library_sql.h"#define LIBRARY_ADD_BOOK    1   // 添加
#define LIBRARY_DELETE_BOOK 2   // 删除
#define LIBRARY_UPDATE_BOOK 3   // 修改
#define LIBRARY_QUERY_BOOK  4   // 查询
#define LIBRARY_QUIT        5   // 退出// MySQL单例类静态变量初始化
sql::Driver* sql_loader::driver = nullptr;
sql::Connection* sql_loader::con = nullptr;
sql::Statement* sql_loader::stmt = nullptr;
sql::ResultSet* sql_loader::res = nullptr;
bool sql_loader::init = false;// 系统使用说明
void Usage()
{cout<<"\n欢迎使用图书管理系统\n""1:添加图书\n""2:删除图书\n""3:修改图书\n""4:查询图书\n""5:退出系统\n"<<endl;return ;
}// 读取图书信息
void ReadBook(Book &new_book)
{cout<<"请输入添加的书名:";cin>>new_book.book_name;cout<<"请输入作者:";cin>>new_book.author;//cout<<"[DEBUG]"<<author<<endl;cout<<"请输入价格:";cin>>new_book.price;cout<<"请输入数量:";cin>>new_book.quantity;return ;
}int main()
{bool is_quit = false;int op_code = -1, book_id;string book_name, author;unsigned int price, quantity;Book new_book;vector<Book> book_list;// 主循环while (!is_quit){Usage();cout<<"请输入你的选择:";cin>>op_code;switch (op_code){// 添加操作case LIBRARY_ADD_BOOK:// 读取图书信息ReadBook(new_book);sql_loader::add(new_book);break;// 删除操作case LIBRARY_DELETE_BOOK:    sql_loader::delete_book();break;// 修改操作case LIBRARY_UPDATE_BOOK:    cout<<"请输入待修改的编号:";cin>>new_book.id;ReadBook(new_book);sql_loader::update(new_book);break;        // 查询操作case LIBRARY_QUERY_BOOK:            sql_loader::query(book_list);// 打印查询结果cout << "------------- 查询开始 ----------------" <<endl;for (auto &iter : book_list){   cout <<"编号: "<< iter.id << endl;cout <<"书名: "<< iter.book_name << endl;cout <<"作者: "<< iter.author << endl;cout <<"数量: "<< iter.quantity << endl;cout <<"价格: "<< iter.price << endl;cout << "-----------------------------" <<endl;}            cout << "------------- 查询结束 ----------------" <<endl;// 清空上次查询结果book_list.erase(book_list.begin(), book_list.end());break;// 退出系统        case LIBRARY_QUIT:is_quit = true;break;      default:cout<<"未识别的操作:"<<op_code<<endl;break;}}cout<<"感谢使用"<<endl;return 0;
}

library_book.h

 /**  Desc: Linux c++ MySQL 示例,图书馆管理系统,图书类*  Author: mason*  Date: 20200203*/#pragma once
#include <string>
#include <iostream>using namespace std;class Book
{public:int id;                      // 图书编号string book_name;            // 书名string author;               // 作者unsigned int price;          // 价格unsigned int quantity;       // 数量public:// 默认构造函数Book(){}// 含参构造函数Book(string book_name, string author, int price, int quantity, int book_id = 0):book_name(book_name),author(author),price(price),quantity(quantity), id(book_id){}// 析构函数    ~Book(){}
};

library_sql.h

/**  Desc: Linux c++ MySQL 示例,图书馆管理系统,MySQL单例*  Author: mason*  Date: 20200203*/#pragma once#include <vector>
#include "library_book.h"
#include <mysql_connection.h>#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>#define SQL_QUERY_ALL           0   // 查询所有
#define SQL_QUERY_BY_AUTHOR     1   // 查询作者
#define SQL_QUERY_BY_ID         2   // 查询编号
#define SQL_QUERY_BY_BOOK_NAME  3   // 查询书名#define SQL_DELETE_ALL           0   // 删除所有
#define SQL_DELETE_BY_AUTHOR     1   // 删除作者
#define SQL_DELETE_BY_ID         2   // 删除编号
#define SQL_DELETE_BY_BOOK_NAME  3   // 删除书名using namespace std;class sql_loader
{public:static sql::Driver *driver;static sql::Connection *con;static sql::Statement *stmt;static sql::ResultSet *res;static bool init;// sql 初始化static void sql_loader_init(){if (sql_loader::init){cout<<"sql 已经完成初始化"<<endl;return ;}/* Create a connection */driver = get_driver_instance();// 密码和用户名con = driver->connect("tcp://127.0.0.1:3306", "root", "123456");/* Connect to the MySQL test database ,数据库名*/con->setSchema("library");init = true;cout<<"sql 初始化成功"<<endl;return ;}// 添加图书static void add(Book &new_book){// SQL初始化sql_loader_init();// 创建并构造sql语句,用完后手动删除stmt = con->createStatement();string sql_cmd = "INSERT INTO books(name, author, price, quantity) VALUES ('";sql_cmd.append(new_book.book_name);sql_cmd.append("','");sql_cmd.append(new_book.author);sql_cmd.append("', ");sql_cmd.append(to_string(new_book.price));sql_cmd.append(", ");sql_cmd.append(to_string(new_book.quantity));sql_cmd.append(")");cout<<"insert cmd : "<<sql_cmd<<endl;try{stmt->execute(sql_cmd);} catch (sql::SQLException &e) {cout << "# ERR: SQLException in " << __FILE__;cout << "(" << __FUNCTION__ << ") on line "<< __LINE__ << endl;cout << "# ERR: " << e.what();cout << " (MySQL error code: " << e.getErrorCode();cout << ", SQLState: " << e.getSQLState() << " )" << endl;}// 删除资源delete stmt;return ;}// 修改图书static void update(Book& new_book){// SQL初始化sql_loader_init();// 创建并构造sql语句,用完后手动删除            stmt = con->createStatement();string sql_cmd = "update books set name='";sql_cmd.append(new_book.book_name);sql_cmd.append("', author='");sql_cmd.append(new_book.author);sql_cmd.append("', price=");sql_cmd.append(to_string(new_book.price));sql_cmd.append(", quantity=");sql_cmd.append(to_string(new_book.quantity));sql_cmd.append(" where id=");sql_cmd.append(to_string(new_book.id));cout<<"update cmd : "<<sql_cmd<<endl;try{stmt->execute(sql_cmd);} catch (sql::SQLException &e) {cout << "# ERR: SQLException in " << __FILE__;cout << "(" << __FUNCTION__ << ") on line "<< __LINE__ << endl;cout << "# ERR: " << e.what();cout << " (MySQL error code: " << e.getErrorCode();cout << ", SQLState: " << e.getSQLState() << " )" << endl;}// 释放资源delete stmt;return ;            }// 删除图书static void delete_book(){int op_code = -1, book_id;string author, book_name;string sql_cmd = "delete from books";cout<<"请输入删除方式:\n""0: 删除所有图书\n""1: 删除指定作者\n""2: 删除指定编号\n""3: 删除指定图书"<<endl;cin>>op_code;switch (op_code){case SQL_DELETE_ALL:break;case SQL_DELETE_BY_AUTHOR:cout<<"请输入要删除的作者:";cin>>author;sql_cmd.append(" where author='");sql_cmd.append(author);sql_cmd.append("'");break;case SQL_DELETE_BY_ID:cout<<"请输入要删除的编号:";cin>>book_id;sql_cmd.append(" where id=");sql_cmd.append(to_string(book_id));             break;case SQL_DELETE_BY_BOOK_NAME:cout<<"请输入要删除的书名:";cin>>book_name;sql_cmd.append(" where name='");sql_cmd.append(book_name);sql_cmd.append("'");                break;default:cout<<"不存在 "<<op_code<<" 对应的删除方式,删除失败"<<endl;return ;}cout<<"delete cmd : "<<sql_cmd<<endl;// 初始化SQLsql_loader_init();// 创建并构造sql语句,用完后手动删除            stmt = con->createStatement();try{// 执行SQL语句stmt->execute(sql_cmd);// 释放资源delete stmt;} catch (sql::SQLException &e) {cout << "# ERR: SQLException in " << __FILE__;cout << "(" << __FUNCTION__ << ") on line "<< __LINE__ << endl;cout << "# ERR: " << e.what();cout << " (MySQL error code: " << e.getErrorCode();cout << ", SQLState: " << e.getSQLState() << " )" << endl;}return ;            }// 查询图书static void query(vector<Book>& book_list){int op_code = -1, book_id;string author, book_name;string sql_cmd = "select id, name, author, quantity, price from books";cout<<"请输入查询方式:\n""0: 查询所有\n""1: 查询作者\n""2: 查询编号\n""3: 查询书名"<<endl;cin>>op_code;switch (op_code){case SQL_QUERY_ALL:break;case SQL_QUERY_BY_AUTHOR:cout<<"请输入要查询的作者:";cin>>author;sql_cmd.append(" where author='");sql_cmd.append(author);sql_cmd.append("'");break;case SQL_QUERY_BY_ID:cout<<"请输入要查询的编号:";cin>>book_id;sql_cmd.append(" where id=");sql_cmd.append(to_string(book_id));             break;case SQL_QUERY_BY_BOOK_NAME:cout<<"请输入要查询的书名:";cin>>book_name;sql_cmd.append(" where name='");sql_cmd.append(book_name);sql_cmd.append("'");                break;default:cout<<"不存在 "<<op_code<<" 对应的查询方式,查询失败"<<endl;return ;}cout<<"query cmd : "<<sql_cmd<<endl;// 初始化SQL            sql_loader_init();// 创建并构造sql语句,用完后手动删除             stmt = con->createStatement();try{// 执行查询res = stmt->executeQuery(sql_cmd);while (res->next()) {/* Access column data by alias or column name */cout << res->getInt("id") << res->getString("name") << res->getString("author") << res->getInt("quantity") << endl;book_list.push_back(Book(res->getString("name"), res->getString("author"), res->getInt("price"), res->getInt("quantity"), res->getInt("id")));/* Access column data by numeric offset, 1 is the first column *///cout << res->getString(1) << endl;}// 资源释放delete res;delete stmt;} catch (sql::SQLException &e) {cout << "# ERR: SQLException in " << __FILE__;cout << "(" << __FUNCTION__ << ") on line "<< __LINE__ << endl;cout << "# ERR: " << e.what();cout << " (MySQL error code: " << e.getErrorCode();cout << ", SQLState: " << e.getSQLState() << " )" << endl;}return ;}private:sql_loader(){}
};

Makefile,编译路径根据实际路径做调整。

default:g++ -std=c++11 -I /data/home/code/github/cpp-test/mysql/include/jdbc -L /data/home/code/github/cpp-test/mysql/lib64   library_main.cpp -o app  -lmysqlcppconn
clean:rm -rf app

3. 创建数据库

// 创建数据库
create database library;    // 创建图书表
create table books (id int not null auto_increment,name varchar(1024) not null,author   varchar(1024) not null,price int not null default 0,quantity int not null default 1,primary key(id)
)DEFAULT CHARACTER SET = utf8;

4. 可能遇到的编译问题解决方案

1. jdbc/mysql_connection.h:37:32: fatal error: boost/shared_ptr.hpp: No such file or directory

解决方式是安装boost-devel,yum安装命令如下,ubuntu或者其它平台请自行搜索。

yum install boost-devel

2. # ERR: Host '127.0.0.1' is not allowed to connect to this MySQL server (MySQL error code: 1130, SQLState: HY000 )

无法连接MySQL,先查看本地msyqld是否允许以及能否登陆,都正常可能是权限问题,参考这篇博客:

https://blog.csdn.net/eric_sunah/article/details/18567091

参考文档:

1. https://docs.oracle.com/cd/E17952_01/connector-cpp-1.1-en

Linux MySQL Connector/C++ 编程实例相关推荐

  1. mysql c api example_The MySQL C API 编程实例

    在网上找了一些MYSQL C API编程的文章,看了后认为还是写的不够充分,依据自己经验写了这篇<The MySQL C API 编程实例>,希望对须要调用到MYSQL的C的API的朋友有 ...

  2. MySQL Connector/C++ 接口实例

    mysql的官方网站有对MySQL Connector/C++的文档解释和具体实例,但是大家也知道,如果把那些具体实例的代码只是生硬的套入项目工程中是万万不行的,因为项目安全性要求,需要对容错,资源创 ...

  3. mysql connector c编程_MySQL数据库之MySQL Connector 编程

    本文主要向大家介绍了MySQL数据库之MySQL Connector 编程 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. MySQL Connector 是MySQL数据库客户 ...

  4. linux mysql 5.6.24_Mysql实例Linux安装MySQL5.6.24使用文字说明

    <Mysql实例Linux安装MySQL5.6.24使用文字说明>要点: 本文介绍了Mysql实例Linux安装MySQL5.6.24使用文字说明,希望对您有用.如果有疑问,可以联系我们. ...

  5. linux mysql c语言编程,在Linux下通过C语言操作MySQL数据库

    2010年1月27日 晚 22:10 作者:longyun(http://www.linuxdiyf.com/mailto:mtd527@gmail.com) 续:小弟最近想学习数据库,并想开发一个简 ...

  6. mysql中php编程实例_PHP连接MYSQL数据库实例代码

    现在做的项目需要php连接mysql数据库,虽然之前学过,但是现在基本上都给忘了,之后通过查找相关资料找到了解决方法,下面小编把具体方法分享在聚米学院平台供大家学习. 具体代码如下所示: <?p ...

  7. linux bash sh,linux bash shell.sh编程实例

    1.输出 #!/bin/bash echo "Please type your number:" read a for ((i=1;i<=a;i++)) do for ((p ...

  8. Linux下C++ Socket编程实例

    参考文章: https://www.cnblogs.com/wuyepeng/p/9737583.html

  9. mysql 小球_c语言编程实例——小球跳动

    1.预备知识 1.1 相关头文件 "#include"是c语言中用以申明所需调用的库函数或自定义函数的头文件路径及文件名.#include ""和#includ ...

最新文章

  1. linux php进程端口占用,linux如何查看端口占用情况
  2. [zt]如何用Javascript获得TextArea中的光标位置
  3. 皮一皮:听说这是功夫熊猫风的情侣酒店...
  4. Zookeeper API 学习与使用
  5. sql语句-linq语言-lambda表达式对照
  6. C++ vector和list的区别
  7. Python3 GUI编程: 自带图形库 tkinter 学习教程
  8. java final域_【Java】final 域的内存语义
  9. HTML中想要看见盒子的边框,盒子边框装饰
  10. 试题 基础练习 字母图形 java代码
  11. windows下端口映射(端口转发)
  12. 计算机画图星星怎么画,教你尺规作图画五角星!
  13. Office各个windows版本支持大全
  14. 一个javaweb基础的小游戏。。俄罗斯方块。。。
  15. 华为4月11号 南研所 面经。(已拿offer)
  16. 第九届蓝桥杯个人赛省赛(软件类)C++B组试题第九题
  17. 现在想心平气和地过完一天,真的太难了!
  18. 华为HCIE RS笔记-02分层
  19. 【IoT】创业:智能硬件企业如何开始?
  20. 德国罗氏Roehrs BT40-3010090、HSK A63-3009555

热门文章

  1. 【转】iOS-Core-Animation-Advanced-Techniques(六)
  2. jQuery Mobile 图标无法显示
  3. php include和require
  4. linux find 文件夹下查找字符串
  5. redis主从复制如何保证数据一致性_面试官:Redis 主从复制时网络开小差了怎么整?...
  6. 神经网络与原子轨道线性组合算法LCAO
  7. 二分类吸引子,排斥子,鞍点和反鞍点数据汇总
  8. 【Leetcode | easy】反转整数
  9. 1.12 深层循环神经网络-深度学习第五课《序列模型》-Stanford吴恩达教授
  10. 1.5 为什么正则化有利于预防过拟合-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授