【基于Java的图书管理系统----课程设计详解(使用MySQL数据库)附全部源代码下载链接、数据流图、流程图等】

(全部“源代码”下载地址:
链接:https://pan.baidu.com/s/1j3eeEkk2ey9YRMRvDdzNIw
提取码:sfca
复制这段内容后打开百度网盘手机App,操作更方便哦)

一:系统功能

(1)管理员登录
(2)图书借阅信息管理(如“归还图书”等)
(3)图书信息管理(如对图书进行“增删改查”等)
(4)管理员更改密码
(5)退出系统

二:开发工具

Eclipse: 版本为2020年6月版
Navicat for MySQL:最近几个版本都可
jar包(连接数据库使用):mysql-connector-java-8.0.13.jar

三:实现效果

登录界面
在这里插入图片描述
主界面
在这里插入图片描述
借走书籍管理(数据库将同步刷新)
在这里插入图片描述
个人书库管理(可以进行“还书”操作)数据库将同步刷新
在这里插入图片描述
更改密码界面(更改密码之后需要再重新登录,输入错误将登录失败)数据库将同步刷新。
在这里插入图片描述

四:数据库表设计一览

在这里插入图片描述

图书表:
在这里插入图片描述
用户表:
在这里插入图片描述
两个数据表间没有关联:
在这里插入图片描述

五:系统逻辑简析(含数据流图、流程图等)

(1)代码逻辑图(各个包、类):
在这里插入图片描述

(2)包结构,采用MVC三层架构组织各个模块
在这里插入图片描述
(3)数据流图(使用Visio绘制)
在这里插入图片描述
(4)系统总流程详细设计(使用Visio绘制)
在这里插入图片描述

六:Java代码

由于内容太多。现以几个主要代码片示例,全部源代码以及文件大家可以从最上边的网盘地址下载哈!

登录界面代码

package pers.cyz;
import javax.swing.JFrame;
import pers.cyz.view.Login;
/**
 * 主程序类
 */
@SuppressWarnings("serial")
public class BookManage extends JFrame {
    
    
	public BookManage() {
    
    
		new Login();
	}
	public static void main(String[] args) {
    
    	
		new BookManage();
	}
}

增删改查:

package pers.cyz.controller;
import java.util.List;
import javax.swing.JTable;
import javax.swing.JTextField;
import pers.cyz.dao.BookDao;
import pers.cyz.model.Book;
/**
 * 图书信息行为控制类,包含   增加图书、删除图书
  修改图书、和初始化个人书库  管理   窗体表格

 */
public class BookAction {
    
    
	   
	/**
	 * 初始化窗体表格
	 * @return
	 * 		results
	 */
	@SuppressWarnings("rawtypes")
	public Object[][] initializTable(String[] columnNames) throws Exception{
    
    
		BookDao bookDao = new BookDao();
		List list = bookDao.query();
		Object[][] results = new Object[list.size()][columnNames.length];
		
		for(int i = 0; i < list.size(); i++) {
    
    
			Book book = (Book)list.get(i);				
	
			results[i][0] = book.getID();
			results[i][1] = book.getBookName();
			results[i][2] = book.getAuthor();
			results[i][3] = book.getPrice();
			results[i][4] = book.getISBN();
			results[i][5] = book.getPublishHouse();
			results[i][6] = book.getBookCategory();	
	
			String borrowerName =  book.getBorrowerName();
			if (borrowerName == null) {
    
    	
				borrowerName = "";	
				results[i][7] = borrowerName;
			}
			else {
    
    	
				results[i][7] = borrowerName;
			}
			
			String borrowerPhone = book.getBorrowerPhone();	
			if (borrowerPhone == null) {
    
    		
				borrowerPhone = "";	
				results[i][8] = borrowerPhone;
			}	
			else {
    
    	
				results[i][8] = borrowerPhone;
			}
		}	   	
		return results;
}
 	/**
 	 * 添加图书信息
 	 */
	public void addBookInformation (JTextField textFieldISBN, JTextField textFieldName
			,JTextField textFieldPrice, JTextField textFieldAuthor, JTextField textFieldPublishedHouse
			, JTextField textFieldBookCategory, JTextField textFieldBorrowName
			, JTextField textFieldBorrowPhone) throws Exception {
    
    
        BookDao bookDao=new BookDao();
        Book book=new Book();     
        
        book.setISBN(textFieldISBN.getText());      
        book.setBookName(textFieldName.getText());
        float price = Float.parseFloat(textFieldPrice.getText());
        book.setPrice(price);
        book.setAuthor(textFieldAuthor.getText());
        book.setPublishHouse(textFieldPublishedHouse.getText());
        book.setBookCategory(textFieldBookCategory.getText());
        
        if (textFieldBorrowName.getText() == null ||textFieldBorrowName.getText() == "" ) {
    
    
        	book.setBorrowerName(null);
        }
        else {
    
    
        	 book.setBorrowerName(textFieldBorrowName.getText());
        }
       
        if (textFieldBorrowPhone.getText() == null || textFieldBorrowPhone.getText() == "") {
    
    
        	book.setBorrowerPhone(null);
        }
        else {
    
    
        	book.setBorrowerPhone(textFieldBorrowPhone.getText());
        }    
        //添加图书
        bookDao.addBook(book);
	}
	/**
	 * 删除图书信息
	 */
	public void delBookInformation (JTable table) throws Exception {
    
    
	
		int selRow = table.getSelectedRow();
		int ID = Integer.parseInt(table.getValueAt(selRow, 0).toString());
		
        BookDao bookDao=new BookDao();
        Book book=new Book();     
        
        book.setID(ID);
   
        // 删除图书信息
        bookDao.delBook(ID);
	}
	/**
	 * 修改图书信息
	 */
	public void changeBookInformation (JTextField textFieldISBN, JTextField textFieldName
			,JTextField textFieldPrice, JTextField textFieldAuthor, JTextField textFieldPublishedHouse
			, JTextField textFieldBookCategory, JTextField textFieldBorrowerName
			, JTextField textFieldBorrowerPhone, JTable table) throws Exception{
    
    
		
        BookDao bookDao=new BookDao();
        Book book=new Book();     
       
		int selRow = table.getSelectedRow();
		int ID = Integer.parseInt(table.getValueAt(selRow, 0).toString());	
        book.setID(ID);
        
        book.setISBN(textFieldISBN.getText());      
        book.setBookName(textFieldName.getText());
        book.setAuthor(textFieldAuthor.getText());
        float price = Float.parseFloat(textFieldPrice.getText());
        book.setPrice(price);
        book.setPublishHouse(textFieldPublishedHouse.getText());
        book.setBookCategory(textFieldBookCategory.getText());
        book.setBorrowerName(textFieldBorrowerName.getText());
    	book.setBorrowerPhone(textFieldBorrowerPhone.getText());   
        //修改图书
        bookDao.changeBook(book);       
	}
}

归还图书:

package pers.cyz.controller;
import java.util.List;
import javax.swing.JTable;
import pers.cyz.dao.BookDao;
import pers.cyz.model.Book;

/**
 * 借还书行为控制类,包含     初始化借还书   管理窗体表格  
 *                              以及归还图书
 */
public class BorrowAction {
    
    
	BookDao borrowerDao; 
	/**
	 * 初始化借还书管理窗体表格
	 * @return
	 * 		results
	 */
	@SuppressWarnings("rawtypes")
	public Object[][] initializTable(String[] columnNames) throws Exception{
    
    
		borrowerDao = new BookDao();
		List list = borrowerDao.borrowQuery();
		Object[][] results = new Object[list.size()][columnNames.length];
		
		for(int i = 0; i < list.size(); i++) {
    
    		
			Book book = (Book)list.get(i);			
			
			results[i][0] = book.getID();
			results[i][1] = book.getBookName();	
			results[i][2] = book.getBorrowerName();		
			results[i][3] = book.getBorrowerPhone();
		}	   	
		return results;
	}
	
	/**
	 * 归还图书
	 */
	public void BorrowBook (JTable table) throws Exception{
    
    
		
        borrowerDao=new BookDao();
        Book book=new Book();     
       
		int selRow = table.getSelectedRow();
		int ID = Integer.parseInt(table.getValueAt(selRow, 0).toString());	
        book.setID(ID);
        book.setBorrowerName(null);
        book.setBorrowerPhone(null);    
        // 归还图书
        borrowerDao.returnBook(book);
	}	
}

连接数据库类

package pers.cyz.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
 * 连接    数据库类,
 *   包含一个对外提供获取数据库连接的方法

 */
public class DBUtil {
    
    
	// 数据库连接路径
	private static final String URL = "jdbc:mysql://127.0.0.1:3306/db_books?"
			+ "useUnicode = true & serverTimezone = GMT"
			// MySQL在高版本需要指明是否进行SSL连接
			+ "& characterEncoding = utf8 & useSSL = false";
	private static final String NAME = "root";
	private static final String PASSWORD = "root";
	private static Connection conn = null;
	
	// 静态代码块(将加载驱动、连接数据库放入静态块中)
	 static{
    
    
	        try {
    
    
	            // 加载驱动程序
	            Class.forName("com.mysql.cj.jdbc.Driver");
	            // 获取数据库的连接
	            conn = DriverManager.getConnection(URL, NAME, PASSWORD);
	        } catch (ClassNotFoundException e) {
    
    
	            e.printStackTrace();
	        } catch (SQLException e) {
    
    
	            e.printStackTrace();
	        }
	    }
	 // 对外提供一个方法来获取数据库连接	    
	 public static Connection getConnection(){
    
         
		 return conn;	   
	 }	
}

登录界面设置:

package pers.cyz.view;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import pers.cyz.dao.UserDao;
import pers.cyz.model.User;
import pers.cyz.util.BackgroundImage;
import pers.cyz.util.KeyListener;
import pers.cyz.util.LimitTextLength;
/**
 *        登录  界面类
 */
@SuppressWarnings("serial")
public class Login extends JFrame {
    
    
	private final JFrame frame = new JFrame("新晨旭个人书屋");
	private final Container container = frame.getContentPane();
	
	// 用户名框
	private JTextField texFieldtUserName  = new JTextField();
	// 密码框
	private JPasswordField textFieldPasswd = new JPasswordField();
	// 重置按钮
	private JButton buttonReset = new JButton();
	// 登录按钮
	private JButton buttonLogin = new JButton();
	public Login() {
    
    
		container.setLayout(null);
		// 设置背景图片
		new BackgroundImage(frame,container,"login.jpg");
		// 设置用户名框以及监听事件
		setTextFieldUserName();
		// 设置密码框以及监听事件
		setPasswdField();
		// 设置登录按钮以及添加监听事件
		setButtonLogin();
		// 设置重置按钮以及添加监听事件
		setButtonReset();	
		container.add(texFieldtUserName);
		container.add(textFieldPasswd);
		container.add(buttonLogin);
		container.add(buttonReset);
		// 设置窗口大小、位置、可视、默认关闭方式等
		frame.setVisible(true);
		// 窗口不可调整大小
		frame.setResizable(false);
		frame.setSize(550, 388);
		frame.setLocation(300,150);
		frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);	
	}
	/**
	 * 设置重置按钮以及监听事件
	 */
	private void setButtonReset() {
    
    
		buttonReset.setIcon(new ImageIcon("res/button_reset.jpg"));
		buttonReset.setBounds(310,280,90,30);
		buttonReset.addActionListener(new ActionListener() {
    
    			
			@Override
			public void actionPerformed(ActionEvent e) {
    
    
				// TODO Auto-generated method stub
				texFieldtUserName.setText("");
				textFieldPasswd.setText("");
			}
		});
	}
	/**
	 * 设置登录按钮以及监听事件
	 */
	private void setButtonLogin() {
    
    
	
		buttonLogin.setIcon(new ImageIcon("res/button_login.jpg"));
		buttonLogin.setBounds(150,280,90,30);
		buttonLogin.addActionListener(new ActionListener() {
    
    		
			@Override
			public void actionPerformed(ActionEvent paramActionEvent) {
    
    
				// TODO Auto-generated method stub
				String username = texFieldtUserName.getText();
				String passwd = new String(textFieldPasswd.getPassword());
				UserDao userDao = new UserDao();						
				try {
    
    		   
					    List<User> userList = userDao.query();
				        for (User user : userList) {
    
    	
				        	if (user.getUser().equals(username) && user.getPasswd().equals(passwd)) {
    
    
				        		frame.setVisible(false);
				        		new MainFrame();
				        	} else if(username.equals("") || passwd.equals("")) {
    
    
				        		JOptionPane.showMessageDialog(null,"用户名或密码不能为空","错误"
										,JOptionPane.PLAIN_MESSAGE);
				        	} else {
    
    
				        		JOptionPane.showMessageDialog(null,"用户名或密码错误","错误"
										,JOptionPane.PLAIN_MESSAGE);		
				        	}
				        }			        
				}catch(Exception ex) {
    
    
					ex.printStackTrace();
				}  
			}
		});
	}
	/**
	 * 设置密码框以及添加监听事件
	 */
	private void setPasswdField() {
    
    
		// 限制用户输入长度
		textFieldPasswd.setDocument(new LimitTextLength(8));
		textFieldPasswd.setBounds(235,210,180,30);
		// 键盘事件,如果按下回车则模拟鼠标点击登录按钮
		new KeyListener(textFieldPasswd,buttonLogin);
	}
	/**
	 * 设置用户名框以及添加监听事件
	 */
	private void setTextFieldUserName() {
    
    
		// 限制用户输入长度
		texFieldtUserName.setDocument(new LimitTextLength(8));
		texFieldtUserName.setBounds(235,145,180,30);
		// 键盘事件,如果按下回车则模拟鼠标点击登录按钮
		new KeyListener(texFieldtUserName,buttonLogin);
	}	
}

七:核心思想简析

针对在大学阶段需要课程设计以及得给老师讲解的同学们:
´・ᴗ・( '▿ ' ) 大家在给老师讲解的时候可以从MVC设计思想开始讲起,也是Java软件设计模式(体系结构)的一种,然后再细致讲解代码即可,比如数据库是如何进行连接的?(以往的博客我有发过步骤,很简单的。)数据库的连接步骤?遇到的困难有什么?怎么解决的?大家的具体分工是什么?等等......你一定可以通过课设的!加油!´・ᴗ・
(代码的重要部分均带有注释,不明白可以再仔细看看。)

(1)窗口显示思路:将图片标签放在窗体底层面板,然后将窗体转化为容器,将容器面板设为透明,背景图片就设置好了,之后就可以直接在该容器中添加组件即可。
(2)MVC设计思想:(关键)

这个系统的主体部分采用Java语言来书写,并结合MVC框架来进行项目的创建,并将所有两个或两个以上类需要用到的代码段全部封装到了公共类。MVC框架即模型—视图—控制器体系结构,使用这个结构可以将软件的业务逻辑部分与用户界面显示部分分离开来。Model包含核心功能与数据,View为用户显示信息,Controller用来处理用户输入。使用该框架的目的以及以优点有:
Controller接受输入,通常是从鼠标运动、按钮和键盘事件引起的输入。当用户通过一个View的Controller改变了Model,则当数据发生变化的时候,Model负责通知所有的View,告知它们数据已经改变,View则可以查询Model中的数据,以便发现到底是什么改变了,然后更新显示数据。
这种改变—-传播机制保证了用户界面和模型的一致性。具体表现在:
(1)模型:模型持有所有的数据 、状态和程序逻辑。模型独立于视图和控制器。
(2)视图:用来呈现模型 。视图通常直接从模型中取得它需要显示的状态与数据,对于相同的信息可以有多个不同的显示形式或视图。
(3)控制器: 位于视图和模型中间,负责接受用户的输入,将输入进行解析并反馈给模型 ,通常一个视图具有一个控制器。
使用该模式的好处有:
(1)一个模型提供不同的多个视图表现形式,也能够为一个模型创建新的视图而无须重写模型。一旦模型的数据发生变化,模型将通知有关的视图,每个视图相应地刷新自己。
(2)模型可复用。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。
(3)提高开发效率。在开发界面显示部分时,你仅仅需要考虑的是如何布局一个好的用户界面;开发模型时,你仅仅要考虑的是业务逻辑和数据维护,这样能使开发者专注于某一方面的开发,提高开发效率。
总的来说MVC设计模式可以方便开发人员分工协作,提高开发效率,增强程序的可维护性和拓展性而且还利用Controller将Model与View分离,降低它们之间的耦合度。因此,可以使用该模式较好的匹配这个图书管理系统。

----都看到这儿了,顺手点个赞吧!!!!
░░░░░░░░░░░█░█
░░░░░░░░░░░█░█
░░░░░░░░░░█░░█
░░░░░░░░░█░░░█
███████▄▄█░░░███
▓▓▓▓▓▓█░░░░░░░░░░░░█
▓▓▓▓▓▓█░░░░░░░░░░░░█
▓▓▓▓▓▓█░░░░░░░░░░░░█
▓▓▓▓▓▓█░░░░░░░░░░░░█
▓▓▓▓▓▓█░░░░░░░░░░░░█
▓▓▓▓▓▓████░░░░░░░░█
██████▀░▀▀██████▀

猜你喜欢

转载自blog.csdn.net/qq_44731019/article/details/111027220