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.pswp.cn/web/44092.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44092.shtml
英文地址,請注明出處:http://en.pswp.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進程是否能正常在前臺運行