图书管理系统 数据库课程实验设计

本课设系软件工程大二学生作,拙笔狂言,恭请斧正。
开发工具:Eclipse 2020-12,Microsoft SQL server 2012
程序语言:Java

引 言
选题题目:图书管理系统
选题背景:
(1)图书室有各种图书,共一万多册。
(2)每种图书都有书名、书号(ISBN)、一名或多名作者(译者)、出版社、定价和内容简介。
(3)借书证记录有借阅者的姓名、所在单位、职业等。
(4)凭借书证借书,每次最多能借8本书。借书期限最长为30天。
需求功能:
(1)图书基本情况的录入、修改、删除等基本操作。
(2)实现借书功能。
(3)实现还书功能。
(4)实现对所有购进图书的分类查询和分类统计。
(5)能够按书名、作者等分类查询现有的图书的数量。
(6)对超期的情况能自动给出提示信息。
(7)图书管理员与借书者权限有区分。
选题意义:能够加深我们对数据库系统原理及程序设计的理论知识的理解和应用,通过设计实际的数据库系统课题,进一步熟悉数据库管理系统的操作技术,提高动手能力、分析实际项目和解决实际问题的能力,学习基本的数据库编程方法。

  1. 数据库概念模型
    1.1 需求分析
    1.1.1 图书管理员:
    ⑴查询和修改个人信息,如联系电话等。
    ⑵能对图书进行查询录入、修改、删除、分类统计等操作。
    ⑶查询、修改借书者的个人信息,包括借阅信息等。
    ⑷增加、删除借书者
    1.1.2 借书者:
    ⑴查询和修改个人信息,如联系电话等。
    ⑵查询图书信息和图书状态,即空闲在册或已借出。
    ⑶借书和还书。
    ⑷已借书籍已超时需找管理员帮助还书。
    每次最多能借8本书。借书期限最长为30天。
    1.2 概念结构设计
    1.2.1抽象出实体
    根据分析,图书管理系统主要包含图书管理员、借书者、图书三个实体。
    图书管理员:工号,姓名,性别,职称,联系电话
    借书者:借书证号,姓名,性别,联系电话,职业,所在单位
    图书:书号,书名,作者,出版社,定价,内容简介,状态,分类

数据字典:
(6个表)
在这里插入图片描述
表名:借书者
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(该表的作用是:在用户登录成功时,将该登录的账号、登录时间写入数据库的“操作账号”表,表示当前正在使用该系统的是某某用户;例如某用户修改个人信息时,系统通过筛选最新登录时间,来保证用户修改的是自己的信息。)

1.2.2局部E-R图(图略)
图书管理员与借书者:一名图书管理员可以管理多名借书者,一名借书者可以被多名图书管理员管理。因此两者之间是多对多的联系。

借书者与图书:一名借书者一次最多可以借8本图书,一本图书可以多次借给不同的借书者。因此两者之间是多对多的联系。

图书管理员与图书:一名图书管理员可以管理多本图书,一本图书可以被多名图书管理员管理。因此两者之间是多对多的联系。

1.2.3整体E-R图(图略,将局部E-R图结合起来即得)

2 数据库逻辑模型
2.1将E-R图转化为关系模式
图书管理员(工号,姓名,性别,职称,联系电话)是图书管理员实体对应的关系模式,其中工号是图书管理员关系的主键。
借书者(借书证号,姓名,性别,联系电话,职业,所在单位)是借书者实体对应的关系模式,其中借书证号是借书者关系的主键。
图书(书号,书名,作者,出版社,定价,内容简介,状态,分类)是图书实体对应的关系模式,其中书号是图书关系的主键。
借书(借书证号,书号,借书时间,姓名,书名)为联系“借书”对应的关系模式。因为借书是图书管理员、借书者和图书之间的多对多联系,因此图书管理员、借书者和图书的主属性及借书本身的属性“借书时间”,共同构成了借书关系模式的属性,其中借书证号、书号、借书时间的组合是借书关系的主键。
还书(借书证号,书号,借书时间,还书时间,姓名,书名)为联系“还书”对应的关系模式,因为还书是图书管理员、借书者和图书之间的多对多联系,因此图书管理员、借书者和图书的主属性及借书本身的属性“还书时间”,共同构成了还书关系模式的属性,其中借书证号、书号、借书时间、还书时间的组合是还书关系的主键。

3数据库物理设计与实施
3.1创建数据库
在这里插入图片描述
3.2创建和管理基本表
3.2.1创建基本表
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4 程序设计
4.1创建窗体
在这里插入图片描述

在这里插入图片描述
4.1.1管理员

在这里插入图片描述

在这里插入图片描述
图书查询
在这里插入图片描述
图书添加
1.操作失败一一书号与数据库已存的数据重复、状态非“已借出”或“空闲在册”、有空项
2.操作成功一一非上述情况
在这里插入图片描述
图书编辑
1.输入数据正常修改
2.输入非法的或不存在的书号一一“数据库中没有该图书”
3.书号置空一一“必填”
在这里插入图片描述
借书管理
1.管理员输入合法的、存在的书号,操作成功,将该图书的状态改为空闲在册,并移入还书记录
2.输入非法的、不存在的或空的书号,操作失败
3.点击“还书记录”,查看借记表
在这里插入图片描述
读者查询与编辑
删除
文本框输入的账号合法则“操作成功”,否则“操作失败”
在这里插入图片描述
修改/添加
修改
1.填合法借书证号可顺利执行;不填借书证号或填非法的借书证号则显示标签提示
2.性别限定“男”或“女”,出错无法执行显示标签提示
增加
1.操作成功–每个项目都填写,且性别限定了“男”或“女”
2.操作失败–有空项或性别没有限定,显示“每个项目都必填” 在这里插入图片描述

修改个人信息
在这里插入图片描述
修改密码
1.三个密码框都输入合法的密码一一“修改成功”
2.三个密码框任意一个输入非法的密码一一“输入错误,请校检”
在这里插入图片描述

	4.1.2借书者

在这里插入图片描述
图书查询
在这里插入图片描述

图书借阅
操作成功
1.输入“空闲在册”的书号,且在借图书不超过8本
操作失败
1.输入“已借出”的、不存在的或空的书号
2.在借图书已达到8本
在这里插入图片描述

图书归还
操作成功
1.输入在借的书号,且借书时间不超过30天
操作失败
1.输入不在借的、非法的或空的书号
2.输入在借的书号,但借书时间已超过30天
在这里插入图片描述

修改个人信息
在这里插入图片描述

修改密码
在这里插入图片描述

4.2连接数据库
package Testv1;

import java.sql.*;

public class Testv10 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		{
		  String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";
		  String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=LibraryManagement";//个人数据库名称
		  String userName="sa";		//个人用户名
		  String userPwd="QWEASDZXC000000";			//个人密码
		 try
		{
			Class.forName(driverName);
			System.out.println("加载驱动成功!");
		}catch(Exception e){
			e.printStackTrace();
			System.out.println("加载驱动失败!");
		}
		try{
			Connection dbConn=DriverManager.getConnection(dbURL,userName,userPwd);
				System.out.println("连接数据库成功!");
		}catch(Exception e)
		{
			e.printStackTrace();
			System.out.print("SQL Server连接失败!");
		}		
		}

完整演示视频
https://www.bilibili.com/video/BV1C34y1H7NH?share_source=copy_web&vd_source=532622d453c2953506dbf894f3498777
添加链接描述:系统使用演示

图书查询

package Testv1;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.awt.event.ActionEvent;
import javax.swing.JComboBox;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;

public class BookFind extends JFrame {

	private JPanel contentPane;
	private JTextField textField_2;
	private JTextField textField_3;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					BookFind frame = new BookFind();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public BookFind() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 581, 391);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		textField_2 = new JTextField();
		textField_2.setBounds(23, 7, 139, 21);
		contentPane.add(textField_2);
		textField_2.setColumns(10);
		
		
		JButton btnNewButton_2 = new JButton("\u8FD4\u56DE");
		btnNewButton_2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				setVisible(false);
			}
		});
		btnNewButton_2.setBounds(462, 319, 93, 23);
		contentPane.add(btnNewButton_2);
		
		JLabel lblNewLabel = new JLabel("\u5171\u6709\uFF08\u672C\uFF09");
		lblNewLabel.setBounds(23, 323, 70, 15);
		contentPane.add(lblNewLabel);
		
		textField_3 = new JTextField();
		textField_3.setBounds(82, 320, 66, 21);
		contentPane.add(textField_3);
		textField_3.setColumns(10);
		
		
		JPanel panel = new JPanel();
		panel.setBounds(23, 38, 532, 271);
		contentPane.add(panel);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(10, 46, 300, 150);
		panel.add(scrollPane);
		
		String []Name = {"书号", "书名", "作者", "出版社","定价","内容简介","状态","分类"};
		Object [][] rowData = new Object [100][8];           
		JTable table = new JTable(rowData, Name);
		table.setBounds(297, 179, -279, -124);
		table.setRowHeight(30);                          //设置行高
		table.getColumnModel().getColumn(0).setPreferredWidth(110); //第一列列宽
		table.setPreferredScrollableViewportSize(new Dimension(500 ,300));    //设置滚动面板视口大小(超过该大小的行数据需要拖动滚动条)
		scrollPane.setViewportView(table);
		//把数据库表的内容显示到页面的表格
		try {
			String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=LibraryManagement";
			String userName="sa";
			String userPwd="QWEASDZXC000000";
			Connection dbConn = null;
			
			Statement state = null;
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			dbConn = DriverManager.getConnection(dbURL,userName,userPwd);
			state = dbConn.createStatement();
			String sql0 = "select * from 图书";
			ResultSet rs = state.executeQuery(sql0);
			
			Statement stateCnt = dbConn.createStatement();
			String sql1 = "select count(*) from 图书";
			ResultSet rs_1 = stateCnt.executeQuery(sql1);
			while(rs_1.next()) {
				textField_3.setText(rs_1.getString(1));
			}//统计
			
			int i = 0;
			while(rs.next() && i<rowData.length) {
					
				rowData[i][0] = rs.getString(1);
				rowData[i][1] = rs.getString(2);   
				rowData[i][2] = rs.getString(3);   
				rowData[i][3] = rs.getString(4);   
				rowData[i][4] = rs.getString(5);
				rowData[i][5] = rs.getString(6);
				rowData[i][6] = rs.getString(7);
				rowData[i][7] = rs.getString(8);
				i++;
			}
			dbConn.close();
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (ClassNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		String []item = new String[] {"书号","书名","作者","出版社","定价","内容简介","状态","分类"};
				
		JComboBox comboBox = new JComboBox(item);
		comboBox.addItemListener(new ItemListener() {//不必要监听器
			public void itemStateChanged(ItemEvent e) {
				//textField_2.setText(e.getItem());
			}
		});
		comboBox.setBounds(172, 6, 139, 23);
		contentPane.add(comboBox);
		
		
		JButton btnNewButton = new JButton("\u67E5\u8BE2");
		btnNewButton.addActionListener(new ActionListener() {		//查询
			public void actionPerformed(ActionEvent e) {
				String str = new String(textField_2.getText());					//列元素
				String str_1 = new String((String) comboBox.getSelectedItem());//列名
				//从文本框下拉列表读取要查询的分类
				try {
					String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=LibraryManagement";
					String userName="sa";
					String userPwd="QWEASDZXC000000";
					Connection dbConn = null;
					Statement state = null;
					Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
					dbConn = DriverManager.getConnection(dbURL,userName,userPwd);
					state = dbConn.createStatement();
					
					String sql0 = "select * from 图书 where "+str_1+"='"+str+"'" ;
					ResultSet rs = state.executeQuery(sql0);		
					
					Statement stateCnt = dbConn.createStatement();
					String sql1 = "select count(*) from 图书 where "+str_1+"='"+str+"'"; 
																//填入列名,	列元素
					ResultSet rs_1 = stateCnt.executeQuery(sql1);
					int n = 0;
					while(rs_1.next()) {
						textField_3.setText(rs_1.getString(1));
						n= Integer.parseInt(rs_1.getString(1));
					}//统计数量
					
					int i = 0;
					while(rs.next() && i<rowData.length) {	//显示到表格中
						rowData[i][0] = rs.getString(1);
						rowData[i][1] = rs.getString(2);   
						rowData[i][2] = rs.getString(3);   
						rowData[i][3] = rs.getString(4);   
						rowData[i][4] = rs.getString(5);
						rowData[i][5] = rs.getString(6);
						rowData[i][6] = rs.getString(7);
						rowData[i][7] = rs.getString(8);
						i++;
					}
					while(i>=n && i<rowData.length) {
						rowData[i][0] = null;
						rowData[i][1] = null;
						rowData[i][2] = null;
						rowData[i][3] = null;
						rowData[i][4] = null;
						rowData[i][5] = null;
						rowData[i][6] = null;
						rowData[i][7] = null;
						i++;
					}
				//刷新
					TableModel tml = new DefaultTableModel(rowData,Name);
					table.setModel(tml);
				
					dbConn.close();
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
		
			}
		});
		btnNewButton.setBounds(363, 6, 93, 23);
		contentPane.add(btnNewButton);
		
		
		JButton btnNewButton_1 = new JButton("\u53D6\u6D88");
		btnNewButton_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				try {
					String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=LibraryManagement";
					String userName="sa";
					String userPwd="QWEASDZXC000000";
					Connection dbConn = null;
					
					Statement state = null;
					Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
					dbConn = DriverManager.getConnection(dbURL,userName,userPwd);
					state = dbConn.createStatement();
					String sql0 = "select * from 图书";
					ResultSet rs = state.executeQuery(sql0);
					
					Statement stateCnt = dbConn.createStatement();
					String sql1 = "select count(*) from 图书";
					ResultSet rs_1 = stateCnt.executeQuery(sql1);
					while(rs_1.next()) {
						textField_3.setText(rs_1.getString(1));
					}//统计
					
					int i = 0;
					while(rs.next() && i<rowData.length) {
							
						rowData[i][0] = rs.getString(1);
						rowData[i][1] = rs.getString(2);   
						rowData[i][2] = rs.getString(3);   
						rowData[i][3] = rs.getString(4);   
						rowData[i][4] = rs.getString(5);
						rowData[i][5] = rs.getString(6);
						rowData[i][6] = rs.getString(7);
						rowData[i][7] = rs.getString(8);
						i++;
					}
					TableModel tml = new DefaultTableModel(rowData,Name);
					table.setModel(tml);
					
					dbConn.close();
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		btnNewButton_1.setBounds(462, 7, 93, 23);
		contentPane.add(btnNewButton_1);
		
	}
}

**4.1.2出现的问题及做法**
		1.用户通过个人账号使用该系统,则用户的操作都绑定在该账号,如修改信息时,只能修改本账号信息而不能修改他人信息。
		对此,我的做法是:在用户登录成功时,将登录的账号、登录时间写入数据库的“操作账号”表,表示当前正在使用该系统的是某某用户。

管理员登录监听器

JButton btnNewButton_1 = new JButton("\u767B\u5F55");
		btnNewButton_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String strP = new String(passwordField.getPassword());//密码
				String strT = new String(textField.getText());//工号
				
				String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=LibraryManagement";
				String userName="sa";
				String userPwd="QWEASDZXC000000";
				Connection dbConn = null;
				String sql = "select 工号,密码 from 图书管理员";
				
				try {
					Statement state = null;
					Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
					dbConn = DriverManager.getConnection(dbURL,userName,userPwd);
					state = dbConn.createStatement();
					ResultSet rs = state.executeQuery(sql);
					while (rs.next()) {
						//System.out.println(rs.getString(1)+" "+rs.getString(2));
						if(strT.equals(rs.getString(1)) && strP.equals(rs.getString(2))) {
							
							Calendar c = Calendar.getInstance();
							
							M_mainPage mPage = new M_mainPage();
							mPage.setVisible(true);
							lblNewLabel_3.setVisible(false);
							PreparedStatement pst = null;
							pst = dbConn.prepareStatement("insert into 操作账号 values(?,?)");//记录当前正在使用的用户
							pst.setString(1, strT);//插入账号
							pst.setTimestamp(2, new Timestamp(c.getTimeInMillis()));//插入时间戳
							pst.addBatch();
							pst.executeBatch();

							lblNewLabel_3.setVisible(false);
						}
						else {
							lblNewLabel_3.setVisible(true);
						}
					}
					dbConn.close();
					
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				
			}
		});

修改个人信息监听器

JButton btnNewButton_1 = new JButton("\u4FDD\u5B58");		//保存修改信息
		btnNewButton_1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String name = new String(textField.getText());//姓名
				String work = new String(textField_2.getText());//职称
				String sex = new String(textField_1.getText());//性别
				String phone = new String(textField_3.getText());//电话号码
				String num = new String();//工号
				
				String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=LibraryManagement";
				String userName="sa";
				String userPwd="QWEASDZXC000000";
				Connection dbConn = null;
				
				try {
					Statement state = null;
					Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
					dbConn = DriverManager.getConnection(dbURL,userName,userPwd);
					state = dbConn.createStatement();
				//通过获得“操作账号”表的最后一行(最新一行)得到当前正在使用系统的用户是......
					String sql0 = "select top 1* from 操作账号 order by 时间 desc";
					ResultSet rs = state.executeQuery(sql0);		//最后一行
					String s1 = new String();
					while(rs.next()) {
						s1 = rs.getString(1);
					}
					
					num = s1;//工号
					
					PreparedStatement pst = null;
					//如果文本框内容不为空,则据此修改数据库表内容
					if (name.equals("") == false) {
						String sql = "update 图书管理员 set 姓名=? where 工号=?";
						pst = dbConn.prepareStatement(sql);
						pst.setString(1, name);
						pst.setString(2, num);//工号是当前登录的账号,来自“操作账号”表
						pst.executeUpdate();
						
					}
					if(sex.equals("") == false) {
					//性别限定在“男”、“女”,出错时通过标签显示告知使用者
						try {
							String sql = "update 图书管理员 set 性别=? where 工号=?";
							pst = dbConn.prepareStatement(sql);
							pst.setString(1, sex);
							pst.setString(2, num);
							pst.executeUpdate();
							lblNewLabel_4.setVisible(false);
						}
						catch(Exception ee) {
							// TODO Auto-generated catch block
							ee.printStackTrace();
							lblNewLabel_4.setVisible(true);
							lblNewLabel_5.setVisible(false);
						}
					}
					if(work.equals("") == false) {
						String sql = "update 图书管理员 set 职称=? where 工号=?";
						pst = dbConn.prepareStatement(sql);
						pst.setString(1, work);
						pst.setString(2, num);
						pst.executeUpdate();
						
					}
					if(phone.equals("") == false) {
						String sql = "update 图书管理员 set 联系电话=? where 工号=?";
						pst = dbConn.prepareStatement(sql);
						pst.setString(1, phone);
						pst.setString(2, num);
						pst.executeUpdate();
						
					}
					
					Statement stateCnt = dbConn.createStatement();
					String sql1 = "select * from 图书管理员 where 工号='"+num+"'";
					ResultSet rs_1 = stateCnt.executeQuery(sql1);
					
					int i = 0;
					while(rs_1.next() && i<rowData.length) {
						rowData[i][0] = rs_1.getString(1);
						rowData[i][1] = rs_1.getString(2);   
						rowData[i][2] = rs_1.getString(3);   
						rowData[i][3] = rs_1.getString(4);   
						rowData[i][4] = rs_1.getString(5);
						i++;
					}
					//刷新表格
					TableModel tml = new DefaultTableModel(rowData,Name);
					table.setModel(tml);
				
					pst.close();
					dbConn.close();
					if(lblNewLabel_4.isVisible()) {
						lblNewLabel_5.setVisible(false);
					}else {
						lblNewLabel_5.setVisible(true);
					}
					
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (ClassNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			
			}
		});

**4.3.0增删改查**

PreparedStatement pst = null;
pst = dbConn.prepareStatement("insert into 图书 values(?,?,?,?,?,?,?,?)");
pst.setString(1, num);//书号
pst.setString(2, name);//书名
pst.setString(3, writer);//作者
pst.setString(4, publish);//出版社
pst.setString(5, price);//定价
pst.setString(6, intro);//内容简介
pst.setString(7, status);//状态
pst.setString(8, cla);//分类
pst.addBatch();
pst.executeBatch();
dbConn.close();
	

String sql0 = "delete from 图书 where 书号= ?";
	PreparedStatement pst = dbConn.prepareStatement(sql0);
	pst.setString(1, num);//书号
	pst.addBatch();
	pst.executeBatch();
	lblNewLabel_4.setVisible(true);//显示删除成功
	dbConn.close();
		

PreparedStatement pst = null;
if (name.equals("") == false) {
	String sql = "update 图书 set 书名=? where 书号=?";
	pst = dbConn.prepareStatement(sql);
	pst.setString(1, name);
	pst.setString(2, num);							
	pst.executeUpdate();
}

try {
			String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=LibraryManagement";
			String userName="sa";
			String userPwd="QWEASDZXC000000";
			Connection dbConn = null;
			
			Statement state = null;
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
			dbConn = DriverManager.getConnection(dbURL,userName,userPwd);
//连接数据库
			state = dbConn.createStatement();
			String sql0 = "select * from 图书";
			ResultSet rs = state.executeQuery(sql0);
			
			Statement stateCnt = dbConn.createStatement();
			String sql1 = "select count(*) from 图书";
			ResultSet rs_1 = stateCnt.executeQuery(sql1);
			while(rs_1.next()) {
				textField_3.setText(rs_1.getString(1));
			}//统计总数
			
			int i = 0;//查询结果显示到Java表格组件
			while(rs.next() && i<rowData.length) {
				rowData[i][0] = rs.getString(1);
				rowData[i][1] = rs.getString(2);   
				rowData[i][2] = rs.getString(3);   
				rowData[i][3] = rs.getString(4);   
				rowData[i][4] = rs.getString(5);
				rowData[i][5] = rs.getString(6);
				rowData[i][6] = rs.getString(7);
				rowData[i][7] = rs.getString(8);
				i++;
			}
			dbConn.close();
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (ClassNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

完整源代码

通过百度网盘分享的文件:图书管理系统V1…
链接:https://pan.baidu.com/s/1NQczvOX0n0_g0pDx3iiIXw 提取码:po48复制这段内容打开「百度网盘APP 即可获取」

  • 119
    点赞
  • 1021
    收藏
    觉得还不错? 一键收藏
  • 62
    评论
图书管理系统数据库设计 点击: 发布日期:2007-7-30 7:56:00 进入论坛 1、摘要: 一个简单的图书管理系统包括图书馆内书籍的信息、学校在校学生的信息以及学生的借阅信息。此系统功能分为面向学生和面向管理员两部分,其中学生可以进行借阅、续借、归还和查询书籍等操作,管理员可以完成书籍和学生的增加,删除和修改以及对学生,借阅、续借、归还的确认。 2、需求分析 针对一般图书管理信息系统的需求,通过对图书管理工作过程的内容和数据流程分析,设计如下面所示的数据项: Ø 读者信息 属性:读者学号,读者姓名,读者性别,联系电话,所在系,生效日期,失效日期,违章状况,累计借书,备注 主键:读者学号 Ø 书籍信息 属性:ISBN,书名,作者,出版社,出版日期,简介,备注 主键:ISBN Ø 管理员信息 属性:工作号,姓名,性别,电话,家庭住址,备注 主键:工作号 2.1 数据流程 通过对系统的调查和可行性分析,画出系统的数据流程图: 2.1.1 读者 学生对图书管理系统的要求有: Ø 能按各种方式(比如书名、编号、作者)查询图书馆的藏书情况。 Ø 能够方便地借阅图书、续借图书、归还图书 Ø 能够查询自己的基本资料、图书情况 Ø 能够熟悉图书管理系统的使用。 读者进入系统工作的流程图为: 注册 查询 修改信息 借阅续借 图书 归还 注销 还可以吧
数据库系统原理》课程设计—图书馆管理系统 一、课程设计的目的及意义 本课程设计是在学习《数据库原理》课程后,进行的一次全面的综合训练,其目的在于 加深对数据库原理的理解,掌握运用数据库应用系统开发软件的使用方法。通过此次课 程设计,将理论联系实际,可以增强自己的实践动手能力。 二、项目背景 随着现代科学技术的进步,人类社会正逐步走向信息化。图书馆拥有丰富的文献信息 资源,是社会信息系统的重要组成部分,在信息社会中的作用愈来愈重要。我国图书馆 计算机等信息技术的应用起步于20世纪70年代末期,随着改革开放的步伐得以迅速发展 ,特别是90年代以后,我国图书馆信息网络建设取得了较大发展,图书馆信息化建设迈 上了一个新台阶。 某高校图书馆的要求就是藏书全部开放,师生共享、开架借阅。这种借阅方式是发挥 图书馆应有作用的最佳方式,也是素质教育的最好体现。它充分发挥了图书馆的功效, 最大限度地为师生服务,这也是图书馆自动化管理的最终目标。实现这一目标,必须有 现代化的管理手段和体制,图书馆管理的信息化是一个必然趋势。图书馆的信息化管理 ,就是将传统图书馆业务的手工操作转变成由计算机管理,即将图书馆的图书期刊、音 像资料等各种载体文献的采编、典藏、流通、检索及常规业务管理工作,利用计算机技 术,进行高效、准确的信息化管理。 某高校图书馆管理系统总的实现目标是:建立以馆藏目录为基础的机读书目数据库, 实现馆内采购、编目、流通、文献检索等信息化管理;建立图书馆动态网站;接入校园 网为广大师生及时提供馆内的最新信息。长期的目标还要实现直接浏览电子图书以及馆 际间的图书互借等。 三、可行性研究及需求分析、概要设计 1、可行性研究 随着信息时代的到来,人们对知识的需要日益增长,图书馆的藏书、管理人员、读者 的数量也越来越多。图书馆管理涉及大量的数据处理,如果用手工来完成庞大的数据处 理,将费时费力,还容易出错,为了满足图书馆管理的需要,急需要一套图书馆管理系 统来完成这项工作。作为计算机应用的一部分,使用计算机对图书馆信息进行管理,有 着手工管理所无法比拟的优点。例如:检索迅速、查找方便、可靠性高、存储量大、保 密性好、寿命长、成本低等。这些优点能够极大地提高图书馆管理的效率,也是企业的 科学化、正规化管理的重要条件。 2、需求分析和概要设计 一般通用的图书馆管理系统包括系统管理、读者管理、编目、图书流通、统计、查询 等功能。比较先进的图书馆管理系统能够在一个界面下实现图书、音像、期刊的管理、 设置假期、设置暂离锁(提高安全性)、暂停某些读者的借阅权、导入导出读者、升级 辅助编目等。此外随着Internet应用的发展,一个完善的系统还应提供无缝接入Intern et的功能,通过IE浏览器让读者使用借阅资料查询、修改密码、预约、资料检索等功能 。有些系统还提供读者自助服务,可以开放一些客户机让读者自行管理密码、查询自己 的借阅情况、预约资料、检索资料等。 下面介绍的是通用图书馆管理系统所必备的功能,如图1所示,包括基本信息维护、 读者管理、图书管理、期刊管理、图书流通管理、期刊流通管理、统计分析管理和系统 管理功能模块,其中每个功能都由若干相关联的子功能模块组成。除此之外系统还应包 括信息系统必须具备的通用功能,例如用户登陆、权限管理、权限设置、数据备份与恢 复等,由于有很多数据库应用方面的书籍对此均有介绍,这里就不再详细介绍了。 图1 图书馆管理系统应包括的基本功能 2.1、基本信息维护模块 "基本信息维护"用于对图书馆信息、书籍信息、常用词库等项目进行初始化设置,这 些设置一般不能轻易改动,包含的子功能模块如图2所示。 图2 "基础信息维护"功能模块 "图书馆信息"用于设置图书馆的基本信息,包括图书馆名称、管长、负责人、电话、说 明等。 "系统参数设置"用于设置系统运行所需的参数,包括办证费用、证件有效期、图书超期 罚款金额、期刊超期罚款金额等。 "书架设置"用于设置书架的基础信息,内容包括书架编号、书架名称等。 "管理员设置"用于设置使用的人员及权限。 "图书期刊词库设置"用于设置系统常用的词库,内容包括供应商、分级、附件、尺寸、 语系、印刷等信息的预先设定值。 2.2、读者管理模块 "读者管理"用于管理与读者有关的信息,包含的子功能模块如图3所示。 图3 "读者管理"功能模块 "读者类型设置"用于设置读者的类型及相关的信息,内容包括图书类型、图书册数、期 刊册数、续借次数、限制图书、限制期刊等。 "读者档案管理"用于设置读者相关的信息,内容包括编号、条形码、姓名、性别、类型 、出生日期、有效证件、证件号码、联系方式、登记日期、有效期至、操作员、备注、 图书借阅次数、期刊借阅次数、是否挂失等。 "借书证挂失与恢复"用于挂失和恢复读者的借书证,挂失
图书管理系统数据库设计 一:需求分析: 1:图书管理系统的功能图 2:系统说明: 1. 不同的读者类型对不同的图书类型借阅的天数不同,不同的读者可借阅的图书总数不同 。 2. 当图书借阅超期后、弄污、遗失会有相应的处罚。 3. 同样的图书在管理系统中会 有多本,每本之间可以区分。 4. 用户注册需经系统管理员同意后才可借阅图书。 5. 读者对预约图书有优先的借阅权。 6. 读者可以对自己的联系方式信息进行修改。 7. 图书卡或图书遗失后可申请挂失,挂失后将不能对图书进行借还操作。 3:分析各功能所需要用到的数据。 用户登录: 用户:用户名,密码 用户注册: 用户:用户名,密码,学号,姓名,系、专业,年级,电话号码,邮箱,性别 图书检索: 图书:图书号, ISBN号,书名,作者,价格,出版社,出版日期,简介 查询借阅信息: 借阅:图书,借阅时间,应归还时间,归还时间,续借次数 图书续借: 续借:用户名,图书,续借时间 图书挂失: 图书挂失:图书,用户名,挂失时间,取消挂失时间 图书卡挂失: 图书卡挂失:用户名,挂失时间,取消挂失时间 预约图书: 预约:用户名,图书名,预约时间,借书时间,是否取消 图书管理: 系统管理员:帐号,密码,姓名,性别,年龄,职称 图书管理员:帐号,密码,姓名,性别,年龄,职称 同意读者注册: 用户注册:是否同意 罚款管理: 罚款:用户名,图书,罚款金额,处罚原因,罚款时间 借书: 用户,图书,借书时间 还书: 图书,还书时间 书掉了,罚款: 4:分析实体和实体间的联系 实体:读者、图书、系统管理员、图书管理员、读者类型、图书类型 联系: 1. 图书类型 图书 属于 2. 读者类型 读者 属于 3. 读者 图书 借阅,预约,挂失,罚款,续借 4. 图书管理员 图书 借,还,罚款 5. 读者 读者 挂失 二:系统的概念模型设计。 每个实体的E-R图(未完)。 不同实体间的联系(未完): 综合的E—R图 三:数据模型的设计: 1、把上面的概念模型转换为关系模型: 实体的转换: 读者类型(类型编号,类型名称,可借阅的图书数) 读者(读者号,密码,姓名,系、专业,年级,电话号码,邮箱,性别,类型编 号) 图书类型(类型编号,类型名称) 图书(图书号, ISBN号,书名,作者,价格,出版社,出版日期,简介,类型编号) 图书管理员(帐号,密码,姓名,性别,年龄,职称) 系统管理员(帐号,密码,姓名,性别,年龄,职称) 联系的转换: 借阅限制(读者类型编号,图书类型编号,借阅天数) 图书卡挂失(读者号,挂失时间,取消挂失时间) 借阅(读者号,图书号,借阅时间,应归还时间,归还时间,) 借书(,图书号,读者号,借出时间) 还书(图书管理员编号,图书号,还书时间) 续借(读者号,图书号,续借时间) 图书挂失(读者号,图书号,挂失时间,取消挂失时间) 预约(读者号,图书号,预约时间) 罚款(图书管理员,读者号,图书号,罚款时间,罚款金额,罚款原因) 2、关系的优化: 对上述关系模式的优化 图书管理员和系统管理员的关系模式相同,为了减少关系模式把这两个关系模式 合并为一个关系模式。 图书管理员(帐号,密码,姓名,性别,年龄,职称) 系统管理员(帐号,密码,姓名,性别,年龄,职称) 管理员(帐号,密码,姓名,性别,年龄,职称,类型) 借阅的数据处理与三个关系模式:借阅,借书,还书,在借阅的表中包括除了管 理员以外的所有信息,则把这三个关系模式进行合并: 借阅(读者号,图书号,借阅时间,应归还时间,归还时间,) 借书(管理员编号,图书号,读者号,借出时间) 还书(图书管理员编号,图书号,还书时间) 借阅(读者号,图书号,借阅时间,应归还时间,归还时间,借出图书管理 员编号,还出的图书管理员编号) 3、最后的关系模式如下: 1. 读者类型(类型编号,类型名称,可借阅的图书数) 2. 读者(读者号,密码,姓名,系、专业,年级,电话号码,邮箱,性别,类型 编号) 3. 图书类型(类型编号,类型名称) 4. 图书(图书号, ISBN号,书名,作者,价格,出版社,出版日期,简介,类型编号) 5. 管理员(帐号,密码,姓名,性别,年龄,职称,类型) 6. 借阅限制(读者类型编号,图书类型编号,借阅天数) 7. 借阅(读者号,图书号,借阅时间,应归还时间,归还时间,借出图书管理员 编号,还出的图书管理员编号) 8. 续借(读者号,图书号,续借时间) 9. 图书卡挂失(读者号,挂失时间,取消挂失时间) 10. 图书挂失(读者号,图书号,挂失时间,取消挂失时间) 11. 预约(读者号,图书号,预约时间) 12. 罚款(图书管理员,读者号,图书号,罚款时间,罚款金额,罚款原因) 四:对每一个关系模式的具体定义 每一个关系对应的表名,每一个属性对应的

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 62
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值