Bootstrap

数据库课程设计:图书借阅管理系统(控制台交互)

问题描述

实现简易版图书借阅管理系统,学生(读者)在系统里可以检索图书,借阅图书,归还图书,修改密码,查看个人借阅信息等功能;

管理员有书籍信息,学生(读者)信息,借阅信息维护等功能

在这里插入图片描述

需求分析

  1. 系统分为管理员账户,学生(读者)账户
  2. 管理员账户可以进行书籍,学生(读者)信息的维护(CRUD)
  3. 学生(读者)账户可以借书,还书,检索图书,个人借阅信息浏览

要点

开发语言:Java (jdk版本12+)

数据库:MySQL (版本8.0+)

工具:JDBC

交互场景:控制台

软件:IDEA(推荐),Navicat

项目构建:maven

数据库设计

实体关系:

image-20220609212959987

数据库表设计:

注意:所有表的主键记得勾上自增

管理员表:

image-20220609213126684

书籍表:

image-20220609213301006

学生表:

image-20220609213230589

借书表:

image-20220609213328973

程序运行效果

学生(读者):


-----------------
   图书管理系统     
   1.学生登录       
   2.管理员登录     
-------------------
请输入身份:1
请输入账号:666
请输入密码:666

登录成功!
---------------
1.借书
2.还书
3.检索
4.退出
---------------
请选择:
1
检索方式:1.书名  2.ISBN码
请选择:
2
请输入图书ISBN:3232
查找结果如下:
id  isbn  书名  作者  出版社  馆藏数量
2  3232  数据库设计  小A  上海出版社  6
-------1.借阅  2.重新输入查询  3.返回------
请选择:1
--借书登记--
借阅成功!
---------------
1.借书
2.还书
3.检索
4.退出
---------------
请选择:
2
----我要还书----
当前借阅记录:
id  isbn  书名  作者  出版社
2  3232  数据库设计  小A  上海出版社
-------1.还书   2.返回------
请选择:2
---------------
1.借书
2.还书
3.检索
4.退出
---------------
请选择:
3
检索方式:1.书名  2.ISBN码
请选择:
1
请输入书名:西游记
--------------------
查找结果如下:
id  isbn  书名  作者  出版社  馆藏数量
1  2132131  西游记  吴承恩  清华  7
-------1.重新输入查询  2.返回------
2
---------------
1.借书
2.还书
3.检索
4.退出
---------------
请选择:

管理员操作:

-----------------
   图书管理系统     
   1.学生登录       
   2.管理员登录     
-------------------
请输入身份:2
请输入账号:admin
请输入密码:admin

登录成功!
--------------
1.学生管理
2.书籍管理
3.图书借阅一览
4.退出
--------------
请选择:
3
学生账号  学生姓名  书ISBN  书名  借出时间  应还时间  
3  3  2132131  西游记  2022-06-08 09:41:43  2022-07-08 09:41:43
666  程序员小李  3232  数据库设计  2022-06-09 09:56:22  2022-07-09 09:56:22
---------------
--------------
1.学生管理
2.书籍管理
3.图书借阅一览
4.退出
--------------
请选择:
3
学生账号  学生姓名  书ISBN  书名  借出时间  应还时间  
3  3  2132131  西游记  2022-06-08 09:41:43  2022-07-08 09:41:43
666  程序员小李  3232  数据库设计  2022-06-09 09:56:22  2022-07-09 09:56:22
---------------
--------------
1.学生管理
2.书籍管理
3.图书借阅一览
4.退出
--------------
请选择:
1
---------------
1.所有学生信息
2.查询学生信息
3.修改学生信息
4.删除学生信息
5.添加学生信息
6.返回
----------------
请选择:
2
请输入学生账号:
666
查询结果如下:
---------------
id 账号  姓名
8 666  程序员小李
---------------
1.所有学生信息
2.查询学生信息
3.修改学生信息
4.删除学生信息
5.添加学生信息
6.返回
----------------
请选择:
1
所有学生信息如下:
id 账号  姓名
1 123456  小红
2 222  小王
4 1  1
6 3  3
7 5  5
8 666  程序员小李
---------------
1.所有学生信息
2.查询学生信息
3.修改学生信息
4.删除学生信息
5.添加学生信息
6.返回
----------------
请选择:
6
--------------
1.学生管理
2.书籍管理
3.图书借阅一览
4.退出
--------------
请选择:
2
----------------
1.所有图书信息
2.添加图书信息
3.删除图书信息
4.修改图书信息
5.返回
----------------
请选择:
1
id  isbn  书名  作者  出版社  馆藏数量
1  2132131  西游记  吴承恩  清华  7
2  3232  数据库设计  小A  上海出版社  5
3  43423423  Java进价  小张  深圳出版社  50
6  5  5  5  8  6
------------
----------------
1.所有图书信息
2.添加图书信息
3.删除图书信息
4.修改图书信息
5.返回
----------------
请选择:
5
--------------
1.学生管理
2.书籍管理
3.图书借阅一览
4.退出
--------------

部分程序

数据库连接工具类

package com.tushu.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class ConnDB {
   // 获取连接通道
   // Connection 
   public static Connection getConnection() {
      Connection conn = null;
      // 1.加载驱动类
      try {
         // Mysql驱动
         Class.forName("com.mysql.cj.jdbc.Driver");
         // 获取连接通道
         String url ="jdbc:mysql://localhost:3306/bm?useSSL=false&serverTimezone=Asia/Shanghai";
         String user = "root";
         String password = "xxxxx";
         conn = DriverManager.getConnection(url,user,password);
      } catch (ClassNotFoundException  e) {
         // 1.类名错误 2.外部jar没有引用
         e.printStackTrace();
      } catch (SQLException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      return conn;
   }
   // 关闭资源
   public  static void closeDB(ResultSet rs,Statement pst,Connection conn) {
      try {
         if(rs!=null) {
            rs.close();
         }
         if(pst!=null) {
            pst.close();
         }
         if(conn!=null) {
            conn.close();
         }
      } catch (SQLException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }
   public static void main(String[] args) {
      System.out.println(ConnDB.getConnection());
   }
}

时间获取工具类

package com.tushu.utils;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class TimeTools {
   public static String  getTime() {
      Date date = new Date();
      SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
      return dateFormat.format(date);
   }
   
   //获取当前时间往后一个月的时间
   public static String  getTime2() {
      Date date = new Date();
      Calendar calendar = Calendar.getInstance();
      calendar.setTime(date);
      calendar.add(Calendar.MONTH, +1);
      SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
      return dateFormat.format(calendar.getTime());
   }
}

CRUD方法封装类

package com.tushu.dao;
import com.tushu.utils.ConnDB;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public abstract class BaseDAO {
   // 共通的增删改方法
      public int update(String sql,Object[] arr) {
         Connection conn = ConnDB.getConnection();
         PreparedStatement pst = null;
         try {
            pst = conn.prepareStatement(sql);
            //对占位符赋值
            for (int i = 0; i < arr.length; i++) {
               pst.setObject(i+1, arr[i]);
            }
            int row = pst.executeUpdate();
            return row;
         } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }finally {
            ConnDB.closeDB(null, pst, conn);
         }
         return 0;
      }
      // 共通查询
      public <T>T select(String sql,Object[] arr){
         Connection conn = ConnDB.getConnection();
         PreparedStatement pst = null;
         ResultSet rs = null;
         T t = null;
         try {
            pst= conn.prepareStatement(sql);
            for (int i = 0; i < arr.length; i++) {
               pst.setObject(i+1, arr[i]);
            }
            rs = pst.executeQuery();
            // 对结果集的收集
            if(rs.next()) {
               // 收集对象的属性
               t = this.rowMapper(rs);
            }
         } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }finally {
            ConnDB.closeDB(null, pst, conn);
         }
         return t;
      }
      // 查询结果集合
      public <T> List<T> selectAll(String sql,Object[] arr){
         List<T> list = new ArrayList<>();
         Connection conn = ConnDB.getConnection();
         PreparedStatement pst = null;
         ResultSet rs = null;
         
         try {
            pst= conn.prepareStatement(sql);
            for (int i = 0; i < arr.length; i++) {
               pst.setObject(i+1, arr[i]);
            }
            rs = pst.executeQuery();
            T t = null;
            // 对结果集的收集
            while(rs.next()) {
               // 收集对象的属性
               t = this.rowMapper(rs);
               // 添加到集合
               list.add(t);
            }
         } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }finally {
            ConnDB.closeDB(null, pst, conn);
         }
         return list;
      }
      // 定义方法  每个查询的结果集获取对应的属性
      public  abstract <T> T rowMapper(ResultSet rs) throws SQLException;
}

篇幅有限,就不在这里展示全部代码了。


源码获取

👉更多项目合集,点我~查看😀

;