JAVA+SQL圖書(shū)館管理系統(tǒng)課程設(shè)計(jì)
畢業(yè)設(shè)計(jì)(論文)
題目: 圖書(shū)館管理系統(tǒng)
姓 名
學(xué) 號(hào)
專(zhuān) 業(yè) 計(jì)算機(jī)科學(xué)與技術(shù)
指導(dǎo)教師
2
目錄
摘要 IV
前言 V
第一章 圖書(shū)館管理系統(tǒng)分析 1
1.1 需求分析 1
1.2 功能分析 2
1.3 系統(tǒng)用例圖設(shè)計(jì) 2
1.4 繪制系統(tǒng)流程圖 3
1.5 系統(tǒng)的開(kāi)發(fā)環(huán)境 4
第二章數(shù)據(jù)庫(kù)分析與設(shè)計(jì) 5
2.1 數(shù)據(jù)庫(kù)分析 5
2.2 數(shù)據(jù)庫(kù)概念設(shè)計(jì) 5
2.3 數(shù)據(jù)邏輯結(jié)構(gòu)設(shè)計(jì) 7
2.4 各表之間的聯(lián)系圖 9
第三章系統(tǒng)設(shè)計(jì)與功能實(shí)現(xiàn) 10
3.1 數(shù)據(jù)庫(kù)Dao類(lèi)的構(gòu)建 10
3.2 系統(tǒng)登錄模塊 11
3.3 主窗體模塊 13
3.4 圖書(shū)類(lèi)別管理模塊 15
3.5 圖書(shū)信息管理模塊 17
3.6 讀者信息管理模塊 21
3.7 圖書(shū)訂購(gòu)管理模塊 24
3.8 圖書(shū)借閱管理模塊 27
3.9 系統(tǒng)維護(hù)模塊 30
第四章系統(tǒng)測(cè)試 35
4.1 測(cè)試項(xiàng)目 35
4.2 測(cè)試用例 35
結(jié)束語(yǔ) 37
參考文獻(xiàn) 38
iii
圖書(shū)館管理系統(tǒng)
摘要
圖書(shū)館管理系統(tǒng)是采用Java做前臺(tái),后臺(tái)數(shù)據(jù)庫(kù)則采用的是 SQL Server 2005,本系 統(tǒng)提供6個(gè)功能模塊,分別是圖書(shū)類(lèi)別管理模塊、圖書(shū)信息管理模塊、讀者信息管理模塊、 新書(shū)訂購(gòu)管理模塊、圖書(shū)借閱模塊,以及系統(tǒng)維護(hù)模塊。這 6個(gè)模塊里又有許多子模塊,
通過(guò)這些模塊之間的相互連接與配合,完成操作員發(fā)出的各種指令。
圖書(shū)館管理系統(tǒng)是一個(gè)供內(nèi)部人員使用的系統(tǒng)。而圖書(shū)館的工作人員也分為兩類(lèi),一 類(lèi)是操作人員,主要負(fù)責(zé)圖書(shū)的借閱和歸還的工作;一類(lèi)是管理員,除了操作人員的所有 功能外,還能夠?qū)?shū)籍列表、書(shū)籍信息、讀者信息等進(jìn)行管理。
論文將全面介紹所設(shè)計(jì)的圖書(shū)館管理系統(tǒng)的系統(tǒng)功能和業(yè)務(wù)流程,并對(duì)系統(tǒng)進(jìn)行詳細(xì) 的數(shù)據(jù)分析和設(shè)計(jì),最終使用Java完成系統(tǒng)開(kāi)發(fā)。
關(guān)鍵詞:圖書(shū)館管理系統(tǒng),SQL Server 2005, Java
5
刖百
隨著社會(huì)的發(fā)展,人們對(duì)于知識(shí)的需求也在不斷地增長(zhǎng)。書(shū)籍作為人們獲取并增長(zhǎng)知 識(shí)的主要途徑,使得圖書(shū)館在人們生活中占有了一定位置。但是近幾年來(lái),隨著書(shū)量的不 斷增長(zhǎng),造成了書(shū)庫(kù)空間極度不足,圖書(shū)擠壓,管理不善。這些都直接影響了讀者對(duì)圖書(shū) 館藏書(shū)的充分利用。這時(shí)圖書(shū)館就特別需要開(kāi)發(fā)一套圖書(shū)館管理系統(tǒng),通過(guò)該系統(tǒng)來(lái)提高 圖書(shū)館的管理效率,從而減少管理方面的工作流和成本。
一個(gè)現(xiàn)代化的圖書(shū)館在正常運(yùn)營(yíng)中總是面對(duì)大量的讀者信息,書(shū)籍信息以及兩者相互 作用產(chǎn)生的借書(shū)信息,還書(shū)信息。面對(duì)圖書(shū)館數(shù)以萬(wàn)計(jì)的圖書(shū),紛繁復(fù)雜的讀者信息,頻 繁更替的借還書(shū)信息,傳統(tǒng)的直接方法不但管理出現(xiàn)漏洞, 造成損失。因此有一個(gè)智能化、 系統(tǒng)化、信息化的圖書(shū)管理系統(tǒng)十分重要的。充分利用計(jì)算機(jī)的功能實(shí)現(xiàn)對(duì)讀者管理、書(shū) 籍管理,借閱管理等自動(dòng)化控制,將會(huì)使圖書(shū)館的工作大大減弱。方便友好的圖形界面、 簡(jiǎn)便的操作、完善的數(shù)據(jù)庫(kù)管理。將會(huì)使得圖書(shū)館系統(tǒng)極大限度的應(yīng)用于現(xiàn)代化圖書(shū)管理 中。
第一章圖書(shū)館管理系統(tǒng)分析
1.1 需求分析
圖書(shū)館管理系統(tǒng)是一個(gè)高度集成的圖書(shū)信息處理系統(tǒng),通過(guò)將圖書(shū)館的各種功能進(jìn)行 整合,從而達(dá)到顯示檢索信息,提高工作效率,降低管理成本等目的。一個(gè)典型的圖書(shū)館 管理系統(tǒng)應(yīng)該能夠管理所有的圖書(shū)種類(lèi),圖書(shū)信息以及讀者信息,還需要提供各種圖書(shū)信 息的檢索查詢(xún)功能。該系統(tǒng)還需要能夠?qū)D書(shū)的借閱,歸還進(jìn)行管理,并對(duì)讀者的罰款進(jìn) 行自動(dòng)計(jì)算。通過(guò)該系統(tǒng)的自動(dòng)化管理,能夠大大減少圖書(shū)館管理人員,還能減少管理人 員的工作任務(wù),從而降低管理開(kāi)銷(xiāo)和成本。
一個(gè)完整的圖書(shū)館管理系統(tǒng)包括前臺(tái)和后臺(tái),前臺(tái)主要是顯示在計(jì)算機(jī)屏幕上的顯示 界面,有各種指令按鈕,操作框以及文本框,后臺(tái)主要是為前臺(tái)的一些操作提供一些必要 的數(shù)據(jù),也就是一個(gè)相對(duì)于系統(tǒng)比較完整的數(shù)據(jù)庫(kù),操作員以及各類(lèi)圖書(shū)的信息,借書(shū)者 的信息等等。
一個(gè)最基本的圖書(shū)館管理系統(tǒng)要有如下幾個(gè)重要功能:
(1)用戶(hù)在借書(shū)超期的情況下得到來(lái)自管理員的提醒。
(2)管理員可以方便進(jìn)行圖書(shū)管理,用戶(hù)管理,管理員管理。圖書(shū)管理包括圖書(shū)信 息以及圖書(shū)分類(lèi)的添加,修改,刪除。用戶(hù)管理包括用戶(hù)信息的添加,刪除,修改。管理 員管理包括管理員信息的添加,刪除,修改等。
(3)用戶(hù)和管理員可以修改自己的密碼,修改前需先核實(shí)自己的原始密碼。
(4)未注冊(cè)用戶(hù)(游客)也可以瀏覽所有的圖書(shū)信息和分類(lèi)信息,但是無(wú)法借閱。
(5)實(shí)現(xiàn)模糊查詢(xún),使用戶(hù)得到更多的相關(guān)記錄。并且考慮使用的方便性,一些經(jīng) 常使用的輸入無(wú)須用戶(hù)輸入,比如進(jìn)行圖書(shū)查詢(xún)時(shí)圖書(shū)分類(lèi)只須用戶(hù)做選擇就可以。
(6)考慮程序執(zhí)行操作時(shí)可能出現(xiàn)的情況,比如刪除圖書(shū)分類(lèi)時(shí)該分類(lèi)下存在圖書(shū), 程序自動(dòng)跳轉(zhuǎn)該分類(lèi)圖書(shū)查看。刪除某個(gè)用戶(hù),如果存在借書(shū)記錄則不允許刪除,跳轉(zhuǎn)到 該用戶(hù)的借書(shū)記錄。等待管理員確認(rèn)該用戶(hù)所借圖書(shū)已經(jīng)全部歸還之后才允許刪除該用戶(hù) 信息。
一個(gè)圖書(shū)館管理系統(tǒng)要是能實(shí)現(xiàn)以上的各種功能,那么這個(gè)圖書(shū)館管理系統(tǒng)也就算是 比較成功的一個(gè)系統(tǒng)了。
1.2 功能分析
根據(jù)以上需求分析,我所設(shè)計(jì)的圖書(shū)館管理系統(tǒng)有 6個(gè)功能模塊,分別是圖書(shū)類(lèi)別管 理模塊,圖書(shū)信息管理模塊,讀者信息管理模塊,新書(shū)訂購(gòu)管理模塊,圖書(shū)借閱模塊以及 系統(tǒng)維護(hù)模塊。其中各功能模塊的具體說(shuō)明如下:
圖書(shū)類(lèi)別管理模塊:該模塊主要負(fù)責(zé)管理圖書(shū)館的圖書(shū)種類(lèi)信息, 如圖書(shū)種類(lèi)的名稱(chēng)、 可借天數(shù)、罰款數(shù)目等信息。
圖書(shū)信息管理模塊:該模塊主要負(fù)責(zé)管理圖書(shū)館的圖書(shū)信息,如圖書(shū)編號(hào)、圖書(shū)名稱(chēng)、 作者、出版社等信息。
讀者信息管理模塊:該模塊主要負(fù)責(zé)管理圖書(shū)館的讀者信息,如讀者編號(hào)、讀者信息、 證件號(hào)碼、最大借書(shū)量等信息。
圖書(shū)訂購(gòu)管理模塊:該模塊主要負(fù)責(zé)管理圖書(shū)館的新書(shū)訂購(gòu)信息、包括新書(shū)訂購(gòu)和驗(yàn) 收新書(shū)兩個(gè)子模塊。
圖書(shū)借閱管理模塊:該模塊主要負(fù)責(zé)圖書(shū)館的書(shū)籍借閱和歸還信息,包括圖書(shū)借閱、 圖書(shū)歸還、圖書(shū)搜索3個(gè)子模塊。
系統(tǒng)維護(hù)模塊:該模塊主要負(fù)責(zé)圖書(shū)館的工作人員信息,包括用戶(hù)管理和更改系統(tǒng)口 令兩個(gè)子模塊。
1.3 系統(tǒng)用例圖設(shè)計(jì)
圖書(shū)館管理系統(tǒng)是一個(gè)內(nèi)部人員使用的系統(tǒng),也就是說(shuō)不是所有的人都能夠使用它, 只有圖書(shū)館的工作人員才能使用。而圖書(shū)館的工作人員也分為兩類(lèi),一類(lèi)是操作人員,主 要負(fù)責(zé)圖書(shū)的借閱和歸還的工作;一類(lèi)是管理員,除了操作人員的所有功能外,還能夠?qū)?書(shū)籍列表,書(shū)籍信息,讀者信息等進(jìn)行管理。下面以管理員為例繪制其所對(duì)應(yīng)的用例圖如 圖1.1所示。
1.4 繪制系統(tǒng)流程圖
本系統(tǒng)首先需要對(duì)用戶(hù)的身份進(jìn)行識(shí)別,只有合法的用戶(hù)才能進(jìn)入系統(tǒng),否則將無(wú)法 進(jìn)入系統(tǒng)。進(jìn)入系統(tǒng)后,首先打開(kāi)系統(tǒng)主窗體,在系統(tǒng)首頁(yè)的菜單欄或者功能區(qū)可以選擇 各種導(dǎo)航鏈接來(lái)進(jìn)行各種操作。由于不同權(quán)限的用戶(hù)對(duì)于系統(tǒng)有不同的功能,下面以功能 最多的管理員為例,其系統(tǒng)流程圖如圖 1.2所示。
圖1.2系統(tǒng)流程圖
圖書(shū)類(lèi)別管理
系統(tǒng)維護(hù)
用戶(hù) 管理
者息加 讀信添
書(shū)息改 圖信修
書(shū)息加 圖信添
書(shū)別改 圖類(lèi)修
書(shū)別加 圖類(lèi)添
1.5 系統(tǒng)的開(kāi)發(fā)環(huán)境
圖書(shū)館管理系統(tǒng)的具體開(kāi)發(fā)環(huán)境要求如下:
(1)系統(tǒng)開(kāi)發(fā)平臺(tái):Eclipse 34
(2)數(shù)據(jù)庫(kù)管理系統(tǒng)軟件:SQL Server 200s
(3)運(yùn)行平臺(tái):Windows 7。
(4) Java開(kāi)發(fā)包:JDK 5.0以上。
(5)分辨率:800>600以上。
(6) GUI 開(kāi)發(fā)包:Swing。
16
第二章數(shù)據(jù)庫(kù)分析與設(shè)計(jì)
6.1 數(shù)據(jù)庫(kù)分析
在開(kāi)發(fā)圖書(shū)館管理系統(tǒng)時(shí),考慮到圖書(shū)量大,數(shù)據(jù)庫(kù)維護(hù)大的特點(diǎn),選用 SQL Server 2005作為數(shù)據(jù)庫(kù)管理系統(tǒng)。在 SQL Server 2005中新增一個(gè)數(shù)據(jù)庫(kù),其數(shù)據(jù)庫(kù)名為 db_library。數(shù)據(jù)庫(kù)中可以包含圖書(shū)信息、圖書(shū)類(lèi)別信息、圖書(shū)借閱信息、操作員信息、圖 書(shū)訂購(gòu)信息及讀者信息等實(shí)體,用來(lái)存儲(chǔ)不同的信息。
6.2 數(shù)據(jù)庫(kù)概念設(shè)計(jì)
本系統(tǒng)一共設(shè)計(jì)規(guī)劃出6個(gè)實(shí)體,分別是圖書(shū)類(lèi)別信息實(shí)體、圖書(shū)信息實(shí)體、讀者信 息實(shí)體、操作員實(shí)體、圖書(shū)借閱信息實(shí)體以及圖書(shū)訂購(gòu)信息實(shí)體。
圖書(shū)的類(lèi)別有很多,因此可以建立一個(gè)圖書(shū)館類(lèi)別信息表,專(zhuān)門(mén)用來(lái)保存圖書(shū)的類(lèi)別 信息。同時(shí)因?yàn)槊糠N類(lèi)別的書(shū)籍閱讀時(shí)間有所不同,所以需要在類(lèi)別表中保存該類(lèi)別可借 天數(shù)信息。圖書(shū)類(lèi)別信息實(shí)體 E-R圖如圖2.1所示。
圖2.1圖書(shū)類(lèi)別信息實(shí)體 E-R圖
對(duì)于圖書(shū)館來(lái)說(shuō)最重要的就是要管理其下的書(shū)籍,所以需要建立一個(gè)圖書(shū)信息表,用
來(lái)保存圖書(shū)的所有信息。圖書(shū)信息實(shí)體 E-R圖如圖2.2所示
圖2.2圖書(shū)信息實(shí)體 E-R圖
要想在圖書(shū)館借書(shū)首先需要進(jìn)行登記并交付押金。領(lǐng)取讀書(shū)卡才能借書(shū)。所以需要建
立一個(gè)讀者信息表來(lái)保存圖書(shū)館的所有讀者的登記信息。讀者信息實(shí)體 E-R圖如圖2.3所
示。
圖書(shū)館里一般有一個(gè)以上的系統(tǒng)操作員,需要建立一個(gè)操作員信息表,用來(lái)保存操作
員的身份信息。操作員信息實(shí)體 E-R圖如圖2.4所示。
圖書(shū)館最大的功能就是能夠借書(shū),這時(shí)需要建立一個(gè)圖書(shū)借閱信息表,用來(lái)保存讀者 的借書(shū)信息。圖書(shū)的借閱信息實(shí)體 E-R圖如圖2.5所示。
圖書(shū)館除了借書(shū),還需要到出版社或其他代理商訂購(gòu)新書(shū),這是需要建立一個(gè)圖書(shū)訂
購(gòu)信息表,用來(lái)保存所有的訂購(gòu)信息。圖書(shū)訂購(gòu)信息實(shí)體 E-R圖如圖2.6所示。
圖2.6圖書(shū)訂購(gòu)信息實(shí)體 E-R圖
6.3 數(shù)據(jù)邏輯結(jié)構(gòu)設(shè)計(jì)
根據(jù)設(shè)計(jì)好的各實(shí)體E-R圖創(chuàng)建數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu),數(shù)據(jù)庫(kù)各表的結(jié)構(gòu)如下:
(1)圖書(shū)類(lèi)別信息采表用來(lái)儲(chǔ)存所有的圖書(shū)類(lèi)別信息,包括圖書(shū)類(lèi)別編號(hào)、圖書(shū)類(lèi)別名 稱(chēng)、可借天數(shù)以及遲還一天的罰款數(shù)目 4個(gè)字段。該表的邏輯結(jié)構(gòu)如表 2.1所示。
表2.1圖書(shū)類(lèi)別信息表
id
整數(shù)(int)
是
圖書(shū)類(lèi)別編號(hào)
typeName
( varchar)
否
圖書(shū)類(lèi)別名稱(chēng)
days
整數(shù)(int)
否
可借天數(shù)
fk
遲還一天的罰款數(shù)目
(2)圖書(shū)信息表用來(lái)儲(chǔ)存所有的圖書(shū)信息,包括圖書(shū)編號(hào)、類(lèi)別編號(hào)、圖書(shū)名稱(chēng)、作者、 譯者、出版社、出版日期以及書(shū)籍價(jià)格 8個(gè)字段。該表的邏輯結(jié)構(gòu)如表 2.2所示。
表2.2圖書(shū)信息表
ISBN
文本(varchar)
是
圖書(shū)編號(hào)
typeId
整數(shù)(int)
否(外鍵)
類(lèi)別編號(hào)
bookname
( varchar)
否
圖書(shū)名稱(chēng)
writer
( varchar)
否
作者
translator
( varchar)
否
譯者
publisher
( varchar)
否
出版社
date
日期時(shí)間(datetime)
否
出版日期
price
money
書(shū)籍價(jià)格
(3)讀者信息表用來(lái)儲(chǔ)存所有的讀者信息,包括讀者姓名、性別、年齡、證件號(hào)碼、會(huì) 員證有效日期、最大借書(shū)量、電話號(hào)碼、押金、證件類(lèi)型、職業(yè)、讀者編號(hào)以及辦證日期
12個(gè)字段。該表的邏輯結(jié)構(gòu)如表 2.3所示
表2.3讀者信息表
鍵
name
文本(varchar)
是
讀者姓名
sex
( varchar)
否(外鍵)
讀者性別
age
整數(shù)(int)
否
讀者年齡
identityCard
( varchar)
否
證件號(hào)碼
date
日期時(shí)間(datetime)
否
會(huì)員證有效日期
maxNum
整數(shù)(int)
否
取大怎書(shū)里
tel
( varchar)
否
電話號(hào)碼
keepMoney
金錢(qián)貨幣(money)
否
押金
zj
整數(shù)(int)
否
證件類(lèi)型
zy
( varchar)
否
職業(yè)
ISBN
( varchar)
是
讀名編p
bztime
datetime
否
辦證日期
(4)
操作員信息表用來(lái)保存操作員信息,
包括操作員編號(hào)、用戶(hù)名、
性別、年齡、證件
號(hào)碼、
工作時(shí)間、
電話號(hào)碼、是否為管理員
、密碼 9個(gè)字段。該表的邏輯結(jié)構(gòu)如表 2.4
示。
表2.4操作員信息表
字段名
鍵
描述
id
整數(shù)(int)
是(自動(dòng)遞增)
操作員編號(hào)
name
( varchar)
否
用戶(hù)名
sex
( varchar)
否
性別
age
整數(shù)(int)
否
年齡
identityCard
( varchar)
否
證件號(hào)碼
workdate
日期時(shí)間(datetime)
否
工作時(shí)間
tel
( varchar)
否
電話號(hào)碼
admin
整數(shù)(int)
否
是否為管理員
password
varchar)
否
密碼
(5)
圖書(shū)借閱信息表用來(lái)保存所有圖書(shū)的借閱信息,包括借閱編號(hào)、
書(shū)籍編號(hào)、操作員
編號(hào)、
讀后編》、.
是夠歸還、借書(shū)日期以及應(yīng)還日期 7字段。該表的邏輯結(jié)構(gòu)如表 2.5
示。
表2.5
圖書(shū)借閱信息表
字段名
數(shù)據(jù)類(lèi)型
是否主鍵
描述
id
整數(shù)(int)
是(自動(dòng)遞增)
借閱編號(hào)
bookISBN
( varchar)
否(外鍵)
書(shū)籍編號(hào)
operatorId
整數(shù)(int)
否(外鍵)
操作員編號(hào)
readerISBN
varchar
讀后編R
isback
int
borrowDate
日期時(shí)間(datetime)
否
借書(shū)日期
backdate
datetime
應(yīng)還日期
(6)圖書(shū)訂購(gòu)信息表用來(lái)保存圖書(shū)館的所有訂購(gòu)信息,包括書(shū)籍編號(hào)、訂購(gòu)日期、訂購(gòu)
數(shù)量、操作員、是否驗(yàn)收以及書(shū)籍折扣 6個(gè)字段。該表的邏輯結(jié)構(gòu)如表2.6所示。
表2.6圖書(shū)訂購(gòu)信息表
ISBn
( varchar)
是
書(shū)籍編號(hào)
date
日期時(shí)間(datetime)
否
訂購(gòu)日期
number
整數(shù)(int)
否
訂購(gòu)數(shù)量
operator
( varchar)
否
操作員
checkAndAccep t
整數(shù)(int)
否
是否驗(yàn)收
zk
浮點(diǎn)
否
書(shū)籍折扣
6.4 各表之間的聯(lián)系圖
各表間的聯(lián)系圖如圖2.7所示
固 tb_borrow 卜頌有現(xiàn)
id
booklSCN
operaiorld neaderTSBN
國(guó) tb_operator
士廝有列D
name
4
age
國(guó)tb_booklnfo
園 thqnd.r
,d
date rxirriber operator dieckAndAccept
jJ
啕f育列) ISBN typeld bookname witer
圖2.7各表間聯(lián)系圖
國(guó) tb bookType
.唯族5現(xiàn)
typeName days ft
第三章系統(tǒng)設(shè)計(jì)與功能實(shí)現(xiàn)
3.1數(shù)據(jù)庫(kù)Dao類(lèi)的構(gòu)建
首先定義了一個(gè)類(lèi)Dao,并為該類(lèi)添加了 4中方法,分別是構(gòu)造方法 Dao、查詢(xún)方法
executeQuery更新方法executeUpdate以及關(guān)閉連接方法 close。
public class Dao {
protected static String dbClassName =
"com.microsoft.sqlserver.jdbc.SQLServerDriver";//數(shù)據(jù)庫(kù)連接驅(qū)動(dòng)類(lèi)
protected static String dbUrl = "jdbc:sqlserver://localhost:1433;
+ "DatabaseName=db_library;";//數(shù)據(jù)庫(kù)連接 URL
protected static String dbUser = "sa";
protected static String dbPwd = "123";
private static Connection conn = null;
//數(shù)據(jù)庫(kù)用戶(hù)名
//數(shù)據(jù)庫(kù)密碼
//數(shù)據(jù)庫(kù)連接對(duì)象
private static String ISBN;
private Dao() {
//構(gòu)造方法
try {
if (conn == null) {
//如果連接對(duì)象為空
Class.forName(dbClassName);
//加載驅(qū)動(dòng)類(lèi)
conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);〃獲得連接對(duì)
}
} catch (Exception ee) { ee.printStackTrace();
}
}
private static ResultSet executeQuery(String sql) { 〃查詢(xún)方法
try {
if(conn==null) new Dao(); //如果連接對(duì)象為空,則重新調(diào)用構(gòu)造方法
return conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE).executeQuery(sql);/腴行查詢(xún)
} catch (SQLException e) {
e.printStackTrace();
return null; //返回 null 值
} finally {
}
}
private static int executeUpdate(String sql) { //更新方法
try {
if(conn==null) new Dao(); //如果連接對(duì)象為空,則重新調(diào)用構(gòu)造方法 return conn.createStatement().executeUpdate(sql)蜿行更新
} catch (SQLException e) {
e.printStackTrace();
return -1;
} finally {
}
}
public static void close() {//關(guān)閉方法
try {
conn.close();//關(guān)閉連接對(duì)象
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn = null; //設(shè)置連接對(duì)象為null值
}
}
3.2系統(tǒng)登錄模塊
3.1
對(duì)于圖書(shū)館管理系統(tǒng)而言,不是所有的用戶(hù)都是可以使用的,所有需要添加一個(gè)登陸 模塊。通過(guò)該模塊來(lái)對(duì)用戶(hù)的合法性進(jìn)行判斷,只有合法的用戶(hù)才能進(jìn)入到系統(tǒng)。整個(gè)登 陸模塊的實(shí)現(xiàn)非常簡(jiǎn)單,相信讀者能夠快速掌握其開(kāi)發(fā)過(guò)程。登錄模塊的運(yùn)行結(jié)果如圖 所示。
圖3.1系統(tǒng)登錄界面
3.2.1 登陸窗體界面設(shè)計(jì)與實(shí)現(xiàn)
登陸窗體的界面設(shè)計(jì)我依然采用的是比較傳統(tǒng)的方法,新建一個(gè)類(lèi) BookLoginFrame
類(lèi),用來(lái)顯示登錄窗體。在該窗體中需要使用到四類(lèi)控件,分別是 JLabel、JTextFieid、
JPasswordField以及JButton。其中控件JLabel是用來(lái)顯示頂部的圖片以及標(biāo)簽文本;控件 JTextFieid用來(lái)接收用戶(hù)名輸入信息;控件 JPasswordField用來(lái)接收密碼輸入信息;控件 JButton用來(lái)創(chuàng)建登陸和重置按鈕。
3.2.2 操作員登陸
在Dao類(lèi)中新增一個(gè)方法check,通過(guò)該方法來(lái)檢測(cè)用戶(hù)信息是否合法。該方法接收 兩個(gè)參數(shù),分別是操作員用戶(hù)名 name,操作員密碼passsward主要方法如下:
public static Operater check(String name, String password) {
Operater operater=new Operater();操作員信息對(duì)象
String sql = "select * from tb_operator where name='" + name
+ "' and password='" + password + "'and admin=1";
ResultSet rs = Dao.executeQuery(sql); try { while (rs.next()) { operater.setId(rs.getString("id"));
operater.setName(rs.getString("name"));
operater.setGrade(rs.getString("admin"));
operater.setPassword(rs.getString("password"));
3.3 主窗體模塊
圖書(shū)館管理系統(tǒng)的主窗體模式是由三個(gè)部分組成的。第一部分是位于主窗體上組上端 的系統(tǒng)菜單欄,用來(lái)實(shí)現(xiàn)鏈接系統(tǒng)功能菜單。第二部分位于菜單欄下面的工具欄,用來(lái)提 供各種常用功能鏈接。第三部分位于工具下的系統(tǒng)功能窗口區(qū)域,主要用來(lái)顯示各種功能 窗口。
3.3.1 主窗體界面設(shè)計(jì)
在主窗體中可以顯示其他功能窗體,所以需要在該窗體中加入一個(gè)桌面窗體。通過(guò)將 其他功能窗體加入到該窗體中。從而實(shí)現(xiàn)多窗體顯。同時(shí)在主窗口體中,還需要添加一個(gè) main方法,該方法為系統(tǒng)入口的方法,通過(guò)執(zhí)行該方法來(lái)執(zhí)行系統(tǒng)。其主要代碼如下:
public class Library extends JFrame {
private static final JDesktopPane
DESKTOP_PANE = new JDesktopPane()以面窗體
public static void main(String口 args) {
try {
UIManager.setLookAndFeel(UIManager
.getSystemLookAndFeelClassName());/設(shè)置系統(tǒng)界面外觀 new BookLoginIFrame();//登錄窗口
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void addIFame(JInternalFrame iframe) { // 添力口子窗體的方法 DESKTOP_PANE.add(iframe); //新增子窗體
}
}
下面再來(lái)配置主窗體的其他屬性,首先需要設(shè)置其大小和位置,然后還要設(shè)置其菜單 欄和工具欄,最后需要在桌面窗體中添加一個(gè)背景圖片。其代碼實(shí)現(xiàn)如下。
public Library。{ super();
setDefaultCloseOperation(
//獲得默認(rèn)的工具箱
//獲得屏幕的大小
//設(shè)置窗體大小
WindowConstants.EXIT_ON_CLOSE);////設(shè)置關(guān)閉按鈕處理事件
Toolkit tool = Toolkit.getDefaultToolkit();
Dimension screenSize = tool.getScreenSize();
setSize(800, 600);
setLocation((screenSize.width - getWidth()) / 2,
(screenSize.height - getHeight()) / 2); //設(shè)置窗體位置
setTitle("圖書(shū)館管理系統(tǒng)"); //設(shè)置窗體標(biāo)題
JMenuBar menuBar = createMenu(); 〃調(diào)用創(chuàng)建菜單欄的方法
setJMenuBar(menuBar); 〃設(shè)置菜單欄
JToolBar toolBar = createToolBar(); // 調(diào)用創(chuàng)建工具欄的方法 getContentPane().add(toolBar, BorderLayout.NORTH);/S 置工具欄 final JLabel label = new JLabel(); //創(chuàng)建一個(gè)標(biāo)簽,用來(lái)顯示圖片 label.setBounds(0, 0, 0, 0); //設(shè)置窗體的大小和位置
label.setIcon(null); // 窗體背景
DESKTOP_PANE.addComponentListener(new ComponentAdapter() {
public void componentResized(final ComponentEvent e) {
Dimension size = e.getComponent().getSize();康得組件大/」、
label.setSize(e.getComponent().getSize());改置標(biāo)簽大小 label.setText("<html><img width=" + size.width + " height="
+ size.height + " src='"
+ this.getClass().getResource("/backImg.jpg")
+ "'></html>");//設(shè)置標(biāo)簽文本
}
};
DESKTOP_PANE.add(label,new Integer(Integer.MIN_\ALUE));// 將標(biāo)簽添加到桌面
窗體
getContentPane().add(DESKTOP_PANE);//1桌面窗體添力口至 U 主窗體中
}
3.3.2 主窗體菜單欄設(shè)計(jì)
在Library類(lèi)中定義一個(gè)createMenu方法,在該方法中實(shí)現(xiàn)菜單欄的設(shè)計(jì)。具運(yùn)行界 面如圖3.2所示。
圖書(shū)措I身
一互毛TZ空屋花
匐節(jié)布管理
圖3.2主窗體界面
3.4 圖書(shū)類(lèi)別管理模塊
圖書(shū)類(lèi)別管理模塊包含兩個(gè)子模塊,分別是圖書(shū)類(lèi)別添加和圖書(shū)類(lèi)別修改。其中圖書(shū) 類(lèi)別添加模塊用來(lái)錄入新的圖書(shū)類(lèi)別信息,圖書(shū)列別修改模塊用來(lái)修改已有的圖書(shū)列別信 息。系統(tǒng)界面如圖3.3所示。
17
圖3.3圖書(shū)類(lèi)別修改界面
3.4.1圖書(shū)類(lèi)別添加模塊
要添加圖書(shū)類(lèi)別信息,首先要在 Dao中添加一個(gè)InsertbookType方法,通過(guò)該方法來(lái)
接受用戶(hù)輸入的所有書(shū)籍類(lèi)別信息,然后執(zhí)行插入操作。其主要方法如下:
public static int InsertBookType(String bookTypeName,String days,double fk){
int i=0;
try{String sql="insert into
tb_bookType(typeName,days,fk)
values('"+bookTypeName+"','"+days+"',"+fk+")";
i=Dao.executeUpdate(sql);/枚行插入操作
}
}
3.4.2圖書(shū)類(lèi)別修改模塊
修改圖書(shū)類(lèi)別信息同保存圖書(shū)類(lèi)別信息非常類(lèi)似,首先在 Dao中添加一個(gè)方法
UpdatebookTypa通過(guò)該方法來(lái)接收?qǐng)D書(shū)修改表單中提交的書(shū)籍類(lèi)別信息。其代碼如下:
public static int UpdatebookType(String id,String typeName,String days,String fk){
int i=0;
try{String sql="update
tb_bookType set typeName='"+typeName+"',
days='"+days+"',fk='"+fk+”' where id='"+id+"'";
〃System.out.println(sql);
i=Dao.executeUpdate(sql);例行更新操作 }
}
修改圖書(shū)類(lèi)別信息,是通過(guò)單擊修改按鈕執(zhí)行的,上面我們已經(jīng)為修改按鈕注冊(cè)了一 個(gè)監(jiān)聽(tīng)器,其對(duì)應(yīng)的監(jiān)聽(tīng)器類(lèi)為 ButtonActionLinter。下面來(lái)實(shí)現(xiàn)該監(jiān)聽(tīng)器類(lèi),其實(shí)現(xiàn)代碼 如下:
class ButtonAddListener implements ActionListener{
public void actionPerformed(ActionEvent e){
Object selectedItem = bookTypeModel.getSelectedItem();
int i=Dao.UpdatebookType(BookTypeId.getText().trim(),selectedItem.
toString(), days.getText().trim(),fk.getText().trim());
System.out.println(i);
if(i==1){//如果返回值為1,則表示修改成功
JOptionPane.showMessageDialog(null,修改成功");
Object口□ results=getFileStates(Dao.selectBookCategory());
model.setDataVector(results,columnNames);
table.setModel(model);
}
} }
3.5 圖書(shū)信息管理模塊
圖書(shū)信息管理模塊包含兩個(gè)子模塊,分別是圖書(shū)信息添加和圖書(shū)信息修改。其中圖書(shū) 信息添加模塊用來(lái)錄入新的圖書(shū)信息,圖書(shū)信息修改模塊用來(lái)修改已有的圖書(shū)信息。
3.5.1 圖書(shū)信息添加界面設(shè)計(jì)
圖書(shū)信息添加窗體一共包含三個(gè)部分,第一部分是位于窗體最上端的圖片。第二部分 是位于中間的主面板,用來(lái)提供各種標(biāo)簽和表單元素。第三部分是位于主面板下的按鈕面
板,用來(lái)提供添加和關(guān)閉兩個(gè)按鈕。具運(yùn)行界面如圖 3.4所示。
圖3.4圖書(shū)信息添加界面
主面板是整個(gè)窗體最重要也是最核心的部分,其部分實(shí)現(xiàn)代碼如下:
public BookAddIFrame() {
super();
final BorderLayout borderLayout = new BorderLayout();〃倉(cāng)建邊框布局管理器 getContentPane().setLayout(borderLayout); 〃設(shè)置布局
setIconifiable(true);//設(shè)置窗體可最小化
setClosable(true);//設(shè)置窗體可關(guān)閉
setTitle("圖書(shū)信息添加)//設(shè)置窗體標(biāo)題
setBounds(100, 100, 396, 260);//設(shè)置窗體位置和大小
final JPanel mainPanel = new JPanel(//創(chuàng)建中心面板 mainPanel.setBorder(new EmptyBorder(5, 10, 5, 10));般置邊框 final GridLayout gridLayout = new GridLayout(0, 4);// 創(chuàng)建表格布局管理器 gridLayout.setVgap(5);//設(shè)置組件之間垂直距離
gridLayout.setHgap(5);//設(shè)置組件之間平行距離
mainPanel.setLayout(gridLayout);/股置布局
getContentPane().add(mainPanel);將中心面板力口入至 U 窗體
final JLabel ISBNLabel = new JLabel(); //創(chuàng)建圖書(shū)編號(hào)標(biāo)簽
ISBNLabel.setText("圖書(shū)編號(hào):");//設(shè)置標(biāo)簽文本
mainPanel.add(ISBNLabel);/傣力口至 ij 中心面板
ISBN = new JTextField(”請(qǐng)輸入13位書(shū)號(hào)”,13);//創(chuàng)建書(shū)號(hào)文本框
ISBN.setDocument(new MyDocument(13)); //設(shè)置書(shū)號(hào)文本框最大輸入值為 13
ISBN.setColumns(13);//設(shè)置文本框長(zhǎng)度
ISBN.addKeyListener(new ISBNkeyListener());// 注冊(cè)監(jiān)聽(tīng)器
ISBN.addFocusListener(new ISBNFocusListener());/姓冊(cè)監(jiān)聽(tīng)器
mainPanel.add(ISBN);
}
3.5.2 檢測(cè)書(shū)籍編號(hào)是否已存在
因?yàn)椴豢赡艽嬖谥貜?fù)的書(shū)籍編號(hào)。為了防止操作員的操作錯(cuò)誤,所以需要提供一個(gè)書(shū) 籍編號(hào)監(jiān)測(cè)系統(tǒng)。如果該書(shū)籍號(hào)已存在,則不能進(jìn)行添加,否則可以進(jìn)行添加。
要檢測(cè)書(shū)籍編號(hào)是否存在,需要在 Dao類(lèi)中添加一個(gè)方法,該方法用來(lái)接收輸入的書(shū)
籍編號(hào),然后查詢(xún)?cè)摃?shū)籍編號(hào)對(duì)應(yīng)的書(shū)籍記錄,其主要方法如下:
public static List selectBookInfo(String ISBN) {// 根據(jù)圖書(shū)編號(hào)查詢(xún)圖書(shū)
List list=new ArrayList();//保存所有查詢(xún)到的書(shū)籍信息
String sql = "select * from tb_bookInfo where ISBN='"+ISBN+"”';
ResultSet rs = Dao.executeQuery(sql);執(zhí)行查詢(xún)
……/師入數(shù)據(jù),關(guān)閉連接
}
對(duì)書(shū)籍編號(hào)進(jìn)行檢測(cè),一般是在操作員輸入完書(shū)籍編號(hào),并準(zhǔn)備輸入其他信息時(shí)來(lái)完 成。這是需要新建一個(gè)ISBNFFocusListener監(jiān)聽(tīng)類(lèi),該類(lèi)繼承了 FocusAdoper類(lèi),并實(shí)現(xiàn) 其中的focusLost,其實(shí)現(xiàn)代碼如下:
class ISBNFocusListener extends FocusAdapter {
public void focusLost(FocusEvent e){
if(!Dao.selectBookInfo(ISBN.getText().trim()).isEmpty()){
JOptionPane.showMessageDialog(null,添加書(shū)號(hào)重復(fù)!"); return;
}
}
}
3.5.3 圖書(shū)信息添加
要添加書(shū)籍信息,首先要在 Dao中添加一個(gè)Insertbook方法,通過(guò)該方法來(lái)接受用戶(hù) 輸入的所有書(shū)籍信息,然后執(zhí)行插入操作。其主要方法如下:
public static int Insertbook(String ISBN,String typeId,String bookname,
String writer,String translator,String publisher,Date date,Double price){
int i=0;
try{
String sql="insert into tb_bookInfo(ISBN,typeId,bookname,writer,translator,"+ "publisher,date,price)
values('"+ISBN+"','"+typeId+"','"+bookname+"',"+
"”'+writer+"','"+translator+"','"+publisher+"','"+date+"',"+price+")";
i=Dao.executeUpdate(sql);/楨行插入操作 }
}
3.5.4 圖書(shū)修改信息
修改圖書(shū)信息同保存圖書(shū)信息非常類(lèi)似, 首先在Dao中添加一個(gè)方法Updatebook。通
過(guò)該方法來(lái)接收?qǐng)D書(shū)修改表單中提交的書(shū)籍信息。其代碼如下:
public static int Updatebook(String ISBN,String typeId,String bookname,
String writer,String translator,String publisher,Date date,Double price){
int i=0;〃更新記錄數(shù)
try{ String sql="update tb_bookInfo set ISBN='"+ISBN+"',
typeId='"+typeId+"',bookname='"+bookname+"',
writer='"+writer+"',
translator='"+translator+”',
publisher="'+publisher+”',
date='"+date+"',
price="+price+" where ISBN='"+ISBN+"”';
i=Dao.executeUpdate(sql);例行更新 }
}
修改圖書(shū)信息,是通過(guò)單擊修改按鈕執(zhí)行的,上面我們已經(jīng)為修改按鈕注冊(cè)
了一個(gè)監(jiān)聽(tīng)器,其對(duì)應(yīng)的監(jiān)聽(tīng)器類(lèi)為 UpdateBookActionLinter。下面來(lái)實(shí)現(xiàn)該監(jiān)聽(tīng)
器類(lèi),其實(shí)現(xiàn)代碼如下:
class UpdateBookActionListener implements ActionListener {
public void actionPerformed(final ActionEvent e) {
int i=Dao.Updatebook(ISBNs, bookTypes, bookNames, writer translators,publishers,Date.valueOf(pubDates),Double.parseDouble(prices));
if(i==1){//如果返回更新記錄數(shù)為1,表示修改成功
JOptionPane.showMessageDialog(null,修改成功");
Object[][]results=getFileStates(Dao.selectBookInfo());//M 新獲得書(shū)籍信息
DefaultTableModel model=new DefaultTableModel();〃獲得表格模型 table.setModel(model);//設(shè)置表格模型 model.setDataVector(results, columnNames);改置模型數(shù)據(jù)和列名 }
}
}
3.6 讀者信息管理模塊
讀者信息管理模塊包含兩個(gè)子模塊,分別是讀者信息添加和讀者信息修改與刪除。其 中讀者信息添加模塊用來(lái)錄入新的讀者信息,讀者信息修改與刪除模塊用來(lái)修改和刪除已 有的讀者信息。其系統(tǒng)運(yùn)行界面如圖 3.5所示。
圖3.5讀者信息管理模塊運(yùn)行界面
3.6.1讀者信息添加
要添加讀者信息,首先要在 Dao中添加一個(gè)InsertReader方法,通過(guò)該方法來(lái)接受用 戶(hù)輸入的所有讀者信息,然后執(zhí)行插入操作。其主要方法如下:
public static int InsertReader(String name,String sex,String age,String identityCard,Date date,String maxNum,String tel,Double keepMoney,String zj,String zy,Date bztime,String ISBN){
int i=0;
try{String sql="insert into tb_reader(name,sex,age,identityCard,date,maxNum, tel,keepMoney,zj,zy,bztime,ISBN)values('"+name+"','"+sex+"','"+age+"','"+ identityCard+"','"+date+"','"+maxNum+"','"+tel+"',"+keepMoney+",'"+zj+"' ,'"+zy+"',
'"+bztime+"','"+ISBN+"')";
System.out.println(sql);
i=Dao.executeUpdate(sql);例行插入操作
}
3.6.2讀者信息修改與刪除
修改與刪除讀者信息同保存讀者信息非常類(lèi)似,首先在
Dao中添加兩個(gè)方法
UpdateReader及DelReader。通過(guò)這兩個(gè)方法來(lái)接收?qǐng)D讀者修改表單中提交的讀者信息。 其主要代碼如下:
public static int UpdateReader(String id,String name,String sex,String age,String
identityCard,Date date,String maxNum,String tel,
Double keepMoney,String zj,String zy,Date bztime,String ISBN){ int i=0;
try{String sql="update tb_reader set
name='"+name+"',sex='"+sex+"', age='"+age+"',identityCard='"+identityCard+"', date='"+date+"',maxNum='"+maxNum+"', tel='"+tel+"',keepMoney="+keepMoney+", zj='"+zj+"',zy='"+zy+"', bztime='"+bztime+"'where ISBN='"+ISBN+"”';
i=Dao.executeUpdate(sql);// 執(zhí)行更新
}catch(Exception e){
e.printStackTrace();
}
Dao.close();//關(guān)閉連接
public static int DelReader(String ISBN){
int i=0;
try{ String sql="delete from tb_reader where ISBN='"+ISBN+"”';
//System.out.println(sql);
i=Dao.executeUpdate(sql);
}catch(Exception e){
e.printStackTrace();
}
Dao.close();//關(guān)閉連接
}
3.7 圖書(shū)訂購(gòu)管理模塊
圖書(shū)訂購(gòu)管理模塊包含兩個(gè)子模塊,分別是新書(shū)訂購(gòu)和驗(yàn)收新書(shū)。其中新書(shū)訂購(gòu)模塊
用來(lái)錄入新的圖書(shū)信息,驗(yàn)收新書(shū)模塊用來(lái)驗(yàn)收新書(shū)信息。其系統(tǒng)運(yùn)行界面如圖 3.6和圖 3.7所示。
圖3.6新書(shū)訂購(gòu)管理界面
圖3.7圖書(shū)驗(yàn)收界面
3.7.1 新書(shū)訂購(gòu)管理
要添加新書(shū)訂購(gòu)信息,首先要在Dao中添加一個(gè)InsertBookOrder方法,通過(guò)該方法來(lái) 接受用戶(hù)輸入的所有新書(shū)訂購(gòu)信息,然后執(zhí)行插入操作。其主要方法如下:
public static int InsertBookOrder(String ISBN,Date date,String number,String
operator,String checkAndAccept,Double zk){
int i=0;
try{String sql="insert into
tb_order(ISBN,date,number,operator,checkAndAccept,zk)
values('"+ISBN+"','"+date+"','"+number+"','"+operator+"',"+checkA
ndAccept+",'"+zk+"')";
i=Dao.executeUpdate(sql);/枚行插入
}
}
3.7.2 圖書(shū)驗(yàn)收
添加完圖書(shū)訂購(gòu)信息后,我們還要對(duì)圖書(shū)進(jìn)行驗(yàn)收,首先要在 Dao中添加一個(gè)
SelectBookOrder方法,通過(guò)該方法來(lái)查找出所有錄入的新書(shū)訂購(gòu)信息,再添加一個(gè)
UpdateCheckBookOrder方法,通過(guò)該方法來(lái)對(duì)圖書(shū)進(jìn)行驗(yàn)收。其主要方法如下:
public static List selectBookOrder(boolean b) {
List list=new ArrayList();
String sql = "SELECT * FROM tb_order where ISBN='"+ISBN+皿;
ResultSet rs = Dao.executeQuery(sql);執(zhí)行查詢(xún)
try {
while (rs.next()) {
Order order=new Order();
order.setISBN(rs.getString("ISBN"));
order.setDate(rs.getDate("date"));
order.setNumber(rs.getString("number"));
order.setOperator(rs.getString("operator"));
order.setZk("zk");
order.setCheckAndAccept("checkAndAccept");
list.add(order);
} catch (Exception e) {
e.printStackTrace();
Dao.close();//關(guān)閉連接 return list;
public static int UpdateCheckBookOrder(String ISBN){ int i=0;
try{
String sql="update tb_order set
checkAndAccept=0 where ISBN='"+ISBN+"”'; i=Dao.executeUpdate(sql);例行更新 }catch(Exception e){
e.printStackTrace();
Dao.close();//關(guān)閉連接 return i;
}
3.8 圖書(shū)借閱管理模塊
圖書(shū)借閱管理模塊包含三個(gè)子模塊,分別是新書(shū)借閱、圖書(shū)歸還和圖書(shū)搜索。其中圖 書(shū)借閱模塊用來(lái)錄入讀者信息及所借閱的圖書(shū)的信息,圖書(shū)歸還模塊用來(lái)顯示歸還讀者信 息及所借閱的圖書(shū)信息,圖書(shū)搜索模塊用來(lái)為讀者提供圖書(shū)搜索功能。其系統(tǒng)運(yùn)行界面如 圖3.8、3.9和3.10所示。
圖3.8圖書(shū)借閱管理界面
圖3.9圖書(shū)會(huì)還管理界面
圖3.10圖書(shū)查詢(xún)界面
3.8.1 圖書(shū)借閱
當(dāng)讀者想要對(duì)某圖書(shū)進(jìn)行借閱操作時(shí),圖書(shū)館管理員必須將讀者信息及所借閱的 圖書(shū)信息輸入到數(shù)據(jù)庫(kù),此時(shí),需要在 Dao中添加一個(gè)InsertBookBorrow方法,通過(guò)
該方法錄入讀者信息及所借閱的圖書(shū)信息。其主要方法如下:
public static int InsertBookBorrow(String bookISBN,String readerISBN,String operatorId,Timestamp borrowDate,Timestamp backDate){
int i=0;
try{String sql="insert into tb_borrow(bookISBN,readerISBN,operatorId, borrowDate,backDate)values C"+bo