最适合Java初学者练手的项目【JavaSE项目-图书管理系统】
圖書館管理小項目的主要目的是讓學完JavaSE的同學對之前掌握的知識做一些運用,該項目應用的知識點包括下面內容:
通過學習本項目,可以鞏固JavaSE的知識,對于后續的學習來說可以起到很好的銜接。
視頻觀看效果更佳,點擊以下鏈接👇
圖書管理系統JavaSE項目實戰訓練-適合學完Java零基礎同學鞏固
資料、源碼下載:
Java圖書管理系統|Java項目實戰視頻教程全套免費下載 - 動力節點 (bjpowernode.com)
1.2?環境搭建
1.2.1?基本信息
- 開發工具:IDEA
- JDK版本:8
- 項目編碼:GBK
1.2.2?使用技術
除了javase相關知識點外,該項目還使用了一些第三方的技術,包括:
- Jfoenix:提供了更加美觀的UI控件
- Dashboardfx:將一些美觀的UI控件組合起來使用,構建出了一個儀表盤
1.2.3?項目導入
因為實際應用中對javafx的使用很少,所以這部分的內容就不帶著寫了,了解即可。界面大部分代碼已經寫好,只需要將nodelibrary.zip文件解壓導入到項目中即可。
1.2.4?關聯第三方jar包
由于項目中使用了一些第三方的技術,所以需要將這些技術相關的jar包導入到項目來使用。
實際應用的時候,我們會使用很多第三方技術,這些第三方技術的開發者會將代碼打成jar包以供使用。
?
1.3?代碼解析
1.3.1?代碼概覽
- bean:存放實體類的包
- global:存放了一些全局使用的類
- media.img:存放一些圖片
- module:存放界面相關的類
- service:存放服務相關類
- theme:存放美化界面相關的文件
- App:主類
1.3.2?登錄功能
在項目啟動時,會加載所有界面對應的fxml文件,然后將這些對象放入到map中,此map由ViewManager類進行管理。
用戶登錄后,會根據輸入的用戶名從properties文件中查找數據,如果查詢出來的數據跟用戶輸入的用戶名和密碼匹配的話,則登錄成功,跳轉至main頁面中。
1.3.3?fxml文件
每個界面都對應了一個fxml文件,fxml文件中的內容可以控制界面的展示效果。該文件中的標簽都是成對出現的,比如:
<StackPane></StackPane>
有部分標簽可以寫成下面形式:
<button />
一個標簽中可以包含其他標簽,例如:
<StackPane><padding></padding> </StackPane>但是絕對不能出現下面這種形式(你中有我,我中有你):
<StackPane><padding> </StackPane> </padding>上面寫法會有問題。
1.3.3.1?綁定控制器
每個fxml文件都有一個對應的java文件相關聯,這樣的java文件叫做控制器,我們可以通過fxml文件中的最外層標簽里面的fx:controller標簽進行綁定:
fx:controller="com.bjpowernode.module.login.Login"1.3.3.2?事件
用戶在操作界面的時候會產生一些行為,比如點擊一個按鈕,這就是一個點擊時間,我們可以通過button標簽中的onAction屬性與控制器對應的方法進行綁定:
@FXML private TextField username;1.3.3.3?輸入框
<TextField /> :我們可以在輸入框中看到自己輸入的內容
<PasswordField />:我們不能在輸入框中看到自己輸入的內容
通過輸入框中的fx:id與控制器中的屬性進行管理,例如:
fxml文件的標簽:
| <TextField fx:id="username" /> |
控制器文件的屬性:
| @FXML private TextField username; |
?
1.4?分層的思想
實際開發中會編寫大量的代碼,不同的代碼解決的問題不一樣,因此我們最好將這些代碼進行分層存放,主要還是劃分職責,這樣有利于后期的擴展。
分工前:
分工后:
代碼分層:
- controller(請求處理層):負責與界面數據進行交互處理
- service(業務邏輯層):負責業務邏輯相關處理
- DAO(數據持久層):負責數據持久化操作,DAO的全稱是Data Access Object
1.5?用戶相關功能
1.5.1?用戶數據初始化
1.5.1.1?功能概述
創建若干User對象放入到List中,通過對象輸出流將List對象寫出到硬盤的User.txt文件中,從而達到持久化的操作。
1.5.1.2?Serializable接口
通過IO流將List對象數據持久化到硬盤的文件中,List中存放的數據是User類型,所以要讓User類實現Serializable接口。倘若我們要對某個類的對象進行IO操作時,別忘了讓這個類實現Serializable接口。
1.5.1.3?常量類
對于一些不會發生頻繁修改的數據,我們通常會將其定義為常量,存放常量的類叫做常量類。這么做的好處是對這些數據進行同一管理,將來一旦發生改變,代碼改動較小。
1.5.2?查詢用戶
1.5.2.1?功能概述
通過對象輸入流將硬盤中User.txt文件里面的List對象讀取到內存中,將該對象傳到FXML中,從而展示出數據。
1.5.2.2?serialVersionUID
在User類實現Serializable接口后,最好添加serialVersionUID,這樣做的好處就是在User對象已經被存儲到硬盤文件之后,我們再修改User類屬性時不會發生異常。便于對User對象版本的控制。
1.5.2.3?代碼分層的使用
- controller: UserViewCtrl
- service:接口UserService,實現類UserServiceImpl
- dao:接口UserDao,實現類UserDaoImpl
這里通過接口的使用可以提高代碼的可插拔性,提高了程序的可維護性。
1.5.3?添加用戶
1.5.3.1?功能概述
在添加界面輸入用戶信息之后,點擊提交按鈕,會將用戶對象傳到service層,service層再調用DAO,在DAO中使用對象輸入流將用戶集合數據讀到內存中,將新增的user對象存入集合里面,之后使用對象輸出流將用戶集合數據寫出到硬盤文件中。
1.5.3.2?編號自增長
在創建類似User這樣的類時,我們通常會在里面添加一個id編號屬性,目的是作為該對象的唯一標識,便于查詢,修改,刪除操作。為了保證id編號不重復,這里通過程序控制id編號自動增長,在多線程環境下需要注意線程安全的問題。
1.5.4?修改用戶
1.5.4.1?功能概述
點擊修改按鈕之后需要將當前選中的修改數據顯示到修改界面中,修改界面里面要存儲數據的編號id,這些數據傳到DAO層之后,通過id在用戶集合中找到相應的用戶對象,從而進行修改操作。這里的修改界面跟添加界面使用的是同一個fxml
1.5.5?刪除用戶
1.5.5.1?功能概述
點擊刪除按鈕之后將當前選中數據的id編號傳到service層,service層將id傳到DAO層,然后根據id從用戶集合中找到對應的用戶對象,將其從集合移除即可。需要注意的是用戶類User中要重寫hashcode和equals方法。
1.5.5.2?異常的拋出
我們在DAO層中使用了try catch對異常進行了捕獲,倘若DAO層出現了異常,其上層的service和controller中是不知道的,這里最好在DAO層的catch里面再拋出異常,目的是通知上層這里有異常,上層代碼獲取到異常之后再進行后續的處理。
1.5.6?凍結用戶
1.5.6.1?功能概述
點擊凍結按鈕之后,將當前選中的id編號傳到DAO,然后再根據id從用戶集合中找到對應用戶對象,將該對象中的狀態修改為凍結即可。
?
1.6?圖書相關功能
1.6.1?圖書數據初始化
1.6.1.1?功能概述
創建若干Book對象,將對象放入到List中,把List對象利用對象輸出流寫出到硬盤的文件中,總體功能與用戶數據初始化操作類似。
1.6.1.2?泛型通配符
圖書數據初始化和用戶數據初始化類似,所以將兩個方法進行重構,重構之后合并為一個方法。方法中添加兩個形參,分別是String path(存放的路徑)和List<?> list(存放的數據)。這里由于list中的泛型是不同的,所以不能在形參中填寫具體的類型,這里我們使用了泛型通配符來解決該問題。
1.6.2?查詢圖書
1.6.2.1?功能概述
將硬盤文件中的圖書數據查詢并展示到頁面中,整體跟之前的用戶查詢類似,只是多了條件查詢,在點擊查詢按鈕時,需要將輸入的圖書名稱和isbn傳入到DAO中。需要注意的是如果圖書名稱和isbn同時輸入的話,在查詢代碼中先根據圖書名稱查詢出圖書數據bookList,之后在bookList的基礎上再根據isbn進行條件查詢。
1.6.3?添加圖書
1.6.3.1?功能概述
將輸入的圖書數據放到Book對象中,之后將該Book對象利用對象輸出流寫出到硬盤文件中,需要手動設置一下id編號的自增操作。與用戶添加類似
1.6.4?刪除圖書
1.6.4.1?功能概述
根據輸入的圖書編號,從圖書數據中找到與之對應的圖書對象,然后在圖書集合對象中將該圖書對象刪除。
1.6.5?修改圖書
1.6.5.1?功能概述
將修改之后的圖書數據持久化到硬盤文件中,功能與修改用戶類似。
1.6.5.2?反射的使用
修改操作中需要將輸入的數據一一對應的放入到查詢出的圖書對象中,需要調用很多set和get方法,倘若屬性過多的話,代碼就顯得繁瑣了,為了解決該問題,我們編寫了一個工具類,里面利用反射來獲取類中的全部屬性,之后再進行賦值操作。注意工具類中要排除不希望賦值的屬性,例如:serialVersionUID。
代碼:
/*** 對象屬性值的拷貝* @param origin* @param dest*/ public static void populate(Object origin, Object dest) {try {//使用反射解決這個問題//判斷兩個對象是否是同一類型if (origin.getClass() != dest.getClass()) {throw new RuntimeException("兩個對象必須得是同一類型");}Class<?> clazz = origin.getClass();//獲取origin中的屬性Field[] fields = clazz.getDeclaredFields();for (Field f : fields) {//排除serialVersionUIDif ("serialVersionUID".equals(f.getName())) {continue;}//打破封裝f.setAccessible(true);//從dest對象中找到對應的屬性值,然后賦值到origin相應的屬性中f.set(origin,f.get(dest));}} catch (IllegalAccessException e) {e.printStackTrace();} }1.7?圖書統計
1.7.1?功能概述
根據controller中的代碼得出要想展示出圖表內容,需要兩個數據,分別是圖書類型和該圖書類型對應的書籍數量,至于圖書展示的操作交給界面處理就行,因此我們要做的事就是從硬盤文件中圖書書籍里面統計出不同類型書籍的數量分別有多少。
1.7.2?方法返回值
方法的返回值寫什么要根據需求來定,因此在編寫方法之前要搞明白當前的需求是要做什么,倘若在需求沒有搞明白的前提下來編寫代碼,肯定會遇到很多問題。通過圖書統計功能的編寫我們要學會分析現有代碼,根據代碼得出所需要的數據,然后再自己操作獲取這些數據即可,剩余數據展示的操作交給界面來處理即可。
?
1.8?借閱相關功能
1.8.1?借閱數據初始化
1.8.1.1?功能概述
利用之前編寫的InitDataUtil工具類將借閱數據進行初始化。
1.8.1.2?UUID
由于可能會產生很多借閱數據,所以編號不能再用int類型自動增長了,這里將Lend類中的編號類型改成了String。這類的編號不要讓用戶來輸入,我們使用UUID來生成。UUID的生成跟網卡MAC地址、時間戳、隨機或偽隨機數、時序等元素有關,可以保證唯一性。UUID的長度是36,去除里面的-之后長度是32。
1.8.2?借閱數據查詢
1.8.2.1?功能概述
當用戶借閱了某本書之后會生成一條數據,我們需要在借閱管理中將該數據查詢出來,查詢的時候需要注意Lend對象中包含了Book和User對象,對于這類對象的查詢我們可以通過多次get方法將其查出。
1.8.3?借閱書籍
1.8.3.1?功能概述
通過點擊圖書管理中的借閱按鈕生成一條借閱數據,在點擊借閱按鈕之后,需要查詢出可以借書的用戶,每位用戶只能借閱1本書,這里查詢出的用戶列表必須都是可以借書的用戶。這部分操作的界面較多,注意界面之間的數據傳遞。
1.8.3.2?User類的修改
為了能夠方便的查詢出哪些用書手中已經借書了,我們可以在User類中添加一個boolean屬性isLend,該屬性的作用是標識當前用戶手中是否有書。但是修改User類之后會發現代碼很多地方有編譯報錯,通過這個改動發現類似這種User的類最好在開始的時候定義好,否則后期修改會導致改動較大。
1.8.3.3?Service層的使用
Controller主要的作用是處理跟界面相關的操作,DAO層主要的作用是處理跟數據持久化方面的操作,遇到一些比較復雜的操作時,我們需要在service層編寫業務邏輯代碼,在service中可以調用多個不同得DAO。這樣可以將代碼分層處理,便于后期的擴展升級。
1.8.4?還書功能
1.8.4.1?功能概述
用戶看完書籍之后需要進行歸還,默認最長借閱周期是30天,倘若超出的話,超出1天扣1元,30元封頂。如果在還書的時候,用戶的余額已為負數,則表示欠費了,需要改用戶先還清欠款才能進行還書的操作。
1.8.5?逾期扣款
計算超出歸還日期的用戶所需支付的金額,然后進行扣款操作,這里個功能需要每天執行,我們可以使用定時任務解決,但是考慮到該項目用戶不會每天運行,所以單獨寫個方法,當啟動軟件的時候進行同一計算然后再扣款。
1.8.6?充值
1.8.6.1?功能概述
用戶欠費后需要充值并且充值之后的余額要大于0才能進行還書操作,我們需要精確計算出用戶的余額,因此使用的類型是BigDecimal。
本視頻專為零基礎學員傾情打造,共分為29個章節,可在線觀看,可下載學習,源碼、課件均已配齊
總結
以上是生活随笔為你收集整理的最适合Java初学者练手的项目【JavaSE项目-图书管理系统】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度家电行业报告摘录
- 下一篇: 关于Typora的markdown编辑器