Java實現學生管理系統詳解
學生管理系統(Java版)
前言:這個是大二做的課設(還是學生管理系統…),理論上雖然是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 要求,’沒有事務支持,不能執行更新和刪除操作’。
總結
本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- Java實現學生管理系統詳解流程
- 關於mybatis resulttype 返回值異常的問題
- Mysql數據庫值的添加、修改、刪除及清空操作實例
- 使用Spring Boot Mybatis 搞反向工程的步驟
- MySQL中外鍵的創建、約束以及刪除