Java實(shí)現(xiàn)學(xué)生管理系統(tǒng)詳解
學(xué)生管理系統(tǒng)(Java版)
前言:這個(gè)是大二做的課設(shè)(還是學(xué)生管理系統(tǒng)…),理論上雖然是4個(gè)人一組一起做的,但是,注意這個(gè)“但是”,還是我一個(gè)人承擔(dān)了所有…代碼和文檔基本都是我一個(gè)人寫的,當(dāng)初直接肝得吐血,這也是為啥后面的 Web 版部分功能沒有完成的原因。
項(xiàng)目介紹
項(xiàng)目分為一個(gè)JavaSwing寫的GUI桌面應(yīng)用和一個(gè)半成品的Web應(yīng)用,下圖是項(xiàng)目的整體功能結(jié)構(gòu)展示
JavaSwing
JavaSwing這里使用的是 MyBatis + Spring 的框架組合,后面發(fā)現(xiàn)使用 Spring 框架在 Swing 開發(fā)的程序上好像是一個(gè)錯(cuò)誤。
另外,JavaSwing 版里面可能還有一些邏輯上的未知 bug。
功能展示(部分)
1、登錄模塊
2、系統(tǒng)設(shè)置模塊
3、學(xué)生管理模塊
學(xué)生添加
學(xué)生列表
4、班級(jí)管理模塊
班級(jí)添加
班級(jí)管理
5、成績(jī)管理
成績(jī)統(tǒng)計(jì)
6、網(wǎng)頁版
點(diǎn)擊后可以跳轉(zhuǎn)到瀏覽器的 http://localhost:8080 網(wǎng)址
使用說明
使用 IDEA 打開項(xiàng)目,項(xiàng)目的結(jié)構(gòu)如下圖:
啟動(dòng)項(xiàng)目的話就運(yùn)行 view 包里面的 LoginFrm
遇到的問題
使用Spring進(jìn)行依賴注入遇到的問題
Swing 是 Java 的一個(gè)進(jìn)行 GUI 開發(fā)的包,在課設(shè)中我使用 Spring 對(duì)容器進(jìn)行管理,但是在使用 Spring 注解進(jìn)行容器依賴注入的時(shí)候出現(xiàn)了一個(gè)問題,依賴注入為 null,報(bào)錯(cuò)如下:
Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at com.view.LoginFrm.loginAct(LoginFrm.java:187)
at com.view.LoginFrm$2.actionPerformed(LoginFrm.java:96)
在百度找了許久沒找到問題所在,排除了 Spring 配置文件寫錯(cuò)、或者是沒加 @Service 注解等問題之后,我找到了網(wǎng)上的一個(gè)解釋,如下:
在多線程時(shí)使用 @Autowired 總是獲取不到 bean。
原因是:new thread 不在 Spring 容器中,也就無法獲得 Spring 中的 bean 對(duì)象
JavaSwing 不是線程安全的,項(xiàng)目中一些地方是多線程運(yùn)行的,許多 UI 線程在里面并發(fā)運(yùn)行,所以在這些線程里面使用 Spring 注入失敗,因?yàn)樗鼈儾皇?Spring 管理的線程
而Spring在多線程的情況下是不允許使用注解注入依賴的,所以我們只能手動(dòng)get到我們想要的bean對(duì)象,代碼如下:
private final ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); private final AdminService adminService = (AdminServiceImpl)context.getBean("AdminServiceImpl");
其實(shí)還可以通過配置線程池的方法管理,但是 Swing 我又不太熟,不知道它運(yùn)行時(shí)有哪幾個(gè)線程。
這個(gè)問題是我當(dāng)初沒想到的,如果我知道的話就不會(huì)用 Spring 在Swing 上面了…因?yàn)樽约好總€(gè) view 層的類上都要手動(dòng)獲取依賴,比其實(shí)跟自己使用一個(gè)單例模式獲取 MyBatis 的依賴沒啥區(qū)別,使用了 Spring 反而更麻煩了一些
Mybatis使用HashMap作為結(jié)果集出現(xiàn)的問題
在編寫查找指定簽到方法的時(shí)候,我使用了List<HashMap<String,String>>作為返回值,但是它卻顯示錯(cuò)誤,第一次是顯示空指針錯(cuò)誤,然后我配置了一下@Results結(jié)果集,如下:
@Results({ @Result(property = "key",column = "attendance_num",jdbcType = JdbcType.INTEGER), @Result(property = "value",column = "attendance_date",jdbcType = JdbcType.VARCHAR)})
但是它顯示格式轉(zhuǎn)換錯(cuò)誤,于是我在控制臺(tái)輸出了一下查詢結(jié)果,發(fā)現(xiàn)結(jié)果是這樣的
[{value=2018-05-17, key=1},
{value=2018-04-17, key=1},
{value=2018-04-18, key=1},
{value=2018-04-19, key=3},
{value=2018-04-20, key=1},
{value=2018-04-21, key=1},
{value=2018-05-03, key=1}]
HashMap里面的值從JSON字符串的形式變成了xxx=xxx的形式,property屬性值對(duì)應(yīng)的是實(shí)體類的屬性,但是HashMap里面的key和vlaue并不能算屬性(是我想錯(cuò)了),所以此時(shí)Mybatis就會(huì)自己設(shè)置一個(gè)屬性名,于是就變成了上面的結(jié)果。別問為啥不用xml文件的形式,當(dāng)時(shí)時(shí)間不太夠,就直接貪方便用注解了
解決方法:
將上面的結(jié)果值重新處理一下,再賦給HashMap
刪除帶外鍵關(guān)聯(lián)的數(shù)據(jù)時(shí)出現(xiàn)的問題
項(xiàng)目中Service層報(bào)錯(cuò),如下:
Cannot delete or update a parent row: a foreign key constraint fails (`ttms`.`s_attendance`, CONSTRAINT `student_attendance_foreign` FOREIGN KEY (`student_id`) REFERENCES `s_student` (`id`)); nested exception is java.sql.SQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails (`ttms`.`s_attendance`, CONSTRAINT `student_attendance_foreign` FOREIGN KEY (`student_id`) REFERENCES `s_student` (`id`))
查看了一下錯(cuò)誤信息,問題出在Dao層,一條刪除語句出現(xiàn)問題了,分析了一下原因,發(fā)現(xiàn)是設(shè)置了外鍵關(guān)聯(lián),這導(dǎo)致我們無法刪除該條數(shù)據(jù)。
解決方法:
在刪除數(shù)據(jù)前先設(shè)置外鍵無效,如下:
set foreign_key_checks = 0;
然后此時(shí)可以執(zhí)行刪除語句了
刪除完之后再設(shè)置外鍵有效,如下:
set foreign_key_checks = 1;
這樣就完美地刪除了這條記錄了。
JavaWeb
JavaWeb 這里使用的是 SpringBoot + Spring Data JPA 的框架組合,頁面是 Thymeleaf 進(jìn)行數(shù)據(jù)展示的,頁面上有一個(gè)統(tǒng)計(jì)頁面使用了 ECharts 進(jìn)行數(shù)據(jù)可視化。
前面說到 Web 是一個(gè)半成品,它已經(jīng)實(shí)現(xiàn)了的功能主要有登錄、退出登錄、、修改密碼、學(xué)生管理、班級(jí)管理、成績(jī)管理的成績(jī)統(tǒng)計(jì)這幾個(gè)功能模塊。另外,它用的數(shù)據(jù)庫和 JavaSwing 版用的是同一個(gè),所以它們之前的數(shù)據(jù)其實(shí)是互通的。
總結(jié):盡管頁面丑了點(diǎn),但是它可以作為一個(gè)模板繼續(xù)開發(fā)下去。
功能展示(部分)
1、登錄界面
2、學(xué)生管理
學(xué)生列表
學(xué)生添加
3、班級(jí)管理
班級(jí)列表
班級(jí)添加
4、成績(jī)統(tǒng)計(jì)
使用說明
項(xiàng)目結(jié)構(gòu)圖:
啟動(dòng)的話直接進(jìn)入 DemoApplication
類里面右鍵啟動(dòng)就可以了。
遇到的問題
使用JPA更新數(shù)據(jù)庫時(shí)遇到的問題
使用 Spring Data JPA 做 Web 端的持久化層的內(nèi)容時(shí),遇到了一個(gè)錯(cuò)誤,如下:
Executing an update/delete query
在百度查找一番之后,發(fā)現(xiàn)是 JPA 如果執(zhí)行 update 或 delete 等操作時(shí),要在 Dao 或者 Service 層加上 @Transactiona l注解,代表這是一個(gè)事務(wù)級(jí)別的操作,這相當(dāng)于 JPA 的一個(gè)使用規(guī)范吧,因?yàn)?JPA 要求,'沒有事務(wù)支持,不能執(zhí)行更新和刪除操作'。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
- Java+Mysql學(xué)生管理系統(tǒng)源碼
- java學(xué)生管理系統(tǒng)界面簡(jiǎn)單實(shí)現(xiàn)(全)
- Java基于MySQL實(shí)現(xiàn)學(xué)生管理系統(tǒng)
- 簡(jiǎn)單實(shí)現(xiàn)Java版學(xué)生管理系統(tǒng)
- Java實(shí)現(xiàn)學(xué)生管理系統(tǒng)
- java實(shí)現(xiàn)學(xué)生管理系統(tǒng)(面向?qū)ο?
- java設(shè)計(jì)簡(jiǎn)單學(xué)生管理系統(tǒng)
- java實(shí)現(xiàn)簡(jiǎn)單學(xué)生管理系統(tǒng)項(xiàng)目
- java基于jdbc實(shí)現(xiàn)簡(jiǎn)單學(xué)生管理系統(tǒng)
- springboot實(shí)現(xiàn)學(xué)生管理系統(tǒng)
相關(guān)文章
spring framework體系結(jié)構(gòu)及模塊jar依賴關(guān)系詳解
在本篇文章里小編給大家整理的是關(guān)于spring framework體系結(jié)構(gòu)及模塊jar依賴關(guān)系,對(duì)此有興趣的朋友們可以學(xué)習(xí)下。2019-09-09Java中的有限狀態(tài)機(jī)(設(shè)計(jì)模式——狀態(tài)模式)
這篇文章主要介紹了Java中的有限狀態(tài)機(jī)(設(shè)計(jì)模式——狀態(tài)模式),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Java定時(shí)器通信協(xié)議管理模塊Timer詳解
這篇文章主要介紹了Java定時(shí)器通信協(xié)議管理模塊Timer,?Timer一般指定時(shí)器(通信協(xié)議管理模塊)人類最早使用的定時(shí)工具是沙漏或水漏,但在鐘表誕生發(fā)展成熟之后,人們開始嘗試使用這種全新的計(jì)時(shí)工具來改進(jìn)定時(shí)器,達(dá)到準(zhǔn)確控制時(shí)間的目的2022-08-08Spring Boot Event Bus用法小結(jié)
Spring Boot Event Bus是Spring框架中事件驅(qū)動(dòng)編程的一部分,本文主要介紹了Spring Boot Event Bus用法小結(jié),感興趣的可以了解一下2023-09-09Spring MVC數(shù)據(jù)綁定概述及原理詳解
這篇文章主要介紹了Spring MVC數(shù)據(jù)綁定概述及原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Java對(duì)象創(chuàng)建內(nèi)存案例解析
這篇文章主要介紹了Java對(duì)象創(chuàng)建內(nèi)存案例解析,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08