C++图书管理系统(三)MySQL基本操作

news/2025/3/19 14:04:54/文章来源:https://www.cnblogs.com/PHarr/p/18780903

实现菜单

首先我们想确定我们的图书管理需要实现哪些功能?我们这里实现最基础的增删改查。

我们这里先实现数据库的链接,以及一个简单的菜单。

#include <iostream>
#include <string>
// MySQL Connector/C++ 核心头文件
#include <mysql_driver.h>    // MySQL驱动接口
#include <mysql_connection.h> // 数据库连接类
#include <cppconn/statement.h> // SQL语句执行接口
#include <cppconn/resultset.h> // 结果集处理类
#include <cppconn/exception.h> // SQL异常类void addBook(sql::Connection *con);void deleteBook() {};void viewBook() {};void updateBook() {};int main() {try {// 创建链接sql::mysql::MySQL_Driver *driver = sql::mysql::get_mysql_driver_instance();sql::Connection *con = driver->connect("tcp://127.0.0.1:3306", "root", "123456");con->setSchema("testdb");int choice;do { // 显示菜单std::cout << "\n==== 图书管理系统 ====\n""1. 增加图书\n""2. 查看所有图书\n""3. 更新图书\n""4. 删除图书\n""5. 退出系统\n";std::cin >> choice;if (choice == 1) addBook(con);else if (choice == 2) viewBook();else if (choice == 3) updateBook();else if (choice == 4) deleteBook();else if (choice == 5) break;else std::cout << "错误选项\n";} while (true);std::cout << "系统已退出\n";} catch (sql::SQLException &e) {std::cout << "数据库链接失败\n";}return 0;
}void addBook(sql::Connection *con) {}

添加图书

首先我们要确定的一点是,要操作数据库,就必须要获得sql::Connection,因此我们把函数的形参修改为

void addBook(sql::Connection *con);

我们在观察我们的表

+---------+------------------------+---------------+----------------+
| book_id | title                  | author        | published_date |
+---------+------------------------+---------------+----------------+
|       1 | The Catcher in the Rye | J.D. Salinger | 1951-07-16     |
|       2 | Harry Potter           | J.K. Rowing   | 1997-06-26     |
|    1234 | The Hobbit             | J.R.R Tolkien | 1937-09-21     |
|    1235 | 1984                   | Orwell        | 1949-06-08     |
+---------+------------------------+---------------+----------------+

我们这里只需要书名、作者、出版日期就好了。

这里面,我们为了可以对sql语句进行复用,我们这里引入了sql::PreparedStatement类,这个类简单来说就是可以?来作为占位符,后续在通过setString(), setInt()等方法将常数绑定到语句,并最后通过execute()调用来执行sql语句

因此我们最终的函数可以写成如下形式

void addBook(sql::Connection *con) {try {std::string title, author, date;std::cout << "请输入书名:\n";std::cin.ignore();std::getline(std::cin, title);std::cout << "请输入作者:\n";std::getline(std::cin, author);std::cout << "请输入出版日期(YYYY-MM-DD):\n";std::getline(std::cin, date);sql::PreparedStatement *pstmt = con->prepareStatement("INSERT INTO books (title,author,published_date) VALUES (?,?,?)");pstmt->setString(1, title);pstmt->setString(2, author);pstmt->setString(3, date);pstmt->execute();std::cout << "图书添加成功\n";delete pstmt;} catch (sql::SQLException &e) {std::cout << "图书添加失败\n";}
}

当然了这里不需要复用,如果真的需要复用可以用lambda等方式封装即可。

查看所有图书

与插入相比,删除操作我们的语句是相对固定的,因此直接使用就好了。和之前从测试代码很类似。

void viewBook(sql::Connection *con) {try {sql::Statement *stmt = con->createStatement();sql::ResultSet *res = stmt->executeQuery("SELECT * FROM books");std::cout << "\n====图书列表====\n";while(res->next()) {std::cout << "ID: " << res->getInt("book_id") << "\n";std::cout << "标题: " << res->getString("title") << "\n";std::cout << "作者: " << res->getString("author") << "\n";std::cout << "出版日期: " << res->getString("published_date") << "\n";std::cout << "----------------------------------\n";}delete stmt;delete res;} catch (sql::SQLException &e) {std::cout << "ca\n";}
}

删除图书

要删除图书,我们只要得到图书的id就好了。

void deleteBook(sql::Connection *con) {try {int book_id;std::cout << "输入要删除图书的ID\n";std::cin >> book_id;sql::PreparedStatement *pstmt = con->prepareStatement("DELETE FROM books WHERE book_id = ?");pstmt->setInt(1, book_id);pstmt->execute();std::cout << "图书删除成功\n";delete pstmt;} catch (sql::SQLException &e) {std::cout << "图书删除失败\n";}
}

修改图书

修改图书其实有点类似把删除和添加拼起来。

void updateBook(sql::Connection *con) {try {int book_id;std::cout << "输入要更新图书的ID\n";std::cin >> book_id;std::string title, author, date;std::cout << "请输入书名:\n";std::cin.ignore();std::getline(std::cin, title);std::cout << "请输入作者:\n";std::getline(std::cin, author);std::cout << "请输入出版日期(YYYY-MM-DD):\n";std::getline(std::cin, date);sql::PreparedStatement *pstmt = con->prepareStatement("UPDATE books SET title = ?, author = ?, published_date = ? WHERE book_id = ?");pstmt->setString(1, title);pstmt->setString(2, author);pstmt->setString(3, date);pstmt->setInt(4, book_id);pstmt->execute();std::cout << "图书更新成功\n";delete pstmt;} catch (sql::SQLException &e) {std::cout << "图书更新失败\n";}
}

完整代码

#include <iostream>
#include <string>
// MySQL Connector/C++ 核心头文件
#include <mysql_driver.h>    // MySQL驱动接口
#include <mysql_connection.h> // 数据库连接类
#include <cppconn/statement.h> // SQL语句执行接口
#include <cppconn/resultset.h> // 结果集处理类
#include <cppconn/exception.h> // SQL异常类
#include <cppconn/prepared_statement.h>void addBook(sql::Connection *con);void deleteBook(sql::Connection *con);void viewBook(sql::Connection *con);void updateBook(sql::Connection *con);int main() {try {// 创建链接sql::mysql::MySQL_Driver *driver = sql::mysql::get_mysql_driver_instance();sql::Connection *con = driver->connect("tcp://127.0.0.1:3306", "root", "123456");con->setSchema("testdb");int choice;do { // 显示菜单std::cout << "\n==== 图书管理系统 ====\n""1. 增加图书\n""2. 查看所有图书\n""3. 更新图书\n""4. 删除图书\n""5. 退出系统\n";std::cin >> choice;if (choice == 1) addBook(con);else if (choice == 2) viewBook(con);else if (choice == 3) updateBook(con);else if (choice == 4) deleteBook(con);else if (choice == 5) break;else std::cout << "错误选项\n";} while (true);std::cout << "系统已退出\n";} catch (sql::SQLException &e) {std::cout << "数据库链接失败\n";}return 0;
}void addBook(sql::Connection *con) {try {std::string title, author, date;std::cout << "请输入书名:\n";std::cin.ignore();std::getline(std::cin, title);std::cout << "请输入作者:\n";std::getline(std::cin, author);std::cout << "请输入出版日期(YYYY-MM-DD):\n";std::getline(std::cin, date);sql::PreparedStatement *pstmt = con->prepareStatement("INSERT INTO books (title,author,published_date) VALUES (?,?,?)");pstmt->setString(1, title);pstmt->setString(2, author);pstmt->setString(3, date);pstmt->execute();std::cout << "图书添加成功\n";delete pstmt;} catch (sql::SQLException &e) {std::cout << "图书添加失败\n";}
}void viewBook(sql::Connection *con) {try {sql::Statement *stmt = con->createStatement();sql::ResultSet *res = stmt->executeQuery("SELECT * FROM books");std::cout << "\n====图书列表====\n";while (res->next()) {std::cout << "ID: " << res->getInt("book_id") << "\n";std::cout << "标题: " << res->getString("title") << "\n";std::cout << "作者: " << res->getString("author") << "\n";std::cout << "出版日期: " << res->getString("published_date") << "\n";std::cout << "----------------------------------\n";}delete stmt;delete res;} catch (sql::SQLException &e) {std::cout << "ca\n";}
}void deleteBook(sql::Connection *con) {try {int book_id;std::cout << "输入要删除图书的ID\n";std::cin >> book_id;sql::PreparedStatement *pstmt = con->prepareStatement("DELETE FROM books WHERE book_id = ?");pstmt->setInt(1, book_id);pstmt->execute();std::cout << "图书删除成功\n";delete pstmt;} catch (sql::SQLException &e) {std::cout << "图书删除失败\n";}
}void updateBook(sql::Connection *con) {try {int book_id;std::cout << "输入要更新图书的ID\n";std::cin >> book_id;std::string title, author, date;std::cout << "请输入书名:\n";std::cin.ignore();std::getline(std::cin, title);std::cout << "请输入作者:\n";std::getline(std::cin, author);std::cout << "请输入出版日期(YYYY-MM-DD):\n";std::getline(std::cin, date);sql::PreparedStatement *pstmt = con->prepareStatement("UPDATE books SET title = ?, author = ?, published_date = ? WHERE book_id = ?");pstmt->setString(1, title);pstmt->setString(2, author);pstmt->setString(3, date);pstmt->setInt(4, book_id);pstmt->execute();std::cout << "图书更新成功\n";delete pstmt;} catch (sql::SQLException &e) {std::cout << "图书更新失败\n";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/901507.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go-gRPC微服务调用

协议介绍 RPC协议RPC(远程过程调用协议),通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC假定某些协议的存在,例如TCP/UDP等,为通信程序之间携带信息数据。在OSI网络七层模型中,RPC跨越了传输层和应用层,RPC使得开发包括网络分布式多程序在内的应用…

突破性技术:制药冻干机实现EtherCAT与Profinet网关模块无缝监控集成

案例分享:冻干机 EtherCAT 转 Profinet 实现温湿度监控 在现代医药生产过程中,冻干机作为关键设备,对温湿度的控制与监测尤为重要。某医药企业在其冻干机系统升级中,面临一个典型的通讯挑战:主控制系统采用 EtherCAT 协议,而现场的温湿度监控系统及其他过程控制设备则基于…

java-JNDI(二)-高版本绕过

JNDI 高版本的绕过 为了防止 JNDI 攻击,Oracle 对 JNDI 的远程类加载漏洞(如 LDAP 或 RMI 协议的远程代码执行(RCE))进行了限制 com.sun.jndi.rmi.object.trustURLCodebase=false com.sun.jndi.cosnaming.object.trustURLCodebase=false com.sun.jndi.ldap.object.trustUR…

tile

dsfTechnorati Tags: gjhgsdhttp://dfdfdfddfdfdfdsfdfdf

电视机顶盒刷机,更改固件包教程

这几天捣鼓了很久的刷机包,终于学会了怎么把已经弄好的刷机包,更改成自己想要的桌面。下面是我整理好的详细教程,本教程所需工具:刷机包大全、MLK软件、mumu模拟器 刷机包大全: 链接: https://pan.baidu.com/s/1G0on4sV9QmpxPXLUSN5ttQ?pwd=5279 提取码: 5279 一.确定机顶…

Java技术栈面试八股文:掌握这九大关键领域

Java基础:这是Java开发的基石,包括Java语言的基本语法、数据类型、控制结构、面向对象编程(OOP)概念(如类、对象、继承、封装、多态)、异常处理、集合框架等。掌握这些基础知识对于理解更高级的Java特性至关重要。Java Web基础:涉及Java在Web开发中的应用,包括Servlet、…

Unity —— SpriteAtlas + Include in Build

前言在使用atlas Sprite的过程中,会忍不住产生一个疑问,atlas是做什么用的,这个include in Build的含义是什么呢,以及它是否应该被勾选。网上查阅到了很多资源,有的说这个选项大胆勾选,有的说这个选项勾选完后图集打包后的纹理在游戏启动后,会一直常驻内存,需要自己做好…

2025预测:PLM系统集成AI的7种智能决策应用场景

随着科技的飞速发展,产品生命周期管理(PLM)系统与人工智能(AI)的集成正逐渐成为企业提升竞争力的关键因素。这种集成不仅能够优化产品开发流程,还能在多个环节实现智能决策,为企业带来前所未有的价值。在2025 年,我们有望看到 PLM 系统集成 AI 后在众多领域展现出强大的…

PLM项目管理软件在汽车行业的应用案例

PLM项目管理软件在汽车行业的应用案例 汽车行业作为制造业的重要组成部分,面临着日益复杂的产品研发、生产管理等挑战。在这样的背景下,PLM(产品生命周期管理)项目管理软件应运而生,为汽车企业提升竞争力提供了有力支持。PLM项目管理软件涵盖了从产品概念设计到产品退役的…

java自学学习路线笔记+实践项目+面试八股文

基础知识巩固Java基础:掌握基本语法、数据类型、控制结构、面向对象等核心概念。推荐学习资源:韩顺平老师的B站课程。 Java进阶:深入学习集合框架、IO流、反射、注解等高级特性。 Java并发:理解线程、锁、并发工具类等,为高并发项目开发打基础。数据库技术MySQL:掌握SQL语…

awdp pwn

ciscn&ccb半决第十八届CISCN&CCB半决赛 awdp pwn typo snprintf() 是一个 C 语言标准库函数,用于格式化输出字符串,并将结果写入到指定的缓冲区,与 sprintf() 不同的是,snprintf() 会限制输出的字符数,避免缓冲区溢出。 C 库函数 int snprintf(char str, size_t …