简易图书管理系统——MYsql+Javase+JDBC

目录

前言

数据表的建立

操作包各个类的实现

增加类

删除类

展示类

借阅与归还类


前言

书接上文

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

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

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

calljsh/MyJava (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/45746.shtml

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

相关文章

debian固定ip

debian固定ip 前言 安装好的Debian系统后,为了确保每次登陆的ip不变,需要固定 方法 命令如下 ip addr | grep inet因为有有线网和无线网 2 种连接方式,因此需要区别。 其中 enp 的是有线,wlp 的是无线 查看网关 IP 命令如下 …

互联网末法时代的一些思考

这篇文章也是临时起意,很长一段时间没写个人思考类的文章,主要原因也是时间完全不够用。随着年龄的增长,看待问题的视角也逐渐发生变化,例如从关注现象到关注动机,从关注结果到关注起因,2021年的时代我曾经…

java面向对象进阶篇--static

一、前言 java进阶篇已经开始了,先从面向对象开始,由于时间原因今天就只更新了static部分,内容上特别详细,一些特别的注意事项也在反复的提醒大家。 温馨提示一下,往后的java篇会越来越难,希望大家能够坚…

P2p网络性能测度及监测系统模型

P2p网络性能测度及监测系统模型 网络IP性能参数 IP包传输时延时延变化误差率丢失率虚假率吞吐量可用性连接性测度单向延迟测度单向分组丢失测度往返延迟测度 OSI中的位置-> 网络层 用途 面相业务的网络分布式计算网络游戏IP软件电话流媒体分发多媒体通信 业务质量 通过…

运维检查:mysql表自增id是否快要用完

数据库表中最大自增ID用完会报错。判断是否接近或达到自增ID类型的最大值:‌ 对于MySQL中的自增ID,‌如果使用的是int类型,‌其无符号(‌unsigned)‌的最大值可以达到2^32 - 1,‌即4294967295。‌如果使用的…

python编程:从入门到实践(第三版) 笔记

文章目录 资源网站:https://www.ituring.com.cn/book/3038配置VSCode推荐资源网站推荐资源网址 资源网站:https://www.ituring.com.cn/book/3038 配置VSCode 推荐资源网站 推荐资源网址 英文版主页: https://ehmatthes.github.io/pcc_3e 中文版主页: h…

上市公司企业共同机构所有权数据、机构交叉持股数据(2005-2023)

数据来源:基础数据来源于上市公司企业年报 时间跨度:2005-2023年 数据范围:企业层面 数据指标: 参考《中国工业经济》杜勇(2021)老师的做法,从 3 个维度构造指标反映上市公司共同机构所有权&…

Vue和Element UI 路由跳转

在Vue.js中,使用Vue Router可以方便地实现页面之间的路由跳转。Element UI是一个基于Vue 2.0的桌面端组件库,它本身并不直接提供路由跳转的功能,但你可以在使用Element UI的Vue项目中结合Vue Router来实现这一功能。 以下是一个基于Vue和Ele…

Proxyman for Mac v5.6.1 抓包调试工具

Mac分享吧 文章目录 效果一、下载软件二、功能三、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功 四、运行测试1、打开软件 安装完成!!! 效果 一…

【华为OD笔试】2024D卷命题规律解读【分析300+场OD笔试考点总结】

可上 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1441了解算法冲刺训练(备注【CSDN】否则不通过) 文章目录 相关推荐阅读华为OD笔试2024D卷命题规律解读华为OD算法/大厂面试高频题算法练习冲刺训练 相关推荐阅读 【华为OD笔试】2024D卷机考套题…

C# Opencv实现本地以图搜图

地址:冯腾飞/本地以图搜图

Java面试八股之Redis哨兵机制

Redis哨兵机制 Redis Sentinel(哨兵)模式是一种高可用解决方案,用于监控和自动故障转移Redis主从集群。以下是对哨兵模式详细过程的描述: 1. 初始化与配置 部署哨兵节点:在不同的服务器上部署一个或多个Redis Sentin…

《算法笔记》总结No.7——二分(多例题详解版)

一.二分查找 目前有一个有序数列,举个例子,假设是1~1000,让我们去查找931这个数字,浅显且暴力的做法就是直接从头到尾遍历一遍,直到找到931为止。当n非常大,比如达到100w时,这是一个非常大的量级…

Linux 线程初步解析

1.线程概念 在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列。在linux中,由于线程和进程都具有id,都需要调度等等相似性,因此都可以用PCB来描述和控制,线程含有PCB&am…

美联储降息应该更早?高盛:有充分理由7月降息,而非9月

KlipC报道:高盛首席经济学家哈祖斯Jan Hatzius表示,美联储“有充分理由”在7月会议上降息,而非等到9月。 在最新发布的报告中,他表明通胀已经取得了足够的进展,回到了美联储2%的长期目标附近,这将使美联储…

[C++ 入门基础 - 命名空间]

在C中,命名空间(Namespace)是一种用来组织代码并避免命名冲突的机制。命名空间可以包含变量、函数、类等C中的所有实体,使得这些实体的名称在命名空间内部有效,避免了与其他命名空间或全局作用域中相同名称的冲突。 文…

实现将Nginx的每个网站配置单独的访问日志

一、问题描述 Nginx默认的访问日志是不会区分哪个网站有哪些日志的,全部糅杂在一起;如果需要哪个网站有哪些访问日志记录,还需要将访问日志下载下来后筛选,比较麻烦;希望将每个网站对应的日志能够单独记录到对应的日志文件里面,方便排查和管理。 # 进入Nginx默认的日志文…

为什么Vim是程序员最喜欢的编辑器之一

简介 Vim,全称Vi IMproved,是一种高度可定制、功能强大的文本编辑器。自其诞生以来,它以高效、快速和灵活的特点深受程序员喜爱。无论是处理简单的文本文件还是复杂的代码项目,Vim都能提供卓越的编辑体验。许多资深程序员甚至称其…

c++ primer plus 第16章string 类和标准模板库,6.1.5字符串种类

c primer plus 第16章string 类和标准模板库,6.1.5字符串种类 c primer plus 第16章string 类和标准模板库,6.1.5字符串种类 文章目录 c primer plus 第16章string 类和标准模板库,6.1.5字符串种类6.1.5字符串种类 6.1.5字符串种类 本节将 string 类看作是基于 char 类型的。…

web服务器经过代理后的绝对路径问题,以及 dirname(__FILE__)和__DIR__

web服务器经过代理后的绝对路径问题,以及 dirname(__FILE__)和__DIR__ 问题描述情况解析资源路径分析访问过程分析 dirname(\_\_FILE\_\_) 与 \_\_DIR\_\_ 同步发布在个人笔记web服务器经过代理后的绝对路径问题,以及 dirname(__F…