實戰項目:基于控制臺與數據庫的圖書管理系統開發指南

一、項目概述與設計思路

1.1 為什么選擇圖書管理系統

圖書管理系統是學習編程的經典項目,它涵蓋了:

  • 控制臺交互:學習用戶輸入輸出處理

  • 數據庫操作:掌握CRUD核心功能

  • 業務邏輯:理解實際應用場景

  • 系統架構:實踐分層設計思想

1.2 系統功能設計

核心功能模塊

1. 圖書管理- 添加新書- 刪除圖書- 修改圖書信息- 查詢圖書(按ID/書名/作者)2. 借閱管理- 圖書借出- 圖書歸還- 借閱記錄查詢3. 用戶管理- 讀者注冊- 讀者信息修改- 讀者注銷4. 統計報表- 圖書庫存統計- 借閱排行榜- 逾期未還清單

1.3 技術選型

技術組件選擇方案備注
開發語言Java 8+兼顧教學與實用
數據庫MySQL 8.0免費開源,應用廣泛
數據庫連接JDBC學習原生數據庫操作
控制臺框架-純Java實現
單元測試JUnit 5保證代碼質量
日志系統SLF4J + Logback記錄系統運行狀態

二、數據庫設計與實現

2.1 數據庫表結構設計

ER圖關鍵實體

圖書(Book) ---< 借閱記錄(BorrowRecord) >--- 讀者(Reader)

建表SQL

-- 圖書表
CREATE TABLE books (book_id INT AUTO_INCREMENT PRIMARY KEY,isbn VARCHAR(20) NOT NULL UNIQUE,title VARCHAR(100) NOT NULL,author VARCHAR(50) NOT NULL,publisher VARCHAR(50),publish_date DATE,price DECIMAL(10,2),stock INT DEFAULT 1 COMMENT '庫存數量',create_time DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 讀者表
CREATE TABLE readers (reader_id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,gender CHAR(1) CHECK (gender IN ('M', 'F')),phone VARCHAR(20),email VARCHAR(100),register_date DATE DEFAULT (CURRENT_DATE),membership_level INT DEFAULT 1
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;-- 借閱記錄表
CREATE TABLE borrow_records (record_id INT AUTO_INCREMENT PRIMARY KEY,book_id INT NOT NULL,reader_id INT NOT NULL,borrow_date DATETIME DEFAULT CURRENT_TIMESTAMP,due_date DATETIME GENERATED ALWAYS AS (borrow_date + INTERVAL 30 DAY) STORED,return_date DATETIME,status TINYINT DEFAULT 1 COMMENT '1-借出 2-已還 3-逾期',FOREIGN KEY (book_id) REFERENCES books(book_id),FOREIGN KEY (reader_id) REFERENCES readers(reader_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2.2 索引優化設計

-- 提高查詢性能的索引
CREATE INDEX idx_books_title ON books(title);
CREATE INDEX idx_books_author ON books(author);
CREATE INDEX idx_borrow_records_status ON borrow_records(status);
CREATE INDEX idx_borrow_records_due_date ON borrow_records(due_date);

2.3 初始化測試數據

-- 插入示例圖書
INSERT INTO books (isbn, title, author, publisher, price, stock)
VALUES 
('9787111636667', 'Java核心技術 卷I', 'Cay S. Horstmann', '機械工業出版社', 119.00, 5),
('9787115523660', 'Effective Java', 'Joshua Bloch', '機械工業出版社', 129.00, 3),
('9787302515421', 'Python編程:從入門到實踐', 'Eric Matthes', '人民郵電出版社', 89.00, 7);-- 插入示例讀者
INSERT INTO readers (name, gender, phone, email)
VALUES 
('張三', 'M', '13800138001', 'zhangsan@example.com'),
('李四', 'F', '13900139001', 'lisi@example.com');

三、Java核心代碼實現

3.1 數據庫連接層

DBUtil.java?- 數據庫工具類:

public class DBUtil {private static final String URL = "jdbc:mysql://localhost:3306/library_db?useSSL=false&serverTimezone=UTC";private static final String USER = "root";private static final String PASSWORD = "123456";static {try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}}public static Connection getConnection() throws SQLException {return DriverManager.getConnection(URL, USER, PASSWORD);}public static void close(Connection conn, Statement stmt, ResultSet rs) {try {if (rs != null) rs.close();if (stmt != null) stmt.close();if (conn != null) conn.close();} catch (SQLException e) {e.printStackTrace();}}
}

3.2 實體類設計

Book.java?- 圖書實體:

public class Book {private Integer bookId;private String isbn;private String title;private String author;private String publisher;private Date publishDate;private BigDecimal price;private Integer stock;// 構造方法、getter和setter省略// 建議使用Lombok @Data注解簡化代碼
}

3.3 數據訪問層(DAO)

BookDAO.java?- 圖書數據訪問:

public class BookDAO {// 添加新書public boolean addBook(Book book) {String sql = "INSERT INTO books (isbn, title, author, publisher, publish_date, price, stock) " +"VALUES (?, ?, ?, ?, ?, ?, ?)";try (Connection conn = DBUtil.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setString(1, book.getIsbn());pstmt.setString(2, book.getTitle());pstmt.setString(3, book.getAuthor());pstmt.setString(4, book.getPublisher());pstmt.setDate(5, new java.sql.Date(book.getPublishDate().getTime()));pstmt.setBigDecimal(6, book.getPrice());pstmt.setInt(7, book.getStock());return pstmt.executeUpdate() > 0;} catch (SQLException e) {e.printStackTrace();return false;}}// 按ID查詢圖書public Book getBookById(int bookId) {String sql = "SELECT * FROM books WHERE book_id = ?";Book book = null;try (Connection conn = DBUtil.getConnection();PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setInt(1, bookId);try (ResultSet rs = pstmt.executeQuery()) {if (rs.next()) {book = new Book();book.setBookId(rs.getInt("book_id"));book.setIsbn(rs.getString("isbn"));// 設置其他屬性...}}} catch (SQLException e) {e.printStackTrace();}return book;}// 其他CRUD方法...
}

3.4 業務邏輯層(Service)

LibraryService.java?- 核心業務邏輯:

public class LibraryService {private BookDAO bookDAO = new BookDAO();private ReaderDAO readerDAO = new ReaderDAO();private BorrowRecordDAO recordDAO = new BorrowRecordDAO();// 借書業務方法public boolean borrowBook(int bookId, int readerId) {// 檢查圖書庫存Book book = bookDAO.getBookById(bookId);if (book == null || book.getStock() <= 0) {System.out.println("圖書不存在或庫存不足");return false;}// 檢查讀者是否存在Reader reader = readerDAO.getReaderById(readerId);if (reader == null) {System.out.println("讀者不存在");return false;}// 檢查是否已借過同一本書未還if (recordDAO.hasUnreturnedRecord(bookId, readerId)) {System.out.println("您已借閱該書且未歸還");return false;}// 開啟事務Connection conn = null;try {conn = DBUtil.getConnection();conn.setAutoCommit(false);// 1. 減少庫存bookDAO.updateStock(conn, bookId, -1);// 2. 創建借閱記錄BorrowRecord record = new BorrowRecord();record.setBookId(bookId);record.setReaderId(readerId);recordDAO.addRecord(conn, record);conn.commit();return true;} catch (SQLException e) {if (conn != null) {try {conn.rollback();} catch (SQLException ex) {ex.printStackTrace();}}e.printStackTrace();return false;} finally {if (conn != null) {try {conn.setAutoCommit(true);conn.close();} catch (SQLException e) {e.printStackTrace();}}}}// 其他業務方法...
}

3.5 控制臺界面實現

ConsoleUI.java?- 用戶交互界面:

public class ConsoleUI {private Scanner scanner = new Scanner(System.in);private LibraryService libraryService = new LibraryService();public void start() {while (true) {showMainMenu();int choice = getIntInput("請選擇操作:");switch (choice) {case 1:manageBooks();break;case 2:manageReaders();break;case 3:manageBorrowing();break;case 4:generateReports();break;case 0:System.out.println("感謝使用圖書管理系統,再見!");return;default:System.out.println("無效選擇,請重新輸入");}}}private void showMainMenu() {System.out.println("\n===== 圖書管理系統 =====");System.out.println("1. 圖書管理");System.out.println("2. 讀者管理");System.out.println("3. 借閱管理");System.out.println("4. 統計報表");System.out.println("0. 退出系統");}private void manageBooks() {while (true) {System.out.println("\n===== 圖書管理 =====");System.out.println("1. 添加新書");System.out.println("2. 查詢圖書");System.out.println("3. 修改圖書信息");System.out.println("4. 刪除圖書");System.out.println("0. 返回上級菜單");int choice = getIntInput("請選擇操作:");switch (choice) {case 1:addNewBook();break;case 2:searchBooks();break;// 其他case...case 0:return;default:System.out.println("無效選擇");}}}private void addNewBook() {System.out.println("\n--- 添加新書 ---");String isbn = getStringInput("ISBN:");String title = getStringInput("書名:");String author = getStringInput("作者:");Book book = new Book();book.setIsbn(isbn);book.setTitle(title);book.setAuthor(author);// 設置其他屬性...if (libraryService.addBook(book)) {System.out.println("添加圖書成功!");} else {System.out.println("添加圖書失敗");}}// 其他方法...private int getIntInput(String prompt) {while (true) {try {System.out.print(prompt);return Integer.parseInt(scanner.nextLine());} catch (NumberFormatException e) {System.out.println("請輸入有效數字!");}}}private String getStringInput(String prompt) {System.out.print(prompt);return scanner.nextLine();}
}

四、項目擴展與優化

4.1 功能擴展建議

  1. 預約功能

    • 允許讀者預約已被借出的圖書

    • 圖書歸還時通知預約讀者

  2. 逾期罰款

    • 計算逾期天數

    • 按規則自動計算罰款金額

  3. 圖書推薦

    • 基于借閱歷史的簡單推薦

    • 熱門圖書推薦

4.2 代碼優化方向

引入連接池

// 使用HikariCP替代原生JDBC連接
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/library_db");
config.setUsername("root");
config.setPassword("123456");
HikariDataSource dataSource = new HikariDataSource(config);

使用DAO接口

public interface BookDAO {boolean addBook(Book book);Book getBookById(int bookId);// 其他方法...
}public class BookDAOImpl implements BookDAO {// 實現方法...
}

日志記錄

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class BookDAOImpl implements BookDAO {private static final Logger logger = LoggerFactory.getLogger(BookDAOImpl.class);public boolean addBook(Book book) {logger.debug("嘗試添加圖書:{}", book.getTitle());// 實現代碼...}
}

4.3 異常處理改進

自定義異常類

public class LibraryException extends Exception {public LibraryException(String message) {super(message);}public LibraryException(String message, Throwable cause) {super(message, cause);}
}// 使用示例
public void borrowBook(int bookId, int readerId) throws LibraryException {try {// 業務邏輯...} catch (SQLException e) {throw new LibraryException("借書操作失敗", e);}
}

五、項目部署與測試

5.1 單元測試示例

BookDAOTest.java

public class BookDAOTest {private BookDAO bookDAO = new BookDAOImpl();@Testpublic void testAddAndGetBook() {Book book = new Book();book.setIsbn("978-3-16-148410-0");book.setTitle("測試圖書");book.setAuthor("測試作者");boolean added = bookDAO.addBook(book);assertTrue(added);Book retrieved = bookDAO.getBookByIsbn("978-3-16-148410-0");assertNotNull(retrieved);assertEquals("測試圖書", retrieved.getTitle());}// 其他測試方法...
}

5.2 系統測試流程

  1. 圖書管理測試

    • 添加不同種類的圖書

    • 測試各種查詢條件組合

    • 驗證庫存更新邏輯

  2. 借還書測試

    • 正常借書/還書流程

    • 測試庫存不足情況

    • 驗證逾期計算正確性

  3. 并發測試

    • 模擬多個用戶同時借閱同一本書

    • 驗證庫存扣減的原子性

結語

通過這個圖書管理系統項目,我們完整實踐了:

  1. 控制臺程序的交互設計

  2. 數據庫表結構設計與優化

  3. JDBC的實戰應用

  4. 分層架構的實現

  5. 基礎業務邏輯開發

進一步學習建議

  1. 嘗試使用MyBatis重構數據訪問層

  2. 添加Web界面轉型為B/S架構

  3. 學習使用Spring框架改造項目

  4. 研究數據庫事務隔離級別的實際影響

如果您在實現過程中遇到任何問題,歡迎在評論區留言討論。覺得本文有幫助的話,請點贊收藏支持!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903982.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903982.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903982.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人工智能——層次聚類算法

目錄 摘要 18 層次聚類 18.1 本章工作任務 18.2 本章技能目標 18.3 本章簡介 18.4 編程實戰 18.5 本章總結 18.6 本章作業 本章已完結&#xff01;&#xff01;&#xff01; 摘要 本章實現的工作是&#xff1a;首先導入20名學生的3科成績&#xff0c;然后根據優先聚…

Linux中安裝mysql8,轉載及注意事項

一、先前往官網下載mysql8 下載地址&#xff1a; https://dev.mysql.com/downloads/選擇Linux 二、刪除Linux中的mysql&#xff08;如果有的話&#xff09;&#xff0c;上傳安裝包 1、先查看mysql是否存在&#xff0c;命令如下&#xff1a; rpm -qa|grep -i mysql如果使用這…

《算法導論(第4版)》閱讀筆記:p4-p5

《算法導論(第4版)》學習第 3 天&#xff0c;p4-p5 總結&#xff0c;總計 2 頁。 一、技術總結 1.instance Thus, given the input sequence h31; 41; 59; 26; 41; 58i, a correct sorting algorithm returns as output the sequence h26; 31; 41; 41; 58; 59i. Such an inp…

第十四篇:系統分析師第三遍——15章

目錄 一、目標二、計劃三、完成情況四、意外之喜(最少2點)1.計劃內的明確認知和思想的提升標志2.計劃外的具體事情提升內容和標志 五、總結六、后面準備怎么做&#xff1f; 一、目標 通過參加考試&#xff0c;訓練學習能力&#xff0c;而非單純以拿證為目的。 1.在復習過程中&…

Easy云盤總結篇-登錄注冊

**說在前面&#xff1a;該項目是跟著B站一位大佬寫的&#xff0c;不分享源碼&#xff0c;支持項目付費 ** 獲取圖形驗證碼 可以看到這里有2兩種圖形驗證碼&#xff0c;分為&#xff1a; type0&#xff1a;如上圖下面那個&#xff0c;是完成操作后要進行注冊的驗證碼 type1: 如…

【前端知識】Vue3狀態組件Pinia詳細介紹

Vue3狀態組件Pinia詳細介紹 關聯知識 Pinia 組件介紹、核心原理及使用方式 Pinia 組件介紹 Pinia 是 Vue.js 的官方狀態管理庫&#xff0c;專為 Vue 3 設計&#xff0c;提供簡潔的 API 和強大的 TypeScript 支持。其核心組件包括&#xff1a; ? Store&#xff1a;狀態存儲容器…

mysql 云服務遠程linux創建數據庫

1. 本地使用已創建好的用戶創建數據庫出現問題 提示access deniey finalshell遠程創建新用戶 :~# mysql -u root -pR***34 > CREATE DATABASE r***e; > CREATE USER r**ue% IDENTIFIED BY Ry****34; > GRANT ALL PRIVILEGES ON ry_vue.* TO r***e%; > FLUSH PRI…

【“星瑞” O6 評測】 — CPU llama.cpp不同優化速度對比

前言 隨著大模型應用場景的不斷拓展&#xff0c;arm cpu 憑借其獨特優勢在大模型推理領域的重要性日益凸顯。它在性能、功耗、架構適配等多方面發揮關鍵作用&#xff0c;推動大模型在不同場景落地 1. Kleidi AI 簡介 Arm Kleidi 成為解決這些挑戰的理想方案&#xff0c;它能…

wireshark抓包也能被篡改?

wireshark本身并不能修改數據包&#xff0c;但是tcprewrite 可以修改數據包&#xff0c;然后通過tcpreplay 進行重放&#xff0c;這個時候wireshark抓的包&#xff0c;就是被篡改后的pcap包了。 ailx10 網絡安全優秀回答者 互聯網行業 安全攻防員 去咨詢 步驟一&#xff1a…

使用PyTorch進行熱狗圖像分類模型微調

本教程將演示如何使用PyTorch框架對預訓練模型進行微調&#xff0c;實現熱狗與非熱狗圖像的分類任務。我們將從數據準備開始&#xff0c;逐步完成數據加載、可視化等關鍵步驟。 1. 環境配置與庫導入 %matplotlib inline import os import torch from torch import nn from d2l…

內容中臺與企業內容管理核心差異剖析

功能定位與架構設計差異 在企業數字化進程中&#xff0c;內容中臺與企業內容管理&#xff08;ECM&#xff09;的核心差異首先體現在功能定位層面。傳統ECM系統以文檔存儲、版本控制及權限管理為核心&#xff0c;主要服務于企業內部知識庫的靜態管理需求&#xff0c;例如通過Ba…

使用PyMongo連接MongoDB的基本操作

MongoDB是由C語言編寫的非關系型數據庫&#xff0c;是一個基于分布式文件存儲的開源數據庫系統&#xff0c;其內容存儲形式類似JSON對象&#xff0c;它的字段值可以包含其他文檔、數組及文檔數組。在這一節中&#xff0c;我們就來回顧Python 3下MongoDB的存儲操作。 常用命令:…

第 12 屆藍橋杯 C++ 青少組中 / 高級組省賽 2021 年真題

一、選擇題 第 1 題 題目&#xff1a;下列符號中哪個在 C 中表示行注釋 ( )。 A. ! B. # C. ] D. // 正確答案&#xff1a;D 答案解析&#xff1a; 在 C 中&#xff0c;//用于單行注釋&#xff08;行注釋&#xff09;&#xff0c;從//開始到行末的內容會被編譯器忽略。選項 A…

【python】【UV】一篇文章學完新一代 Python 環境與包管理器使用指南

&#x1f40d; UV&#xff1a;新一代 Python 環境與包管理器使用指南 一、UV 是什么&#xff1f; UV 是由 Astral 團隊開發的高性能 Python 環境管理器&#xff0c;旨在統一替代 pyenv、pip、venv、pip-tools、pipenv 等工具。 1.1 UV 的主要功能 &#x1f680; 極速包安裝&…

前端性能優化2:結合HTTPS與最佳實踐,全面優化你的網站性能

點亮極速體驗&#xff1a;結合HTTPS與最佳實踐&#xff0c;為你詳解網站性能優化的道與術 在如今這個信息爆炸、用戶耐心極其有限的數字時代&#xff0c;網站的性能早已不是一個可選項&#xff0c;而是關乎生存和發展的核心競爭力。一個遲緩的網站&#xff0c;無異于在數字世界…

JavaWeb:vueaxios

一、簡介 什么是vue? 快速入門 <!-- 3.準備視圖元素 --><div id"app"><!-- 6.數據渲染 --><h1>{{ msg }}</h1></div><script type"module">// 1.引入vueimport { createApp, ref } from https://unpkg.com/vu…

Tauri聯合Vue開發中Vuex與Pinia關系及前景分析

在 TauriVue 的開發場景中&#xff0c;Vuex 和 Pinia 是兩種不同的狀態管理工具&#xff0c;它們的關系和前景可以從以下角度分析&#xff1a; 一、Vuex 與 Pinia 的關系 繼承與發展 Pinia 最初是作為 Vuex 5 的提案設計的&#xff0c;其目標是簡化 Vuex 的復雜性并更好地適配 …

Linux中的時間同步

一、時間同步服務擴展總結 1. 時間同步的重要性 多主機協作需求&#xff1a;在分布式系統、集群、微服務架構中&#xff0c;時間一致性是日志排序、事務順序、數據一致性的基礎。 安全協議依賴&#xff1a;TLS/SSL證書、Kerberos認證等依賴時間有效性&#xff0c;時間偏差可能…

【算法基礎】三指針排序算法 - JAVA

一、基礎概念 1.1 什么是三指針排序 三指針排序是一種特殊的分區排序算法&#xff0c;通過使用三個指針同時操作數組&#xff0c;將元素按照特定規則進行分類和排序。這種算法在處理包含有限種類值的數組時表現出色&#xff0c;最經典的應用是荷蘭國旗問題&#xff08;Dutch …

《操作系統真象還原》第十二章(2)——進一步完善內核

文章目錄 前言可變參數的原理實現系統調用write更新syscall.h更新syscall.c更新syscall-init.c 實現printf編寫stdio.h編寫stdio.c 第一次測試main.cmakefile結果截圖 完善printf修改main.c 結語 前言 上部分鏈接&#xff1a;《操作系統真象還原》第十二章&#xff08;1&#…