IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Mysql+Idea图书管理系统(项目链接+项目感悟) -> 正文阅读

[Java知识库]Mysql+Idea图书管理系统(项目链接+项目感悟)

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

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

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-10 10:55:44  更:2021-12-10 10:55:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:46:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码