簡易圖書管理系統——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.pswp.cn/web/45746.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45746.shtml
英文地址,請注明出處:http://en.pswp.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…