系列文章目录
Java Swing + MySQL 图书管理系统
Java Swing + MySQL 图书借阅管理系统
文章目录
- 系列文章目录
- 前言
- 一、项目展示
- 二、部分代码
- 1.Book
- 2.BookDao
- 3.DBUtil
- 4.BookAddInternalFrame
- 5.Login
- 三、配置
前言
项目是使用Java swing开发,界面设计比较简洁、适合作为Java课设设计以及学习技术使用。
- 语言:Java
- 界面:JavaSwing
- 数据库:MySQL 8.x
具体功能如下:
1、基础功能
(1)系统登录功能:用户可以通过用户名和密码登录系统。
(2)图书分类管理功能:管理员可以对于图书的类别进行增、删、改、查操作。
(3)图书信息管理功能:能够增、删图书,修改图书名称、类别、价格等信息。
(4)图书借阅管理功能:包括图书借出和图书归还等操作,设计功能时需要考虑逾期情况的判别和处理。
2、可选加分功能
(1)借阅记录查询功能:学生可以查看自己在某时间段之内的借阅记录;管理员可以按照学号查询学生的借阅记录。(ps:只有管理员能够增删改查图书内容,用户只有查找书的信息的权限)
一、项目展示
二、部分代码
1.Book
代码如下(示例):
package entity;/*** BookManagementSystem* 图书** @author PlutoCtx* @version 2024/5/26 1:07* @email ctx195467@163.com* @since JDK17*/public class Book {/*** 图书id*/private int id;/*** 书名*/private String bookName;/*** 作者*/private String author;/*** 图书数量*/private int number;/*** 价格*/private Float price;/*** 图书类别*/private Integer bookTypeId;/*** 图书类别*/private String bookTypeName;/*** 描述*/private String bookDesc;public Book(String bookName, String author, Integer number, Float price, Integer bookTypeId, String bookDesc) {super();this.bookName = bookName;this.author = author;this.number = number;this.price = price;this.bookTypeId = bookTypeId;this.bookDesc = bookDesc;}public Book(int id, String bookName, String author, Integer number, Float price, Integer bookTypeId, String bookDesc) {super();this.id = id;this.bookName = bookName;this.author = author;this.number = number;this.price = price;this.bookTypeId = bookTypeId;this.bookDesc = bookDesc;}public Book(String bookName, String author, Integer bookTypeId) {super();this.bookName = bookName;this.author = author;this.bookTypeId = bookTypeId;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public Float getPrice() {return price;}public void setPrice(Float price) {this.price = price;}public Integer getBookTypeId() {return bookTypeId;}public void setBookTypeId(Integer bookTypeId) {this.bookTypeId = bookTypeId;}public String getBookTypeName() {return bookTypeName;}public void setBookTypeName(String bookTypeName) {this.bookTypeName = bookTypeName;}public String getBookDesc() {return bookDesc;}public void setBookDesc(String bookDesc) {this.bookDesc = bookDesc;}public Book() {}public Book(int id,String bookName,String author,Integer number,Float price,Integer bookTypeId,String bookTypeName,String bookDesc) {this.id = id;this.bookName = bookName;this.author = author;this.number = number;this.price = price;this.bookTypeId = bookTypeId;this.bookTypeName = bookTypeName;this.bookDesc = bookDesc;}}
2.BookDao
代码如下(示例):
package dao;import entity.Book;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;/*** BookManagementSystem** @author PlutoCtx* @version 2024/5/26 9:27* @email ctx195467@163.com* @since JDK17*/public class BookDao {/*** 添加图书* @param connection 连接数据库* @param book 书籍* @return preparedStatement.executeUpdate(),int* @throws Exception how do I know*/public int add(Connection connection, Book book)throws Exception{String sql = "INSERT INTO book VALUES (null, ?, ?, ?, ?, ?, ?)";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, book.getBookName());preparedStatement.setString(2, book.getAuthor());preparedStatement.setInt(3, book.getNumber());preparedStatement.setFloat(4, book.getPrice());preparedStatement.setInt(5, book.getBookTypeId());preparedStatement.setString(6, book.getBookDesc());return preparedStatement.executeUpdate();}/*** 查找书籍* @param connection 连接数据库* @param book 书籍* @return preparedStatement.executeUpdate(), int* @throws Exception how do I know*/public ResultSet list(Connection connection, Book book)throws Exception{StringBuilder stringBuffer = new StringBuilder("SELECT * FROM book b,bookType bt WHERE b.bookTypeId = bt.id");if(book.getBookName() != null &&!book.getBookName().equals("")){stringBuffer.append(" and b.bookName like '%").append(book.getBookName()).append("%'");}if(book.getAuthor() != null &&!book.getAuthor().equals("")){stringBuffer.append(" and b.author like '%").append(book.getAuthor()).append("%'");}if(book.getBookTypeId() != null && book.getBookTypeId()!=-1){stringBuffer.append(" and b.bookTypeId=").append(book.getBookTypeId());}PreparedStatement preparedStatement = connection.prepareStatement(stringBuffer.toString());return preparedStatement.executeQuery();}/*** 删除书籍* @param connection 连接数据库* @param id 书籍id号* @return preparedStatement.executeUpdate(), int* @throws Exception how do I know*/public int delete(Connection connection,String id)throws Exception{String sql = "DELETE FROM book " +"WHERE id = ?";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, id);return preparedStatement.executeUpdate();}/*** 更新书籍* @param connection 连接数据库* @param book 书籍* @return preparedStatement.executeUpdate(),int* @throws Exception how do I know*/public int update(Connection connection,Book book) throws Exception{String sql = "UPDATE book " +"SET bookName = ?, author = ?, number = ?, price = ?, bookDesc = ?, bookTypeId = ? " +"WHERE id = ?";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, book.getBookName());preparedStatement.setString(2, book.getAuthor());preparedStatement.setInt(3, book.getNumber());preparedStatement.setFloat(4, book.getPrice());preparedStatement.setString(5, book.getBookDesc());preparedStatement.setInt(6, book.getBookTypeId());preparedStatement.setInt(7, book.getId());return preparedStatement.executeUpdate();}/*** 判断书籍是否存在* @param connection 数据库连接* @param bookTypeId 书类号* @return 存在与否* @throws Exception 异常多了什么都有可能*/public boolean existBookByBookTypeId(Connection connection,String bookTypeId)throws Exception{String sql = "SELECT * FROM book WHERE bookTypeId = ?";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, bookTypeId);ResultSet rs = preparedStatement.executeQuery();return rs.next();}}
3.DBUtil
package utils;import java.sql.Connection;
import java.sql.DriverManager;/*** BookManagementSystem* 数据库连接** @author PlutoCtx* @version 2024/5/26 8:06* @email ctx195467@163.com* @since JDK17*/public class DBUtil {/**数据库*/private String url = "jdbc:mysql://localhost:3306/BookBorrowingManagementSystem";/*** 用户名*/private String username = "root";/*** 密码*/private String password = "Shangxiao111";/*** 驱动名称*/private String jdbcName = "com.mysql.cj.jdbc.Driver";/*** 获取数据库连接* @return 返回连接* @throws Exception 没连上*/public Connection getConnection() throws Exception{Class.forName(jdbcName);Connection connection = DriverManager.getConnection(url, username, password);return connection;}/*** 关闭数据库连接* @param connection 数据库连接* @throws Exception 异常*/public void closeConnection(Connection connection) throws Exception{if (connection != null){connection.close();}}}
4.BookAddInternalFrame
package view.adminOperation;import dao.BookDao;
import dao.BookTypeDao;
import entity.Book;
import entity.BookType;
import utils.DBUtil;import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.event.ActionEvent;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Objects;
import java.util.logging.Logger;/*** BookManagementSystem* 图书添加界面** @author PlutoCtx* @version 2024/5/26 9:08* @email ctx195467@163.com* @since JDK17*/public class BookAddInternalFrame extends JInternalFrame {private final JTextField bookNameTxt;private final JTextField authorTxt;private final JTextField bookNumberTxt;private final ButtonGroup buttonGroup = new ButtonGroup();private final JTextField priceTxt;private final JComboBox bookTypeJcb;private final JTextArea bookDescTxt;private final DBUtil dbUtil = new DBUtil();private final BookTypeDao bookTypeDao = new BookTypeDao();private final BookDao bookDao = new BookDao();/*** Create the frame.*/public BookAddInternalFrame() {setClosable(true);setIconifiable(true);setTitle("图书添加");setBounds(100, 100, 450, 467);JLabel label = new JLabel("图书名称:");bookNameTxt = new JTextField();bookNameTxt.setColumns(10);JLabel label1 = new JLabel("图书作者:");authorTxt = new JTextField();authorTxt.setColumns(10);JLabel label2 = new JLabel("图书数量:");bookNumberTxt = new JTextField();bookNumberTxt.setColumns(10);JLabel label3 = new JLabel("图书价格:");priceTxt = new JTextField();priceTxt.setColumns(10);JLabel label4 = new JLabel("图书描述:");bookDescTxt = new JTextArea();JLabel label5 = new JLabel("图书类别:");bookTypeJcb = new JComboBox();JButton button = new JButton("添加");button.addActionListener(this::bookAddActionPerformed);button.setIcon(new ImageIcon(Objects.requireNonNull(BookAddInternalFrame.class.getResource("/add.png"))));JButton button1 = new JButton("重置");button1.addActionListener(this::resetValueActionPerformed);button1.setIcon(new ImageIcon(Objects.requireNonNull(BookAddInternalFrame.class.getResource("/reset.png"))));GroupLayout groupLayout = new GroupLayout(getContentPane());groupLayout.setHorizontalGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayout.createSequentialGroup().addGap(42).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayout.createSequentialGroup().addComponent(button).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED).addComponent(button1).addGap(232)).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(label5).addGroup(groupLayout.createSequentialGroup().addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.TRAILING).addComponent(label4).addComponent(label2).addComponent(label)).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayout.createSequentialGroup().addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false).addComponent(bookNameTxt, GroupLayout.PREFERRED_SIZE, 88, GroupLayout.PREFERRED_SIZE).addComponent(bookNumberTxt, GroupLayout.PREFERRED_SIZE, 88, GroupLayout.PREFERRED_SIZE).addComponent(bookTypeJcb, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)).addGap(35).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false).addGroup(groupLayout.createSequentialGroup().addComponent(label1).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED).addComponent(authorTxt, GroupLayout.PREFERRED_SIZE, 91, GroupLayout.PREFERRED_SIZE)).addGroup(groupLayout.createSequentialGroup().addComponent(label3).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED).addComponent(priceTxt)))).addComponent(bookDescTxt)).addContainerGap(44, Short.MAX_VALUE))))));groupLayout.setVerticalGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayout.createSequentialGroup().addGap(42).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(label).addComponent(bookNameTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE).addComponent(label1).addComponent(authorTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)).addGap(29).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(label2).addComponent(bookNumberTxt).addComponent(label3).addComponent(priceTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)).addGap(33).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(label5).addComponent(bookTypeJcb, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)).addGap(30).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(label4).addComponent(bookDescTxt, GroupLayout.PREFERRED_SIZE, 137, GroupLayout.PREFERRED_SIZE)).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 37, Short.MAX_VALUE).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(button).addComponent(button1)).addGap(42)));getContentPane().setLayout(groupLayout);/** 设置文本域边框*/bookDescTxt.setBorder(new LineBorder(new java.awt.Color(127,157,185), 1, false));fillBookType();}/*** 重置事件处理* @param e event*/private void resetValueActionPerformed(ActionEvent e) {this.resetValue();}/*** 图书添加事件处理* @param event event*/private void bookAddActionPerformed(ActionEvent event) {String bookName = this.bookNameTxt.getText();String author = this.authorTxt.getText();String price = this.priceTxt.getText();String bookDesc = this.bookDescTxt.getText();if(bookName == null || "".equals(bookName.trim())){JOptionPane.showMessageDialog(null, "图书名称不能为空");return;}if(author == null || "".equals(author.trim())){JOptionPane.showMessageDialog(null, "图书作者不能为空");return;}if(price == null || "".equals(price.trim())){JOptionPane.showMessageDialog(null, "图书价格不能为空");return;}String bookNumber = bookNumberTxt.getText();int numberOfBook = bookNumber.isEmpty() ? 0 : Integer.parseInt(bookNumber);BookType bookType = (BookType) bookTypeJcb.getSelectedItem();int bookTypeId = bookType.getId();Book book = new Book(bookName,author, numberOfBook, Float.parseFloat(price) , bookTypeId, bookDesc);Connection con = null;try{con = dbUtil.getConnection();int addNum = bookDao.add(con, book);if(addNum == 1){JOptionPane.showMessageDialog(null, "图书添加成功");resetValue();}else{JOptionPane.showMessageDialog(null, "图书添加失败");}}catch(Exception e){e.printStackTrace();JOptionPane.showMessageDialog(null, "图书添加失败");}finally{try {dbUtil.closeConnection(con);} catch (Exception e) {e.printStackTrace();}}}/*** 重置表单*/private void resetValue(){this.bookNameTxt.setText("");this.authorTxt.setText("");this.priceTxt.setText("");this.bookNumberTxt.setText("");this.bookDescTxt.setText("");if(this.bookTypeJcb.getItemCount()>0){this.bookTypeJcb.setSelectedIndex(0);}}/*** 初始化图书类别下拉框*/private void fillBookType(){Connection con = null;BookType bookType = null;try{con = dbUtil.getConnection();ResultSet rs = bookTypeDao.list(con, new BookType());while(rs.next()){bookType = new BookType();bookType.setId(rs.getInt("id"));bookType.setBookTypeName(rs.getString("bookTypeName"));this.bookTypeJcb.addItem(bookType);}}catch(Exception e){e.printStackTrace();}finally{Logger.getGlobal().info("finished!");}}
}
5.Login
package view;import dao.UserDao;
import entity.User;
import utils.DBUtil;import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.FontUIResource;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.sql.Connection;
import java.util.Enumeration;
import java.util.Objects;/*** BookManagementSystem* 登录界面** @author PlutoCtx* @version 2024/5/26 8:17* @email ctx195467@163.com* @since JDK17*/public class Login extends JFrame {private JPanel contentPane;private final JTextField userNameText;private final JPasswordField passwordText;private final DBUtil dbUtil = new DBUtil();private final UserDao userDao = new UserDao();/*** Create the frame*/public Login(){//改变系统默认字体Font font = new Font("Dialog", Font.PLAIN, 12);Enumeration<Object> keys = UIManager.getDefaults().keys();while (keys.hasMoreElements()){Object key = keys.nextElement();Object value = UIManager.get(key);if (value instanceof FontUIResource){UIManager.put(key, font);}}setResizable(false);// 用户登录setTitle("用户登录");setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);setBounds(500,250,450,343);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5,5,5,5));setContentPane(contentPane);JLabel lblNewLabel = new JLabel("图书管理系统");lblNewLabel.setFont(new Font("宋体", Font.BOLD, 23));lblNewLabel.setIcon(new ImageIcon(Objects.requireNonNull(getClass().getResource("/logo.png"))));JLabel lblNewLabel1 = new JLabel("用户名:");lblNewLabel1.setIcon(new ImageIcon(Objects.requireNonNull(getClass().getResource("/userName.png"))));JLabel lblNewLabel2 = new JLabel("密 码:");lblNewLabel2.setIcon(new ImageIcon(Objects.requireNonNull(getClass().getResource("/password.png"))));userNameText = new JTextField();userNameText.setColumns(10);passwordText = new JPasswordField();JButton btnNewButton1 = new JButton("登录");btnNewButton1.addActionListener(this::loginActionPerformed);btnNewButton1.setIcon(new ImageIcon(Objects.requireNonNull(getClass().getResource("/login.png"))));JButton btnNewButton2 = new JButton("重置");btnNewButton2.addActionListener(this::resetValueActionPerformed);btnNewButton2.setIcon(new ImageIcon(Objects.requireNonNull(getClass().getResource("/reset.png"))));GroupLayout groupLayoutContentPane = new GroupLayout(contentPane);groupLayoutContentPane.setHorizontalGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayoutContentPane.createSequentialGroup().addGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayoutContentPane.createSequentialGroup().addGap(111).addComponent(lblNewLabel)).addGroup(groupLayoutContentPane.createSequentialGroup().addGap(101).addGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(lblNewLabel1).addComponent(lblNewLabel2).addComponent(btnNewButton1)).addGap(32).addGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(btnNewButton2).addGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.LEADING, false).addComponent(passwordText).addComponent(userNameText, GroupLayout.DEFAULT_SIZE, 128, Short.MAX_VALUE))))).addContainerGap(111, Short.MAX_VALUE)));groupLayoutContentPane.setVerticalGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayoutContentPane.createSequentialGroup().addGap(30).addComponent(lblNewLabel).addGap(26).addGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayoutContentPane.createSequentialGroup().addComponent(lblNewLabel1).addGap(29).addGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(lblNewLabel2).addComponent(passwordText, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))).addComponent(userNameText, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)).addGap(36).addGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(btnNewButton1).addComponent(btnNewButton2)).addContainerGap(60, Short.MAX_VALUE)));contentPane.setLayout(groupLayoutContentPane);// 居中this.setLocationRelativeTo(null);}/*** 登录事件处理* @param evt action*/private void loginActionPerformed(ActionEvent evt) {String userName = this.userNameText.getText();String password = new String(this.passwordText.getPassword());if (userName == null || userName.equals("")){JOptionPane.showMessageDialog(null, "用户名不能为空");return;}if (password == null || password.equals("")){JOptionPane.showMessageDialog(null, "密码不能为空");return;}// 调用dao层方法User user = new User(userName, password);Connection con = null;try {con = dbUtil.getConnection();User currentUser = userDao.login(con, user);if (currentUser != null){dispose();if (currentUser.getStatus() == 1) {new AdminMainFrame(currentUser).setVisible(true);JOptionPane.showMessageDialog(null, "登录成功");} else {new UserMainFrame(currentUser).setVisible(true);JOptionPane.showMessageDialog(null, "登录成功");}}else {JOptionPane.showMessageDialog(null, "用户名或密码错误");}} catch (Exception e) {e.printStackTrace();}finally {try {dbUtil.closeConnection(con);}catch (Exception e){e.printStackTrace();}}}/*** 重置事件处理* @param evt action*/private void resetValueActionPerformed(ActionEvent evt){this.userNameText.setText("");this.passwordText.setText("");}}
三、配置
1、idea直接导入解压文件夹
2、打开navicat等数据库可视化软件,运行sql文件夹下的数据库文件
3、修改DBUtil.java中的用户名、连接、密码(如果有必要的话)
4、运行Main
如有购买需求,请移步到 面包多 进行购买,CSDN的收费太黑了
面包多中提供了几种不同的版本代码:
- JavaSwing+MySQL图书管理系统 有数据库版,提供MySQL支持,数据能够实现增删改查
- JavaSwing+MySQL图书管理系统 无数据库版,仅提供界面和部分鼠标点击事件,数据内容无法被修改
- JavaSwing+MySQL图书借阅管理系统 有数据库版,提供MySQL支持,数据能够实现增删改查