首頁 > 軟體

Java實現學生管理系統詳解流程

2022-06-25 14:00:50

學生管理系統

前言:這個是大二做的課設(還是學生管理系統…),理論上雖然是4個人一組一起做的,但是,注意這個“但是”,還是我一個人承擔了所有…程式碼和檔案基本都是我一個人寫的,當初直接肝得吐血,這也是為啥後面的 Web 版部分功能沒有完成的原因。

專案介紹

專案分為一個JavaSwing寫的GUI桌面應用和一個半成品的Web應用,下圖是專案的整體功能結構展示

JavaSwing

JavaSwing這裡使用的是 MyBatis + Spring 的框架組合,後面發現使用 Spring 框架在 Swing 開發的程式上好像是一個錯誤。

另外,JavaSwing 版裡面可能還有一些邏輯上的未知 bug。

功能展示

1、登入模組

2、系統設定模組

3、學生管理模組

學生新增

學生列表

4、班級管理模組

班級新增

班級管理

5、成績管理

成績統計

6、網頁版

點選後可以跳轉到瀏覽器的 http://localhost:8080 網址

使用說明

使用 IDEA 開啟專案,專案的結構如下圖:

啟動專案的話就執行 view 包裡面的 LoginFrm

遇到的問題

使用Spring進行依賴注入遇到的問題

Swing 是 Java 的一個進行 GUI 開發的包,在課設中我使用 Spring 對容器進行管理,但是在使用 Spring 註解進行容器依賴注入的時候出現了一個問題,依賴注入為 null,報錯如下:

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 組態檔寫錯、或者是沒加 @Service 註解等問題之後,我找到了網上的一個解釋,如下:

在多執行緒時使用 @Autowired 總是獲取不到 bean。

原因是:new thread 不在 Spring 容器中,也就無法獲得 Spring 中的 bean 物件

JavaSwing 不是執行緒安全的,專案中一些地方是多執行緒執行的,許多 UI 執行緒在裡面並行執行,所以在這些執行緒裡面使用 Spring 注入失敗,因為它們不是 Spring 管理的執行緒

而Spring在多執行緒的情況下是不允許使用註解注入依賴的,所以我們只能手動get到我們想要的bean物件,程式碼如下:

private final ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
private final AdminService adminService = (AdminServiceImpl)context.getBean("AdminServiceImpl");

其實還可以通過設定執行緒池的方法管理,但是 Swing 我又不太熟,不知道它執行時有哪幾個執行緒。

這個問題是我當初沒想到的,如果我知道的話就不會用 Spring 在Swing 上面了…因為自己每個 view 層的類上都要手動獲取依賴,比其實跟自己使用一個單例模式獲取 MyBatis 的依賴沒啥區別,使用了 Spring 反而更麻煩了一些

Mybatis使用HashMap作為結果集出現的問題

在編寫查詢指定簽到方法的時候,我使用了List<HashMap<String,String>>作為返回值,但是它卻顯示錯誤,第一次是顯示空指標錯誤,然後我設定了一下@Results結果集,如下:

@Results({
@Result(property = "key",column = "attendance_num",jdbcType = JdbcType.INTEGER),
@Result(property = "value",column = "attendance_date",jdbcType = JdbcType.VARCHAR)})

但是它顯示格式轉換錯誤,於是我在控制檯輸出了一下查詢結果,發現結果是這樣的

[{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屬性值對應的是實體類的屬性,但是HashMap裡面的key和vlaue並不能算屬性(是我想錯了),所以此時Mybatis就會自己設定一個屬性名,於是就變成了上面的結果。別問為啥不用xml檔案的形式,當時時間不太夠,就直接貪方便用註解了

解決方法:

將上面的結果值重新處理一下,再賦給HashMap

刪除帶外來鍵關聯的資料時出現的問題

專案中Service層報錯,如下:

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`))

檢視了一下錯誤資訊,問題出在Dao層,一條刪除語句出現問題了,分析了一下原因,發現是設定了外來鍵關聯,這導致我們無法刪除該條資料。

解決方法:

在刪除資料前先設定外來鍵無效,如下:

set foreign_key_checks = 0;

然後此時可以執行刪除語句了

刪除完之後再設定外來鍵有效,如下:

set foreign_key_checks = 1;

這樣就完美地刪除了這條記錄了。

JavaWeb

JavaWeb 這裡使用的是 SpringBoot + Spring Data JPA 的框架組合,頁面是 Thymeleaf 進行資料展示的,頁面上有一個統計頁面使用了 ECharts 進行資料視覺化。

前面說到 Web 是一個半成品,它已經實現了的功能主要有登入、退出登入、、修改密碼、學生管理、班級管理、成績管理的成績統計這幾個功能模組。另外,它用的資料庫和 JavaSwing 版用的是同一個,所以它們之前的資料其實是互通的。

總結:儘管頁面醜了點,但是它可以作為一個模板繼續開發下去。

功能展示

1、登入介面

2、學生管理

學生列表

學生新增

3、班級管理

班級列表

班級新增

4、成績統計

使用說明

專案結構圖:

啟動的話直接進入 DemoApplication 類裡面右鍵啟動就可以了。

遇到的問題

使用JPA更新資料庫時遇到的問題

使用 Spring Data JPA 做 Web 端的持久化層的內容時,遇到了一個錯誤,如下:

Executing an update/delete query

在百度查詢一番之後,發現是 JPA 如果執行 update 或 delete 等操作時,要在 Dao 或者 Service 層加上 @Transactiona l註解,代表這是一個事務級別的操作,這相當於 JPA 的一個使用規範吧,因為 JPA 要求,’沒有事務支援,不能執行更新和刪除操作’。

最後

專案地址如下:

Github 地址:https://github.com/guanchanglong/StudentManagementSystem-Java

到此這篇關於Java實現學生管理系統詳解流程的文章就介紹到這了,更多相關Java學生管理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com