Java图书管理系统,课程设计必用(源码+文档)

Java图书管理系统,课程设计必用(源码+文档)”是一款Java语言编写的图书管理系统,它拥有完整的源码和开发文档,可供学生们作为课程设计的参考资料。下面将详细讲解该系统的开发和使用过程。

功能介绍

该系统主要实现了图书管理系统的基本功能,包括图书的添加、修改、删除和查询,读者的注册、借阅、归还和查询,管理员的登录和注销等。此外,该系统还实现了权限管理和数据统计功能,使管理员能够更加方便地管理图书馆。

开发环境

  • 操作系统:Windows 10
  • Java版本:jdk1.8.0_201
  • 数据库:MySQL 5.7.26
  • 开发工具:Eclipse 2019-03
  • 项目构建工具:Maven

开发过程

1. 数据库设计

该系统需要用到一个数据库来存储图书、读者和管理员的信息。下面是数据库设计:

CREATE TABLE `book` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `author` varchar(100) NOT NULL,
  `publisher` varchar(100) NOT NULL,
  `price` float(10,2) NOT NULL,
  `num` int(11) NOT NULL,
  `total` int(11) NOT NULL,
  `intro` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `reader` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `sex` varchar(10) NOT NULL,
  `birth` date NOT NULL,
  `address` varchar(100) NOT NULL,
  `tel` varchar(20) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `admin` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `borrow` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `bookId` int(11) NOT NULL,
  `readerId` int(11) NOT NULL,
  `borrowDate` date NOT NULL,
  `returnDate` date DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `bookId` (`bookId`),
  KEY `readerId` (`readerId`),
  CONSTRAINT `borrow_ibfk_1` FOREIGN KEY (`bookId`) REFERENCES `book` (`id`),
  CONSTRAINT `borrow_ibfk_2` FOREIGN KEY (`readerId`) REFERENCES `reader` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2. 系统架构

系统采用MVC架构,分为数据模型、控制器和用户界面三部分。其中数据模型负责与数据库中的表进行交互,控制器负责将用户界面与数据模型联系起来,并实现系统的具体功能,用户界面则提供给用户进行操作的界面。

3. 实现代码

系统的具体实现涉及到很多代码,包括数据模型的实现、控制器的实现和用户界面的实现。这里只介绍部分代码,具体代码可参考源码。

3.1 数据模型

数据模型包括对数据库表的操作以及相关bean的定义。下面是Book表对应的bean定义和相关操作:

public class Book {
  private Integer id;
  private String name;
  private String author;
  private String publisher;
  private Float price;
  private Integer num;
  private Integer total;
  private String intro;
  //省略getter和setter方法
}

public class BookDao {
  //添加图书
  public boolean addBook(Book book) {
    String sql = "insert into book(name, author, publisher, price, num, total, intro) values(?,?,?,?,?,?,?)";
    return JDBCUtil.executeUpdate(sql, book.getName(), book.getAuthor(), book.getPublisher(), book.getPrice(), book.getNum(), book.getTotal(), book.getIntro());
  }
  //修改图书信息
  public boolean modifyBook(Book book) {
    String sql = "update book set name=?, author=?, publisher=?, price=?, num=?, total=?, intro=? where id=?";
    return JDBCUtil.executeUpdate(sql, book.getName(), book.getAuthor(), book.getPublisher(), book.getPrice(), book.getNum(), book.getTotal(), book.getIntro(), book.getId());
  }
  //删除图书
  public boolean deleteBook(Integer id) {
    String sql = "delete from book where id=?";
    return JDBCUtil.executeUpdate(sql, id);
  }
  //查询所有图书
  public List<Book> queryAll() {
    String sql = "select * from book";
    return JDBCUtil.executeQuery(sql, Book.class);
  }
  //查询图书总数量
  public Integer getTotalNum() {
    String sql = "select sum(num) from book";
    return JDBCUtil.queryForInt(sql);
  }
  //查询图书总价值
  public Float getTotalPrice() {
    String sql = "select sum(price*total) from book";
    return JDBCUtil.queryForFloat(sql);
  }
  //借出图书
  public boolean lendOut(Integer bookId, Integer readerId) {
    //判断库存数量是否足够
    if (queryById(bookId).getNum() <= 0) {
      return false;
    }
    String sql = "insert into borrow(bookId, readerId, borrowDate) values(?,?,?)";
    boolean flag = JDBCUtil.executeUpdate(sql, bookId, readerId, new Date());
    if (flag) {
      //库存数量减1
      updateNum(bookId, -1);
    }
    return flag;
  }
  //归还图书
  public boolean returnBook(Integer bookId, Integer readerId) {
    String sql = "update borrow set returnDate=? where bookId=? and readerId=? and returnDate is null";
    boolean flag = JDBCUtil.executeUpdate(sql, new Date(), bookId, readerId);
    if (flag) {
      //库存数量加1
      updateNum(bookId, 1);
    }
    return flag;
  }
  //根据图书ID查询图书
  public Book queryById(Integer id) {
    String sql = "select * from book where id=?";
    return JDBCUtil.queryForOne(sql, Book.class, id);
  }
  //更新图书库存数量
  private boolean updateNum(Integer bookId, Integer num) {
    String sql = "update book set num=num+? where id=?";
    return JDBCUtil.executeUpdate(sql, num, bookId);
  }
}

3.2 控制器

控制器实现了系统的具体功能,它负责将用户的操作转化为对数据模型的具体操作,并将结果反馈给用户界面。下面是管理员登录的实现:

public class AdminServiceImpl implements AdminService {
  private AdminDao adminDao = new AdminDao();
  //管理员登录
  public boolean login(String name, String password) {
    Admin admin = adminDao.queryByName(name);
    if (admin == null) {
      //账号不存在
      return false;
    } else if (!admin.getPassword().equals(password)) {
      //密码错误
      return false;
    } else {
      //登录成功
      return true;
    }
  }
}

3.3 用户界面

用户界面提供了便捷的操作界面,使得用户的操作更加方便。下面是管理员登录界面的实现:

public class LoginFrame extends JFrame {
  private JTextField nameField;
  private JPasswordField passwordField;
  //登录按钮
  private ActionListener loginAction = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
      String name = nameField.getText();
      String password = new String(passwordField.getPassword());
      if (name.length() == 0 || password.length() == 0) {
        JOptionPane.showMessageDialog(LoginFrame.this, "用户名或密码不能为空!");
        return;
      }
      AdminService adminService = new AdminServiceImpl();
      if (adminService.login(name, password)) {
        JOptionPane.showMessageDialog(LoginFrame.this, "登录成功!");
        new MainFrame().setVisible(true);
        LoginFrame.this.dispose();
      } else {
        JOptionPane.showMessageDialog(LoginFrame.this, "用户名或密码错误!");
      }
    }
  };
  public LoginFrame() {
    setTitle("管理员登录");
    setSize(300, 200);
    setLocationRelativeTo(null);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //用户名
    JLabel nameLabel = new JLabel("用户名:");
    nameField = new JTextField(20);
    JPanel namePanel = new JPanel();
    namePanel.add(nameLabel);
    namePanel.add(nameField);
    //密码
    JLabel passwordLabel = new JLabel("密码:");
    passwordField = new JPasswordField(20);
    JPanel passwordPanel = new JPanel();
    passwordPanel.add(passwordLabel);
    passwordPanel.add(passwordField);
    //登录按钮
    JButton loginButton = new JButton("登录");
    JPanel buttonPanel = new JPanel();
    buttonPanel.add(loginButton);
    loginButton.addActionListener(loginAction);
    //整合所有组件
    JPanel panel = new JPanel(new GridLayout(3, 1, 5, 5));
    panel.add(namePanel);
    panel.add(passwordPanel);
    panel.add(buttonPanel);
    add(panel);
  }
}

使用说明

该系统可以通过以下步骤进行使用:

  1. 下载并导入源代码到Eclipse。
  2. 创建数据库,并修改/src/main/resources/jdbc.properties中的相关配置。
  3. 运行程序,登录管理员账号,开始进行图书管理。

示例

下面是两个示例,一个是添加图书,一个是借阅图书:

示例1:添加图书

  1. 登录管理员账号。
  2. 在主菜单中选择“添加图书”。
  3. 在弹出的对话框中填写图书信息,点击“确认”。
  4. 图书添加成功,返回主菜单。

示例2:借阅图书

  1. 登录读者账号。
  2. 在主菜单中选择“借阅图书”。
  3. 在弹出的对话框中选择需要借阅的图书,点击“确认借阅”。
  4. 借阅成功,返回主菜单。
阅读剩余 83%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java图书管理系统,课程设计必用(源码+文档) - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java基础教程之类数据与类方法

    下面是关于“Java基础教程之类数据与类方法”的完整攻略: 1.什么是类数据与类方法? 在Java中,类是一个封装数据和方法的概念。类定义了一种抽象数据类型,里面包含了一种或多种数据,并定义了对这些数据的操作方法。在类内部,可以定义两种方法:实例方法和静态方法。而“类数据”和“类方法”常常也被称作“静态数据”和“静态方法”。它们分别属于类本身,而不是类的某个…

    Java 2023年5月23日
    00
  • Spring,hibernate,struts经典面试笔试题(含答案)

    Spring, Hibernate, Struts 经典面试笔试题攻略 Spring、Hibernate、Struts 是 Java Web 开发中常用的三个框架,也是面试中经常被问到的知识点。本文将介绍一些常见的面试笔试题,并提供详细的解答和示例说明。 Spring 面试笔试题 1. 什么是 Spring? Spring 是一个开源的轻量级 Java 开发…

    Java 2023年5月18日
    00
  • Go Java算法之简化路径实例详解

    Go Java算法之简化路径实例详解 本篇文章将详细讲解如何使用Go和Java算法来简化路径。首先,我们需要了解路径简化的定义和目的。 什么是路径简化? 路径简化是将路径中冗余的部分删除,使其变得更短、更干净、更易读。例如,路径”/a/b/c/../d”可以简化为”/a/b/d”。这不仅可以节省存储空间,还可以提高代码的效率。 路径简化的目的 路径简化有多种…

    Java 2023年5月19日
    00
  • 关于Java中你所不知道的Integer详解

    关于Java中你所不知道的Integer详解 前言 Integer是Java的基本数据类型之一,它在我们的日常编码中使用频率很高,但是它背后的一些特性可能并不为人所知,这篇文章将详细讲解。 Integer的使用 在Java中,我们通常会用Integer来表示整数数据类型。Integer的定义方式如下: Integer i = 10; 我们也可以通过下面的方式…

    Java 2023年5月26日
    00
  • 如何将默认的maven仓库改为阿里的maven仓库

    将默认的maven仓库改为阿里的maven仓库,需要在maven的settings.xml文件中进行配置。具体的步骤如下: 找到maven的settings.xml文件 在本地开发机上,maven的settings.xml文件一般位于maven安装目录的conf文件夹下。如果您使用的是IDEA等集成开发环境,则settings.xml文件可能位于IDEA安装…

    Java 2023年5月20日
    00
  • SpringBoot+MyBatis+AOP实现读写分离的示例代码

    这里就详细讲解一下”SpringBoot+MyBatis+AOP实现读写分离”的完整攻略。本文会介绍什么是读写分离,如何使用SpringBoot、Mybatis和AOP实现读写分离,以及两个示例说明。 什么是读写分离 首先,我们需要了解一下什么是读写分离。在高并发的系统中,读取数据库的操作通常是多余写入的操作的。因此,将查询请求分发到只读数据库,减少了对主数…

    Java 2023年5月19日
    00
  • java模拟多线程http请求代码分享

    下面是详细的“java模拟多线程http请求代码分享”的攻略: 1. 如何使用Java模拟http请求 Java模拟http请求的主要方式是通过Java的第三方库Apache HttpClient进行实现。下面是几个常用的示例:1. 发送POST请求: CloseableHttpClient httpClient = HttpClients.createDe…

    Java 2023年5月18日
    00
  • Java中的collection集合类型总结

    Java中的Collection集合类型总结 Collection是Java中常用的一种数据结构,它可以简化我们对数据的操作,提高数据处理的效率。在Java中,集合类型主要分为三大类:List、Set和Map。本文将对这三大类集合类型进行详细总结和说明。 1. List集合类型 List集合类型是有序的、可重复的集合类型。它的实现类主要有ArrayList、…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部