java数据库课程设计报告图书馆管理系统.docx
《java数据库课程设计报告图书馆管理系统.docx》由会员分享,可在线阅读,更多相关《java数据库课程设计报告图书馆管理系统.docx(225页珍藏版)》请在冰豆网上搜索。
java数据库课程设计报告图书馆管理系统
西安郵電大学
数据库课程设计报告
题目:
图书管理系统
院系名称:
计算机学院
专业名称:
计算机科学与技术
班级:
计科1006
学生姓名:
***
学号(8位):
********
指导教师:
***
设计起止时间:
2012年10月8日~2012年10月19日
一问题的提出
一、开发背景
很多高校都拥有图书馆,图书馆可以为全校师生提供一个阅读,学习的空间。
近年来,随着生源不断增大,图书馆的规模也随之扩大,图书数量也相应地大量增加,有关图书馆各种信息成倍增加。
面对如此庞大的信息量,校领导决定使用一套合理,有效,规范,实用的图书馆管理系统,对校内图书资料进行统一,集中的管理。
本系统将会涉及到图书馆日常管理工作的基本常见细节,诸如新图书的入库登记,图书馆所有书籍的分类管理,图书的查询,图书的借阅、退还手续的登记,费旧图书的清理撤除等,本系统所要实现的这些功能基本上涵盖了图书馆的日常管理工作,基本能够满足校园图书馆的工作人员的管理需要。
在对本系统的具体开发过程当中,将采用Java语言进行开发,以SqlServer实现后台数据库,本系统是完全基于图形化用户界面(GUI)的单机版本。
本系统的设计是在Windows7简体中文版操作系统环境下,使用Java中文版开发成功的。
数据库是MIS中的重要支持技术,在MIS开发过程中,如何选择数据库管理是一个重要的问题,目前,数据库产品较多,每种产品都具有各自的特点和适用范围,因此,在选择数据库时,应考虑数据库应用的特点及适用范围,本系统所使用的后台数据库是MSSQL2005数据库。
本系统选用的开发语言介绍如下:
选择了美国SUN公司推出的Java开发工具。
Java是第一个全面支持面向对象程序设计的数据库语言工具。
Java的主要特点有:
1、语言是简单的、小型的、结构中性的
2、强大的数据库开发功能
3、扩大了对SQL语言的支持
4、是面向对象的、高性能的、多线程的
5、是分布式的、面向网络
6、具有平台无关性
7、语言具有可移植性、是动态的
二、需求分析
图书馆管理系统是图书馆管理工作中补课缺少的部分,对于图书馆的管理者和使用者来说都非常重要,但长期以来,人们使用传统的手工方式或性能较低的图书馆管理系统管理图书馆的日常事务,操作流程比较繁琐,效率相当低。
而一个成功的图书馆管理系统应提供快速的图书馆信息检索功能,快捷的图书借阅,归还流程,为管理者提供充足的信息和快捷的数据处理手段。
从读者与图书馆管理员的角度出发,本着以读者借书,还书快捷,方便的原则,本系统有一下特点:
①:
具有良好的系统性能,友好的用户界面。
②:
较高的处理效率,便于使用和维护。
③:
采用成熟的技术开发,使系统具有较高的技术水平和较长的生命周期。
④:
系统尽可能简化图书馆管理员的重复工作,提高工作效率。
⑤:
简化数据查询,统计难度。
二:
系统设计
一:
系统目标
根据以上的需求分析及用户的沟通,该系统应达到以下目标:
①:
界面设计友好,美观。
②:
数据存储安全,可靠。
③:
信息分类清晰,准确。
④:
强大的查询功能,保证数据查询的灵活性。
⑤:
操作简单易用,界面清晰大方。
⑥:
系统安全稳定。
⑦:
开发技术先进,功能完备,扩展性强。
⑧:
占用资源少,对硬件要求低。
⑨:
提供灵活,方便的权限设置功能,使整个系统的管理分工明确。
二:
系统功能结构
图书馆管理系统分为四大功能模块,分为基础数据维护,图书借阅管理,新书订购功能,系统维护。
本系统各个部分及其包括的功能模块如图:
三:
系统预览
图书馆管理系统有多多个程序界面组成,以下是几个典型界面
该界面用于将读者相关信息添加至数据库表中。
该界面用于展示读者相关信息,并且提供了参与删除读者信息。
该界面主要实现新书订购功能。
该界面主要实现新书验收功能。
四:
文件组织结构
图书馆管理系统系统文件夹组织结构
四:
数据库设计
一:
数据库概要说明
SQLServer2005具有很强的完整性与课伸缩性,具有较低的价格与较高的性能。
数据库的树形结构图如图所示:
二:
数据库概念设计
根据以上对系统的需求分析,系统设计,本系统使用的数据库实体分别为图书信息实体,图书分类实体,图书订购实体,读者信息实体,操作员信息实体,图书借阅信息实体,库存信息实体
1:
图书信息实体
图书信息实体包括图书编号,类别编号,书名,译者,出版社,价格,出版时间等属性。
图书信息实体的E-R图如图所示。
2:
读者信息实体
读者信息实体包括条形码,姓名,性别,年龄,电话,押金,生日,职业,证件类型,办证日期,最大借书量,证件号码等属性,E-R图如图所示。
3:
图书借阅信息实体
图书借阅信息实体包括编号,图书编号,读者编号,操作员编号,是否归还,借阅日期,归还日期等属性。
E-R图如图所示。
4:
图书分类实体
图书分类实体包括编号,类别名称等属性,E-R图如图所示。
图书分类
编号
类别名称
可借天数
罚款金额
5:
图书订购实体
图书订购实体主要包括图书编号,订购日期,订购数量,操作员,是否验收和折扣等属性。
E-R图如图所示。
6:
操作员信息实体
操作员信息实体主要包括编号,姓名,性别,年龄,身份证号,工作日期,电话,是否为管理员和密码等属性。
E-R图如图所示。
7:
库存信息实体
库存信息实体主要包括编号,库存数量等属性。
E-R图如图所示。
五:
数据库逻辑设计
1:
tb_bookInfo(图书信息表)
图书信息表包括图书编号,图书类别编号,书名,作者,译者,出版社,出版时间和价格等信息。
2.tb_bookType(图书分类表)
图书分类表包括编号,类别名称,可借天数和罚款金额等信息。
3.tb_borrow(图书借阅表)
图书借阅表包括,图书编号,读者编号,操作员编号,是否归还,借阅日期,归还日期等信息。
4.tb_operator(操作员信息表)
操作员信息表主要包括编号,姓名,性别,年龄,身份证号,工作日期,电话,是否为管理员和密码等信息。
5.tb_order(图书订购表)
图书订购表主要包括图书编号,订购日期,订购数量,操作员,是否验收和折扣等信息。
图书订购表以图书编号与图书信息表建立了关系。
6.tb_reader(读者信息表)
读者信息表包括条形码,姓名,性别,年龄,电话,押金,生日,职业,证件类型,办证日期,最大借书数量,证件号码等信息。
7.tb_stockpile(库存信息表)
库存信息表主要包括编号,库存数量等信息。
库存信息表以库存编号与图书信息表建立了关系。
六:
数据库建模
本系统数据库采用PowerDesigner软件建立数据库中各个表的关系,进行数据库的建模,以连接各个数据库,使数据库中各个实体间建立联系。
数据库中各个表间关系如图所示。
七:
详细设计
一:
公共模块设计
1:
数据库连接及操作类的编写
数据库连接及操作类通常包括连接数据库的方法getConnection,执行查询语句的方法executeQuery(),执行更新操作的方法executeUpdate(),关闭数据库连接的方法close()
1:
指定类Dao.java保存的包,并导入所需的类包。
关键代码如下:
packagecom.wsy.dao;//指定类的包名称
//导入进行数据库连接时所使用的java.sql.Connection类
importjava.sql.Connection;
//导入进行数据库连接时所使用的java.sql.DriverManager类
importjava.sql.DriverManager;
//导入进行数据库表查询时所使用的java.sql.Resultset类
importjava.sql.ResultSet;
//导入进行数据库操作时捕捉异常使用的java.sql.SQLException类
importjava.sql.SQLException;
2:
在Dao.java类的构造方法中创建数据库连接操作。
在此类中首先定义数据库连接驱动包名,数据库连接路径,数据库连接用户名,密码等静态变量,然后在构造函数中实现数据库连接操作。
在数据库连接代码中需要添加try...catch关键字,捕捉数据库连接时可能抛出的异常。
关键代买如下:
//定义驱动报名称
protectedstaticStringdbClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver";
protectedstaticStringdbUrl="jdbc:
sqlserver:
//localhost:
1433;"
+"DatabaseName=db_library;SelectMethod=Cursor";//定义数据库连接路径
protectedstaticStringdbUser="shining";//数据库连接用户名
protectedstaticStringdbPwd="1";//数据库连接密码
protectedstaticStringsecond=null;
privatestaticConnectionconn=null;//定义一个数据库连接
privateDao(){
try{//捕捉数据库连接异常
if(conn==null){//如果连接为空
Class.forName(dbClassName).newInstance();//装载SQlServer驱动
//获取数据库连接
conn=DriverManager.getConnection(dbUrl,dbUser,dbPwd);
}
Else//如果连接不为空
return;
}catch(Exceptionee){//返回
ee.printStackTrace();//捕捉数据库连接异常
}
3.创建执行查询语句的方法executeQuery,其返回值为ResultSet结果集。
首先需要初始化Dao对象,调用构造函数,从而获取数据库连接。
executeQuery方法代码如下:
privatestaticResultSetexecuteQuery(Stringsql){
try{
if(conn==null)
newDao();
returnconn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE).executeQuery(sql);
}catch(SQLExceptione){
e.printStackTrace();
returnnull;
}finally{
}
}
4.创建执行更新操作的方法executeUpdate,它的返回值为int类型的整数,此返回值代表数据更新的操作是否成功,返回1代表称,不成功则返回-1,其关键代码如下:
privatestaticintexecuteUpdate(Stringsql){
try{
if(conn==null)
newDao();
returnconn.createStatement().executeUpdate(sql);
}catch(SQLExceptione){
System.out.println(e.getMessage());
//if(e.getMessage().equals("[Microsoft][SQLServer2000DriverforJDBC][SQLServer]DELETE语句与COLUMNREFERENCE约束'FK_TB_BORRO_REFERENCE_TB_BOOKI'冲突。
该冲突发生于数据库'db_library',表'tb_borrow',column'bookISBN'。
"))
return-1;
}finally{
}
}
5.为了避免运行程序时资源浪费,优化项目的运行速度,需要在完成数据库操作后,关闭数据库连接,其关键代码如下:
publicstaticvoidclose(){
try{
conn.close();
}catch(SQLExceptione){
e.printStackTrace();
}finally{
conn=null;
}
}
二:
MenuActions类的编写
通常激活同一个命令有多种方式,用户可以通过工具栏中的按钮或菜单选择特定的功能。
在本系统中命令就是弹出内部窗体
Swing包提供了一个非常有用的机制来封装命令,并将其连接到多个事件源,这种机制就是Action借口。
Action接口有如下方法:
PublicvoidactionPerformed(ActionEvente)
PublicObjectgetValue(Stringkey)
PublicvoidputValue(Stringkey,Objectvalue)
PublicbooleanisEnabled()
PublicvoidsetEnabled(booleanb)
PubilcvoidaddPropertyChangeListener(PropertyChangeListenerlistener)
PinlicvoidremovePropertyChangeListener(PropertyListenerlistener))
在actinPerformed()方法执行“更改密码”窗体的弹出类中操作,关键代码如下:
privatestaticclassPasswordModiActionextendsAbstractAction{
/**
*
*/
privatestaticfinallongserialVersionUID=1L;
PasswordModiAction(){
putValue(Action.NAME,"更改口令");
putValue(Action.LONG_DESCRIPTION,"修改当前用户密码");
putValue(Action.SHORT_DESCRIPTION,"更换口令");//在“更改口令”提示中显示的文字
//putValue(Action.SMALL_ICON,CreatecdIcon.add("bookAddtb.jpg"));
//将图标存储到动作对象中
//setEnabled(false);//使动作禁用
}
publicvoidactionPerformed(ActionEvente){
if(!
frames.containsKey("更改密码")||frames.get("更改密码").isClosed()){
GengGaiMiMaiframe=newGengGaiMiMa();
frames.put("更改密码",iframe);
Library.addIFame(frames.get("更改密码"));
}
}
}
三:
限制文本框长度类编写
在swing语言创建的窗体中,当JTextField组建创建时,可以指定文本框的宽度。
但在JTextfield的构造器中设定的宽度并不是用户输入的字符个数上限,用户可以在文本框中输入一个更长的字符串,此时需要限制用户输入字符串的长度。
创建此类的步骤如下:
1,。
创建MyDocument.java类,此类继承PlainDocument类。
关键代码如下:
PublicclassMydocumentextendsPlainDocument{
}
2.在Mydocument.java类中创建了两个构造函数,其中一个是又参数的,另一个是无参数的。
关键代码如下:
PublicMydocument(intnewMaxLength{
Super();
Maxlength=newMaxlengyh;
}
PublicMyDocument(){
This(10);
}
3.重载父类方法insertString(),在此方法中限定文本框允许输入字符串长度。
关键代码如下:
publicvoidinsertString(intoffset,Stringstr,AttributeSeta)
ThrowsBadLocationException{
If(getLength()+str.length()>maxLength){
return;
}else{
super.insertString(offset,str,a);
}
}
4.在程序设计中,当需要限制用户输入字符串长度时,可以用如下代码
JTextfieldtextfield=newJTextfield("请输入13位书号",13);
Textfield.setDocument(newMyDocument(13));
四:
描述组合框索引与内容类的编写
在程序编写的过程中,经常会遇到组合框组件的应用。
又是要在窗体中的组合框中显示具体内容,通常需要在数据库中存储此组合框的索引值,这时便需要使用一种数据结构将组合框中的内容与索引值联系在一起
1.创建组合框组件的索引值与其对应的内容Item.java类,这个类中不仅包含代表组合框索引的成员变量id和代表组合框内容的成员变量name,还包括两个成员变量的setXXX(),getXXX()方法。
关键代码如下:
packagecom.wsy.JComPz;
publicclassItem{
publicStringid;
publicStringname;
publicStringgetId(){
returnid;
}
publicvoidsetId(Stringid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringtoString(){
returngetName();
}
}
2.创建MapPz.java类,使用Map关联组合框的索引与组合框的具体内容。
关键代码如下:
packagecom.wsy.JComPz;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importjavax.swing.JComboBox;
importcom.wsy.dao.Dao;
importcom.wsy.model.BookType;
publicclassMapPz{
staticMapmap=newHashMap();
publicstaticMapgetMap(){
Listlist=Dao.selectBookCategory();
for(inti=0;iBookTypebooktype=(BookType)list.get(i);
Itemitem=newItem();
item.setId(booktype.getId());
item.setName(booktype.getTypeName());
map.put(item.getId(),item);
}
returnmap;
}
}
3.上述代码中用到了Dao.java中的selectBookCategory()方法,此方法用于查询图书类别相关信息,首先将数据库查询的相关信息放入javaBean中,然后将javaBean对象添加到List集合中,最终将结果以List形式返回,关键代码如下:
publicstaticListselectBookCategory(StringbookType){
Listlist=newArrayList();
Stringsql="selectdaysfromtb_bookTypewheretypeName='"+bookType+"'";
ResultSetrs=Dao.executeQuery(sql);
try{
while(rs.next()){
BookTypetype=newBookType();
type.setDays(rs.getString("days"));
list.add(type);
}
}catch(Exceptione){
e.printStackTrace();
}
Dao.close();
returnlist;
}
4.在JLable上添加图片类的编写
为了美化窗体,通常需要在窗体上添加图片,关键代码如下:
packagecom.wsy.util;
import.URL;
importjavax.swing.ImageIcon;
importcom.wsy.Library;
publicclassCreatecdIcon{
publicstaticImageIconadd(StringImageName){
URLIconUrl=Library.class.getResource("/"+ImageName);
ImageIconicon=newImageIcon(IconUrl);
returnicon;
}
}
二:
主窗体设计
主窗体的设计中,使用到JMenuBar类与JToolBar类来创建菜单栏与工具栏,菜单栏的创建比较简单,使用JMenuBar的构造函数初始化菜单栏即可。
例如:
JMenuBarmenubar=newJMenuBar();//创建菜单栏
frame.setJMenu=newJMenu(menuBar);//将菜单栏放入顶层框架
JMenueditMenu=newJMenu("图书类别管理);//在菜单栏