图书馆管理系统(数据库版)

图书馆管理系统(数据库版)

由于之前那次的图书馆管理系统是只使用了I/O进行数据的交互,所以在学习完数据库与JDBC后便开始了对图书馆管理系统的重构,完成了这版利用MySQL数据库存储数据的图书馆管理系统。



项目框架

项目框架

具体要求与上次的项目一样,这次只是利用所学的数据库知识和三层架构来构建项目。


项目分包

项目分包

符合三层架构思想,利用SSM框架,分为dao(数据访问层)、entity(实体层)、service(服务层)、util(工具类)、view(视图层)。


数据库表

建立四张表
四张表
admin表,存放管理员的信息
admin表
books表,存放书籍信息
books表
borrow表,存放借还数时间,也是日志表
borrow表
user表,存放用户个人信息
user表
这是MySQL的建表SQL语句,可以直接导入

/*
 Navicat MySQL Data Transfer

 Source Server         : LibrarySystemGit_Download
 Source Server Type    : MySQL
 Source Server Version : 80024
 Source Host           : localhost:3306
 Source Schema         : db_books

 Target Server Type    : MySQL
 Target Server Version : 80024
 File Encoding         : 65001

 Date: 29/06/2021 15:54:38
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for db_admin
-- ----------------------------
DROP TABLE IF EXISTS `db_admin`;
CREATE TABLE `db_admin`  (
  `admin_id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `admin_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  PRIMARY KEY (`admin_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of db_admin
-- ----------------------------
INSERT INTO `db_admin` VALUES (1, 'root', 'root');

-- ----------------------------
-- Table structure for db_books
-- ----------------------------
DROP TABLE IF EXISTS `db_books`;
CREATE TABLE `db_books`  (
  `book_id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `ISBN` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `book_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `book_price` decimal(10, 2) NULL DEFAULT NULL,
  `book_author` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `published_house` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `book_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `book_state` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '未借出',
  PRIMARY KEY (`book_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of db_books
-- ----------------------------
INSERT INTO `db_books` VALUES (1, '978-7-100-10618-4', '《如何阅读一本书》', 56.00, '(美) 莫提默·J. 艾德勒, 查尔斯·范多伦', '商务印书馆', '教育', '未借出');
INSERT INTO `db_books` VALUES (2, '978-7-111-29544-0', '《设计模式之禅》', 69.00, '秦小波', '机械工业出版社', '教育', '未借出');
INSERT INTO `db_books` VALUES (3, '978-7-115-21687-8', '《代码整洁之道》', 59.00, '(美)Robert C. Martin', '人民邮电出版社', '教育', '未借出');
INSERT INTO `db_books` VALUES (4, '978-7-300-11134-6', '《金融学》', 59.00, '兹维·博迪', '中国人民大学出版社', '教育', '未借出');
INSERT INTO `db_books` VALUES (5, '978-7-302-23755-6', '《Java程序设计实践教程》', 36.00, '颜志军, 栾媛媛', '人民邮电出版社', '教育', '未借出');
INSERT INTO `db_books` VALUES (6, '978-7-302-27544-2', '《C语言程序设计》', 29.00, '李爱玲', '机械工业出版社', '教育', '未借出');
INSERT INTO `db_books` VALUES (7, '978-7-302-29391-0', '《网络安全技术》', 34.50, '曾湘黔', '清华大学出版社', '教育', '未借出');
INSERT INTO `db_books` VALUES (8, '978-7-5117-0157-2', '《傲慢与偏见》', 16.00, '(英) 简·奥斯汀', '中央编译出版社', '外国文学', '未借出');
INSERT INTO `db_books` VALUES (9, '978-7-5327-5110-5', '《悲惨世界》', 58.00, '(法)雨果', '上海译文出版社', '外国文学', '未借出');
INSERT INTO `db_books` VALUES (10, '978-7-5399-3321-4', '《纳兰容若词传》', 28.50, '苏缨, 毛晓雯, 夏如意', '江苏文艺出版社', '人物传记', '未借出');
INSERT INTO `db_books` VALUES (11, '978-7-5399-5488-2', '《瓦尔登湖 : 梭罗散文选》', 34.00, '(美) 梭罗', '江苏文艺出版社', '外国文学', '未借出');
INSERT INTO `db_books` VALUES (12, '978-7-5101-3674-0', '《三国演义》', 23.00, '(明) 罗贯中', '人民文学出版社', '古典名著', '未借出');
INSERT INTO `db_books` VALUES (13, '978-7-0200-1501-6', '《水浒传》', 15.75, '(明) 施耐庵', '人民文学出版社', '古典名著', '未借出');
INSERT INTO `db_books` VALUES (14, '978-7-0200-0220-7', '《红楼梦》', 59.70, '(清) 曹雪芹', '人民文学出版社', '古典名著', '未借出');
INSERT INTO `db_books` VALUES (15, '978-7-1011-0452-3', '《西游记》', 80.00, '(明) 吴承恩', '中华书局', '古典名著', '未借出');

-- ----------------------------
-- Table structure for db_borrow
-- ----------------------------
DROP TABLE IF EXISTS `db_borrow`;
CREATE TABLE `db_borrow`  (
  `borrow_id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `book_id` int NOT NULL,
  `user_id` int NOT NULL,
  `borrow_time` date NOT NULL,
  `return_time` date NULL DEFAULT NULL,
  PRIMARY KEY (`borrow_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of db_borrow
-- ----------------------------

-- ----------------------------
-- Table structure for db_user
-- ----------------------------
DROP TABLE IF EXISTS `db_user`;
CREATE TABLE `db_user`  (
  `user_id` int UNSIGNED NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `sex` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '男',
  `phonenumber` bigint(11) UNSIGNED ZEROFILL NULL DEFAULT NULL,
  `type` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '学生',
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of db_user
-- ----------------------------
INSERT INTO `db_user` VALUES (1, '张三', '123456', '男', NULL, '学生');

SET FOREIGN_KEY_CHECKS = 1;


自我认为好用的一些方法

手机号码判断

传入用户输入的手机号码,判断手机号码是否符合十一位的格式,返回Boolean格式

//电话判断方法
    public static boolean validateMobilePhone(String in) {
        Pattern pattern = Pattern.compile("^[1]\\d{10}$");
        return pattern.matcher(in).matches();
    }

//电话号码判断使用
System.out.println("请输入您的电话(电话号码为11位):");
        String phone = scanner.next();
        while (!validateMobilePhone(phone)){
            System.out.println("输入错误,请重新输入(电话号码为11位)");
            phone = scanner.next();
        }

int输入类型判断

在控制台菜单选择输入数字时,要做好输入判断,保证输入为数字,所以进行输入类型判断

//int类型输入判断
    public int input() {
        while (!scanner.hasNextInt()) {
            //没有这一行的话会导致无限循环
            String input = scanner.next();
            System.out.println("不是数字,重新输入");
        }//当是数字时循环结束
        int inputNum = scanner.nextInt();

        return inputNum;
    }

//int范围判断
    public int scope(int inputNum,int scope) {
        InputUtils inputUtils = new InputUtils();
        while (true) {
            if (inputNum > scope || inputNum < 1) {
                System.out.println("请输入正确的数字");
                inputNum = inputUtils.input();
            }else {
                break;
            }
        }
        return inputNum;
    }

//上面两个方法可嵌套使用,操作输入判断
    int op = input.scope(input.input(),4);//这样既能判断输入限定为int类型,又可以输入范围限定

书籍ID限定

由于在数据库中,books表的主键是id,所以可以存储多本重复书籍,用id来区分所要借阅的书籍,并在借书时不显示已被借阅的书籍

//书籍Id限定
    public int idLimit(List<Book> books) {
        Scanner scanner = new Scanner(System.in);
        List<Integer> borrowedId = new ArrayList<>();//存放id的集合
        int book_id = 0;//id输入
        boolean flag = true;

        //增强for,遍历集合取出id存放在borrowedId
        for (Book book: books){
            borrowedId.add(book.getBook_id());//借阅书籍Id集合
        }

        while (flag){
            book_id = scanner.nextInt();//输入id,与其对比
            //增强for,遍历并对比输入的id
            for (Integer e : borrowedId){
                if (book_id == e){
                    flag = false;
                }
            }
            if (flag){
                System.out.println("书籍Id输入错误,请重新输入:");
            }
        }

        return book_id;
    }

以上方法肯定还有优化空间,还请大佬有新意见可以来指点我一下,谢谢!


图书馆管理系统项目包已上传,可以直接下载。

代码做过bug的检查,但若是还有bug存在,或是其他问题存在,请在评论区指出,我会尽力修改。

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值