MySql+IDEA图书管理系统(Java)

在前面做IO流的图书管理系统面前,总有人说我的图书管理系统不上档次呀,连个数据打开txt文档都看不懂,那今天我们就看看看得懂的图书管理系统。

编写前的一些约定

编号长度都是8位
名称都用10位
设计人名都是10位

图书出版日期、读者注册日期不能更改
图书名称和读者名称不能更改
图书类型和读者类型类中的类型不能修改,每个编号对应一个类型

存在的图书的类型不能删除 √
存在的读者的类型不能删除 √
借了书的读者不能删除 ——>删除时去借阅表里查询
借了的书不能删除 ——>删除时去借阅表里查询
借了书之后书的库存减1 ——>图书类重新创建一个库存减1 的修改方法
读者的可借图书数量不能超过最大值
借阅之前要先判断库存是否大于0
借阅之前要判断最大可借阅数量是否大于0,用count方法

修改读者类型要去类型表判断

代码结果的部分展示

  • 主界面代码总览

请添加图片描述

  • 结果
    请添加图片描述

大家也知道这个代码很长所以这里就给大家提示一些不好写的地方。

CSDN下载链接:https://download.csdn.net/download/qq_43325476/59513006

百度网盘下载链接:https://pan.baidu.com/s/1bgma8mouchbKSRThV_i3Vg
提取码:du31

难点提示

一、入手难

在你每次去尝试一个新的项目时,总会有一些无措,这个时候,你先别慌,看看它的需求,实在不知道怎么办了,先将他的实体类创建出来,因为万事开头难,当你开始之后,你就一个问题一个问题去解决。当然,90%的时间应该花在思考上面,比如,上面的约定,以及定义各个类之间的关系,接口与实现类之间的关系之类的思考。

二、代码优化

其实当我们着手写一个项目时,只要开始写的那一刻开始下定决心,花不了多少时间,更多的时候我们则是在代码优化上面,纳郁闷吧。——下面pier给你说一些小细节,能够更好的优化你的代码;

  • 在定义类中的局部变量时,尽量使用private,这样可以防止我们的变量被别人改变,破坏了他原本的意义。
  • 为类定义相等的方法。当我们在使用==运算符比较两个对象时,我们其实是在检测他们是否有相同的内存地址,而不是直观意义上的相等。所以我们可以选择一个equals方法来实现我们的目标。比如我们在看两个对象是否相等时我们应该选择比较比较他们对应的每一个量的值,方法名的签名应该定义为:public boolean equals(对象对应的类名 对象名),在比较时只要用创建的对象调用该方法,参数就是要比较的对象就好了,然后通过返回值就可以判断两个对象是否是真正意义上的相等。
  • 在比较字符串时:
    • String类,要查看两个字符串是否有相同的值,你必须使用equal方法而不是==。例如字符串s1合s2拥有相同的值,你必须使用equal方法而不是使用==。使用方法s1.equals(s2);
    • 当然我们也可以尝试equalsIgnoreCase。这个方法的行为与equals类似。除了equalsIgnoreCase把同一个字母的大写和小写形式看做相同字母这一点以外,例如,“Hello”和“hello”最后的结果是相同的。
  • 在写好一个类的时候,一定要善用org.junit.Test进行测试,使用方式就是导入这个包,@Test下面在写一个方法调用测试就可以了,这样每一个方法测试,可以让我们最后的代码整合时简易许多。
  • 最后,我在和一些编程不多的人交流时,看他们的代码,往往都是注释很少很少。这个习惯时很不好的,这里可以借鉴一下阿里的编码规范,他的命名方式和注释都是很规范的,他的注释也有比较好看的地方,就比如我的代码界面可以看到方法注释,你就看不到我的注释符”/***/“,这样子,在做代码展示时也是比较好看的。另外,写代码的好处有另外一些:
    • ① 学生(初学者):在我们学习的编程很多,正常都会学的C、C++、Python、Java甚至更多的编程语言,很有可能就是学了这一门忘了那一门,这是一种很正常的现象,我们学校,大一下期学的Java基础,大二没有,直到大三才又有的Java进阶,这个时候,本来就不太精通的我们,基本上一整年没碰,重新拿起,自己以前写的代码都看不懂了。
    • ② 老师:老师的话,其实,大多数老师都有很好的习惯,因为需要给学生看的,哪怕最基础的代码也是写的很仔细的。
    • ③ 工作或工作预备役者:在我们做实际开发时,我们更多的时候是一整个开发团队,你不写注释,难道每一个拿到代码的人,还得去仔细研究研究你前面的代码时干什么的吗?

三、对于年份输入的问题

这个问题看似简单,但在这个项目做的时候,我就发现了一部分难点,因为当我直接用Date时,特输入2099-13-1

他也可以自动转化成2100-1-1,当时我就懵了,这里超过了我当前时间呀,并且输入格式也不对,于是有了下面这一串代码。

代码一:

    /**输入生日*/
    public static String readDate(){
        for(;;) {
            //获得当前时间,声明时间变量
            Calendar calendar = Calendar.getInstance();
            int nowYear = calendar.get(Calendar.YEAR);
            System.out.println("NowYear=" + nowYear);
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入您的出生年份:");
            int year = TSUtility.readInt8();
            while ( year > nowYear || year < nowYear - 130 ) {
                System.out.println("您的年份输入有误,请重新输入您的出生年份:");
                year = TSUtility.readInt8();
                System.out.println("year=" + year);
            }
            int nowMonth = calendar.get(Calendar.MONTH);
            //得到月,但是,月份要加上1
            System.out.println("请输入您的出生月份:");
            int month = TSUtility.readInt4();
            nowMonth = nowMonth + 1;
            while ( true ) {
                if (month <= 12 && month >= 1) {
                    break;
                } else {
                    System.out.println("您的月份输入有误!\n请重新输入您的出生月份:");
                    month = TSUtility.readInt4();
                }
            }
            int day = 0;
            switch ( month ) {
                case 2: {
                    System.out.println("请输入你的日期:");
                    day = TSUtility.readInt4();
                    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
                        while ( day > 29 || day < 1 ) {
                            System.out.println("请重新输入,你的日期输入有误:");
                            day = TSUtility.readInt4();
                        }
                    } else {
                        while ( day > 28 || day < 1 ) {
                            System.out.println("请重新输入,你的日期输入有误:");
                            day = TSUtility.readInt4();
                        }
                    }
                }
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12: {
                    System.out.println("请输入你的日期:");
                    while ( day > 31 || day < 1 ) {
                        day = TSUtility.readInt4();
                    }
                }
                break;
                default: {
                    System.out.println("请输入你的日期:");
                    while ( day > 30 || day < 1 ) {
                        day = TSUtility.readInt4();
                    }
                    break;
                }
            }
            String s = "你的生日为" + year + "年" + month + "月" + day + "日";
            boolean pastDate = isPastDate(s);
            if (pastDate) {
                System.out.println(s);
                return s;
            } else {
                System.out.println("日期输入错误");
            }
        }
    }
    /**判断日期是否超过当前时间*/
     public static boolean isPastDate(String str) {

        boolean flag = false;
        Date nowDate = new Date();
        Date pastDate = null;
        //格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd" ,Locale.CHINA);
        //在日期字符串非空时执行
        if (str != null && !"".equals(str)) {
            try {
                //将字符串转为日期格式,如果此处字符串为非合法日期就会抛出异常。
                pastDate = sdf.parse(str);
                //调用Date里面的before方法来做判断
                flag = pastDate.before(nowDate);
                if (flag) {

                } else {
                    System.out.println("该日期晚于今日");
                }
            } catch ( ParseException e ) {
                System.out.println("日期输入错误:异常信息:"+e.getMessage());
            }
        } else {
            System.out.println("日期参数不可为空");
        }
        return flag;
    }

这一个代码输入不太符合Date所以——改:

代码二:

    //获取Date类的数据
    public static Date readRevertTime() {
        Date n;
        for (; ; ) {
            String str = readKeyBoard(20, false);
            boolean checkDate = check(str);
            boolean pastDate=false;
            if(checkDate) {
                pastDate = isPastDate(str);
                if (pastDate && checkDate) {
                    try {
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                        n = sdf.parse(str);
                        break;
                    } catch ( NumberFormatException | ParseException e ) {
                        System.out.print("日期输入错误,请重新输入:");
                    }
                } else {
                    System.out.print("日期输入错误,请重新输入:");
                }
            }
            else {
                System.out.println("日期格式输入错误,请重新输入!");
            }
        }
        return n;
    }
    
    static boolean check (String str) {
    	//括号内为日期格式,y代表年份,M代表年份中的月份(为避免与小时中的分钟数m冲突,此处用M),d代表月份中的天数
        SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
        try {
        	//此处指定日期/时间解析是否不严格,在true是不严格,false时为严格
            sd.setLenient(false);
            //从给定字符串的开始解析文本,以生成一个日期
            sd.parse(str);
        } catch ( Exception e ) {
            return false;
        }
        return true;
    }

	/**判断日期是否合法*/
    public static boolean isPastDate(String str) {

        boolean flag = false;
        Date nowDate = new Date();
        Date pastDate = null;
        //格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd" ,Locale.CHINA);
        //在日期字符串非空时执行
        if (str != null && !"".equals(str)) {
            try {
                //将字符串转为日期格式,如果此处字符串为非合法日期就会抛出异常。
                pastDate = sdf.parse(str);
                //调用Date里面的before方法来做判断
                flag = pastDate.before(nowDate);
                if (flag) {

                } else {
                    System.out.println("该日期晚于今日");
                }
            } catch ( ParseException e ) {
                System.out.println("日期输入错误:异常信息:"+e.getMessage());
            }
        } else {
            System.out.println("日期参数不可为空");
        }
        return flag;
    }

四、往数据库添加数据时出现乱码

  • 原因一:数据库编码模式未更改——将编码模式更改就可
    请添加图片描述

  • 原因二:IDAE(指你的Java编辑器)格式不统一,下面三个地方都可以更改一下

请添加图片描述

  • 原因三:这是我出错的地方,数据库连接时编码格式不一致,修改你的配置文件,我用的德鲁伊连接数据库,在我的url后面加上了这句话characterEncoding=UTF-8,注意假如你伊欧其他配置信息,请用&连接。

五、在测试时连接次数过多,被拒绝访问

这个就是你配置文件的问题,可以直接将你的除了url,username,password和driverClass以外的配置文件删除就好了。

六、重复调用某一个连接时,连接为null

原因:在你上次使用连接时,连接池关闭,你的连接断开,解决方法,在你每次使用连接时开启,使用完毕后关闭就好了。

Logo

本社区面向用户介绍CSDN开发云部门内部产品使用和产品迭代功能,产品功能迭代和产品建议更透明和便捷

更多推荐