JDBC 实例分享——简易图书管理系统

目录

前言

数据表的建立

操作包各个类的实现

增加类

删除类

展示类

借阅与归还类


前言

书接上文

JDBC编程的学习——MYsql版本-CSDN博客

本期我们通过对先前图书管理系统进行改造,是它的数据能保存在数据库中

完整代码我已经保存在github中,能不能给个星呢!!!!

calljsh/Mylibrary (github.com)

这是先前的图书管理系统,这篇博客里面也有完整代码

图书管理系统(java) 代码展示和思路介绍 (9000字小长文)_图书管理系统关键代码展示-CSDN博客

数据表的建立

即为简易图书管理系统,我只用了一张表来储存书的信息,包括书名,作者名,价格,类型,以及是否借出 的State.

这是我们表的结构

mysql> desc lib;
+--------+-------------+------+-----+--------------+-------+
| Field  | Type        | Null | Key | Default      | Extra |
+--------+-------------+------+-----+--------------+-------+
| name   | varchar(20) | YES  |     | NULL         |       |
| author | varchar(20) | YES  |     | NULL         |       |
| price  | int         | YES  |     | NULL         |       |
| type   | varchar(20) | YES  |     | NULL         |       |
| state  | varchar(20) | YES  |     | 未被借出     |       |
+--------+-------------+------+-----+--------------+-------+

具体创建的代码如下

create table lib (name varchar(20),author varchar(20),price int,type varchar(20),state varchar(20) default '未被借出');

我们给我们的状态列设置默认值——未被借出 

好的现在我们的表建好了

操作包各个类的实现

整个图书管理系统的逻辑在之前的博客中已经详细介绍过,只要操作包中的各个类有区别,这也是我需要介绍的实例.

增加类

增加类就是写好我们需要增加书籍的信息,然后通过SQL语句使数据库执行

还是基础的五步,大致为:

创建数据源

建立链接

写好sql语句并执行

处理结果集

释放资源

package Operation;
import Book.BOOK;
import Book.BookList;
import com.mysql.cj.jdbc.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class Add implements WORK
{@Overridepublic void work(BookList bookList)throws SQLException{//1 创建DataSource dataSource=new MysqlDataSource();((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jsh?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("你的密码");//2 建立链接Connection connection=dataSource.getConnection();//3 创建sql语句System.out.println("增加图书");Scanner scanner=new Scanner(System.in);System.out.println("请输入您要添加的图书的书名:");String name= scanner.nextLine();System.out.println("请输入您要添加的图书的作者名:");String author = scanner.nextLine();System.out.println("请输入您要添加的图书的类型:");String type = scanner.nextLine();System.out.println("请输入您要添加的图书的价格:");int price = scanner.nextInt();String sql="insert into lib (name,author,price,type,state)values(?,?,?,?,default)";PreparedStatement preparedStatement=connection.prepareStatement(sql);preparedStatement.setString(1,name);preparedStatement.setString(2,author);preparedStatement.setInt(3,price);preparedStatement.setString(4,type);//4 发送给服务器int n=preparedStatement.executeUpdate();//5 释放资源preparedStatement.close();connection.close();}
}

 有一个要点需要注意,为了能够让状态(state)能够是我们设置好的默认值,我指定了列,如果有更好的写法欢迎分享

删除类

删除类其实和增加类是一样的,但是我用了try-catch-finally结构写给读者们看

try {// 建立连接connection = dataSource.getConnection();// 获取用户输入Scanner sc = new Scanner(System.in);System.out.println("输入你要删除图书的名字:");String name = sc.nextLine();// 创建SQL语句String sql = "DELETE FROM lib WHERE name = ?";preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, name);// 执行删除操作int rowsAffected = preparedStatement.executeUpdate();if (rowsAffected > 0) {System.out.println("图书删除成功");} else {System.out.println("没有找到要删除的图书");}} catch (SQLException e) {e.printStackTrace();
} finally {// 关闭资源if (preparedStatement != null) {try {preparedStatement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}
}

 下面是大致的解释

  1. try 块:

    • try 块中的代码是你希望正常执行的代码。在代码中,try 块包含建立数据库连接、获取用户输入、准备和执行SQL语句等操作。
    • connection = dataSource.getConnection(); 尝试建立与数据库的连接。
    • preparedStatement = connection.prepareStatement(sql); 准备SQL语句。
    • preparedStatement.executeUpdate(); 执行SQL语句。
  2. catch 块:

    • catch 块捕获在 try 块中发生的异常。在代码中,捕获的异常类型是 SQLException,这是处理SQL操作时可能抛出的异常类型。
    • catch (SQLException e) 表示捕获 SQLException 异常。
    • e.printStackTrace(); 打印异常的堆栈跟踪信息,帮助我们了解错误发生的具体位置和原因。
  3. finally 块:

    • finally 块中的代码无论是否发生异常都会执行,通常用于清理资源。在你的代码中,finally 块用于关闭 PreparedStatementConnection 对象,以防止资源泄漏。
    • if (preparedStatement != null) { preparedStatement.close(); } 关闭 PreparedStatement 对象。
    • if (connection != null) { connection.close(); } 关闭 Connection 对象。

使用tyr-catch-finally结构去写,能够捕获到异常,也让代码更具"健壮性" 

展示类

展示类中,我们就能看见结果集了,本质上来说,展示就是查询,然后打印出查询的结果

所以代码如下

package Operation;
import Book.BOOK;
import Book.BookList;
import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class Show  implements WORK
{@Overridepublic void work(BookList bookList) throws SQLException{// 1 创建DataSource dataSource = new MysqlDataSource();((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jsh?characterEncoding=utf8&useSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("454284665");// 2 建立链接Connection connection = dataSource.getConnection();// 3 创建sql语句String sql = "SELECT * FROM lib";PreparedStatement preparedStatement = connection.prepareStatement(sql);// 4 发送给服务器并获取结果ResultSet resultSet = preparedStatement.executeQuery();// 5 处理结果while (resultSet.next()){String name = resultSet.getString("name");String author = resultSet.getString("author");int price = resultSet.getInt("price");String type = resultSet.getString("type");String state=resultSet.getString("state");System.out.println("书名: " + name + " 作者: " + author + " 价格: " + price + " 类型: " + type + " 状态: "+state);}// 6 释放资源resultSet.close();preparedStatement.close();connection.close();}
}

结果集中它通过一套getXXX方法来获取数据,通过next()方法来读取给个查询的字段

我们通过这两种方法获得数据库的数据,然后打印出来

最后释放资源

借阅与归还类

借阅也是先通过查询,如果有查询的书,就把state修改为 '已借出' 即可

package Operation;
import Book.BOOK;
import Book.BookList;
import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class Borrow  implements WORK
{@Overridepublic void work(BookList bookList) throws SQLException{DataSource dataSource=new MysqlDataSource();((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jsh?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("454284665");//2 建立链接Connection connection=dataSource.getConnection();Scanner sc=new Scanner(System.in);System.out.println("请输入你要借的书的名字");String name=sc.nextLine();//3String sql = "select * from lib where name= ?and state ='未被借出'";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, name);// 4 发送给服务器并获取结果ResultSet resultSet = preparedStatement.executeQuery();if(resultSet.next()){String sql1="update lib set state ='已借出' where name=?";PreparedStatement preparedStatement1=connection.prepareStatement(sql1);preparedStatement1.setString(1,name);int n= preparedStatement1.executeUpdate();if(n>0){System.out.println("借阅成功");preparedStatement1.close();}}else{System.out.println("没有找到这本书,借阅失败");}//5 释放资源resultSet.close();preparedStatement.close();connection.close();

归还和借阅正好相反,这里我同样用try-catch-finally结构去写

package Operation;
import Book.BOOK;
import Book.BookList;
import com.mysql.cj.jdbc.MysqlDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class  Return  implements WORK
{@Overridepublic void work(BookList bookList) {DataSource dataSource = new MysqlDataSource();((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jsh?characterEncoding=utf8&useSSL=false");((MysqlDataSource) dataSource).setUser("root");((MysqlDataSource) dataSource).setPassword("454284665");Connection connection = null;PreparedStatement preparedStatement = null;PreparedStatement preparedStatement1 = null;ResultSet resultSet = null;try {connection = dataSource.getConnection();Scanner sc = new Scanner(System.in);System.out.println("请输入你要归还的书的名字:");String name = sc.nextLine();String sql = "SELECT * FROM lib WHERE name = ? AND state = '已借出'";preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, name);resultSet = preparedStatement.executeQuery();if (resultSet.next()) {String sql1 = "UPDATE lib SET state = '未被借出' WHERE name = ?";preparedStatement1 = connection.prepareStatement(sql1);preparedStatement1.setString(1, name);int n = preparedStatement1.executeUpdate();if (n > 0) {System.out.println("归还成功");}} else {System.out.println("没有找到这本书或这本书未被借出, 归还失败");}} catch (SQLException e) {System.out.println("数据库操作失败: " + e.getMessage());} finally {// 按正确顺序关闭资源if (resultSet != null) {try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (preparedStatement != null) {try {preparedStatement.close();} catch (SQLException e) {e.printStackTrace();}}if (preparedStatement1 != null) {try {preparedStatement1.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}

 这样我们就可以实现将数据写入数据库中,当然这是简易版本的,可以扩展的内容还有很多,例如可以建一张表存储用户的信息,可以建表存储已经借走的书等

就留给读者们自己去写了,这只是一个练习的实例

完整代码我已经分享

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

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

相关文章

记一次若依框架和Springboot常见报错的实战漏洞挖掘

目录 前言 本次测实战利用图​ 1.判段系统框架 2.登录页面功能点测试 2.1 弱口令 2.2 webpack泄露信息判断 2.3 未授权接口信息发现 3.进一步测试发现新的若依测试点 3.1 默认弱口令 3.2 历史漏洞 4.访问8080端口发现spring经典爆粗 4.1 druid弱口令 4.2 SwaggerU…

热键危机:揭秘Memcached中的热键问题及其解决方案

热键危机:揭秘Memcached中的热键问题及其解决方案 Memcached是一种广泛使用的高性能分布式内存缓存系统,它通过缓存数据来减少对后端数据库的访问压力,从而提高应用性能。然而,Memcached也可能遇到热键(hot key&#…

浅析Kafka-Stream消息流式处理流程及原理

以下结合案例&#xff1a;统计消息中单词出现次数&#xff0c;来测试并说明kafka消息流式处理的执行流程 Maven依赖 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusio…

Okhttp实现原理

OkHttp 是一个高效的 HTTP 客户端库&#xff0c;广泛应用于 Android 和 Java 应用中。它提供了简洁的 API&#xff0c;支持多种协议&#xff0c;如 HTTP/1.x 和 HTTP/2&#xff0c;并且内置了缓存和重试机制。下面是结合源码分析的 OkHttp 的实现原理&#xff1a; 核心组件 O…

Swift 数据类型

Swift 数据类型 Swift 是一种强类型语言,这意味着在 Swift 中声明的每个变量和常量都必须具有明确的类型。Swift 的类型系统旨在帮助开发者编写清晰、安全的代码。本文将详细介绍 Swift 中的基本数据类型,包括整数、浮点数、布尔值、字符和字符串。 整数类型 Swift 提供了…

音频语言学习领域数据集现状、分类及评估

Audio Language Learning (Audio-Text Learning) 是一个新兴的研究领域&#xff0c;专注于处理、理解和描述声音。它的发展动力是机器学习技术的进步以及越来越多地将声音与其相应的文本描述相结合的数据集的可用性。 Audio Language Models (ALMs) 是这个领域的关键技术&#…

MATLAB中的SDPT3、LMILab、SeDuMi工具箱

MATLAB中的SDPT3、LMILab、SeDuMi工具箱都是用于解决特定数学优化问题的工具箱&#xff0c;它们在控制系统设计、机器学习、信号处理等领域有广泛的应用。以下是对这三个工具箱的详细介绍&#xff1a; 1. SDPT3工具箱 简介&#xff1a; SDPT3&#xff08;Semidefinite Progra…

基于QT开发的反射内存小工具

前言 最近项目需要需要开发一个反射内存小工具&#xff0c;经过2天的修修改终于完成了。界面如下&#xff1a; 功能简介 反射内存指定地址数据读取反射内存指定地址数据写入反射内存指定地址数据清理十进制、十六进制、二进制数据相互转换 部分代码 void RfmMain::setWOthe…

SqlSugar-使用SqlSugar进行多数据库操作

使用SqlSugar进行多数据库操作主要涉及以下几个步骤&#xff1a; 1. 配置数据库连接 首先&#xff0c;你需要在项目的配置文件中&#xff08;如appsettings.json、web.config或app.config&#xff09;配置多个数据库的连接字符串。每个连接字符串都对应一个不同的数据库。 例…

攻防世界(PHP过滤器过滤)file_include

转换过滤器官方文档&#xff1a;https://www.php.net/manual/zh/filters.convert.php#filters.convert.iconv 这道题因为convert.base64-encode被过滤掉了&#xff0c;所以使用convert.iconv.*过滤器 在激活 iconv 的前提下可以使用 convert.iconv.* 压缩过滤器&#xff0c; 等…

Win10安装MongoDB(详细版)

文章目录 1、安装MongoDB Server1.1. 下载1.2. 安装 2、手动安装MongoDB Compass(GUI可视工具)2.1. 下载2.2.安装 3、测试连接3.1.MongoDB Compass 连接3.2.使用Navicat连接 1、安装MongoDB Server 1.1. 下载 官网下载地址 https://www.mongodb.com/try/download/community …

【第28章】MyBatis-Plus之插件主体

文章目录 前言一、MybatisPlusInterceptor 概览1. 属性2. InnerInterceptor 接口 二、使用示例1.Spring 配置2.Spring Boot 配置3 .mybatis-config.xml 配置 三、拦截忽略注解 InterceptorIgnore四、手动设置拦截器忽略执行策略五、本地缓存 SQL 解析总结 前言 MyBatis-Plus 提…

android 固定图片大小

在Android中&#xff0c;固定图片大小可以通过多种方法实现&#xff0c;这些方法主要涉及到ImageView控件的使用、Bitmap类的操作&#xff0c;以及第三方库&#xff08;如Glide&#xff09;的辅助。以下是几种常见的方法&#xff1a; 1. 使用ImageView控件 在Android的布局文…

利用docker容器安装node,使用vue的开发环境

目录 vue-app ├── docker-data │ ├── site │ ├── app ├── docker-compose.yaml └── deploy.sh docker-compose.yaml yaml文件执行 version: 3.8services:node:image: node:latestcontainer_name: vue-appports:- "8080:8080" # 宿主8080映射容器8…

系统服务综合项目

要求&#xff1a; 现有主机 node01 和 node02&#xff0c;完成如下需求&#xff1a; 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4、该虚拟主机的documentroot目录在 /nfs/rhce 目录 5、该目录由 no…

如何保证语音芯片的稳定性能和延长使用寿命

要让语音芯片保持稳定性能&#xff0c;首先需要深入理解其工作原理和内部构造。语音芯片&#xff0c;作为现代电子设备中的核心组件之一&#xff0c;承载着声音信号的处理与输出功能。为了确保其稳定运行&#xff0c;我们需要从多个方面进行细致的考虑和操作。‌ 1、避免长期高…

Windows系统MySQL的安装,客户端工具Navicat的安装

下载mysql安装包&#xff0c;可以去官网下载&#xff1a;www.mysql.com。点击downloads 什么&#xff1f;后面还有福利&#xff1f; 下载MySQL 下载企业版&#xff1a; 下载Windows版 5点多的版本有点低&#xff0c;下载8.0.38版本的。Window系统。下载下面的企业版。不下载…

乡镇集装箱生活污水处理设备处理效率高

乡镇集装箱生活污水处理设备处理效率高 乡镇集装箱生活污水处理设备优势 结构紧凑&#xff1a;集装箱式设计减少了占地面积&#xff0c;便于在土地资源紧张的乡镇地区部署。 安装方便&#xff1a;设备出厂前已完成组装和调试&#xff0c;现场只需进行简单的连接和调试即可投入使…

[数字图像处理]基础知识整理(部分,持续更新)

程序中描述一副图像&#xff0c;已知其横向纵向的像素个数即可&#xff08;&#xff09; 灰度直方图能反映一副图像各个灰度级像素占图像的面积比&#xff08;√&#xff09; 从程序编写的角度看&#xff0c;描述一副图像的基本属性通常包括其分辨率&#xff0c;即图像的宽度…

Docker镜像和容器的管理

1 Docker镜像管理操作 开启镜像加速 根据关键字查询镜像 下载查看镜像 详细镜像信息 查看latest版本 上传镜像到阿里云仓库 2 Docker容器操作 关于容器根据第一个pid进程是否能正常在前台运行