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. 借阅成功,返回主菜单。

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

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

相关文章

  • Java关键字之native详解

    Java关键字之native详解 在Java编程中,native是一个重要的关键字,本文将对其作用和使用进行详细解释。 native关键字的定义和作用 Java语言是一种面向对象的语言,它有自己的类型系统和运行环境。如果我们需要访问某些底层的系统资源,例如操作系统、硬件等,就需要使用native来声明一个本地方法(native method)。 native…

    Java 2023年5月26日
    00
  • sourceTree合并一次提交的内容

    sourceTree合并一次提交的内容 在基于git的开发中,经常遇到不同分支需要合并某一次特定的提交的代码,而不是合并整个代码。 场景:A分支是通用分支,B分支是私有化分支,现在A分支修改了一个通用的功能,需要合并到B分支上,功能在一次提交上。B分支只需要这次提交的代码,对A分支上改动的其他代码都不感兴趣。对此,常规的merge已经不能满足我们的需求。 1…

    Java 2023年4月27日
    00
  • Java eclipse doc文档生成流程解析

    针对Java eclipse doc文档生成流程解析,以下是完整攻略: 1. 准备工作 安装Java Development Kit(JDK):在Oracle官网下载并安装最新版的JDK,配置好环境变量,以便能够在终端执行javac等命令。 安装Eclipse:去Eclipse官网下载并安装最新版的Eclipse,满足Java开发的需要。 2. 配置Ecli…

    Java 2023年5月19日
    00
  • Java如何获取List中的String详解

    我来详细讲解一下怎样获取List中的String。 获取List中的String 方法一:for循环遍历获取 最常见的获取List中的String的方法是通过for循环来遍历List中的每一个String,然后依次获取每个String。下面是示例代码: List<String> list = new ArrayList<String>…

    Java 2023年5月27日
    00
  • mybatis 自定义实现拦截器插件Interceptor示例

    下面是详细讲解“mybatis 自定义实现拦截器插件Interceptor示例”的完整攻略: 什么是MyBatis拦截器? MyBatis 拦截器是一种插件技术,可自定义MyBatis框架自身的行为,是MyBatis框架中的重要组成部分。MyBatis 内置提供了多种拦截器,例如 Executor、StatementHandler 等,每种拦截器都实现了不同…

    Java 2023年5月20日
    00
  • js中几种去掉字串左右空格的方法

    当我们操作字符串时,常常需要将字符串的左右两端空格去掉。在 JavaScript 中,去掉字符串左右空格的方法有多种。下面是几种去掉字符串左右空格的方法的详细攻略: 使用trim()方法 使用 trim() 方法,可以去掉字符串两端的空格,同时该方法还可以去掉字符串两端的所有空白字符(包括空格、制表符、换行符等)。 let str = ‘ hello wor…

    Java 2023年6月15日
    00
  • jQuery 浮动广告实现代码

    下面是详细讲解“jQuery 浮动广告实现代码”的完整攻略。 概述 在网页设计中,广告是常见的一种元素,而浮动广告就是其中比较常见的一种类型。浮动广告指的是在网页中随着用户的滚动而浮动的广告。在这里,我们介绍一种使用 jQuery 实现浮动广告的方法。 实现步骤 步骤1:编写 HTML 结构 首先我们需要编写 HTML 结构,用来容纳我们的广告。在 HTML…

    Java 2023年6月15日
    00
  • idea连接SQL Server数据库的详细图文教程

    下面我来详细讲解“idea连接SQL Server数据库的详细图文教程”的攻略。 准备工作 安装idea 下载安装SQL Server JDBC驱动程序,例如Microsoft官方提供的sqljdbc驱动 连接SQL Server 打开idea,选择菜单栏“File” -> “Data Sources” 在新弹出的窗口中,点击右上角的“+”按钮,选择“…

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