数据库课程设计报告总结
一、課程設(shè)計題目
學(xué)生信息管理系統(tǒng)
二、課程設(shè)計目的
數(shù)據(jù)庫系統(tǒng)課程設(shè)計是為了配合學(xué)習(xí)數(shù)據(jù)庫系統(tǒng)原理及應(yīng)用開發(fā)而設(shè)置的,是將關(guān)系數(shù)據(jù)庫理論知識轉(zhuǎn)化為解決實際問題能力的重要環(huán)節(jié)。數(shù)據(jù)庫系統(tǒng)課程設(shè)計目的在于加深對關(guān)系數(shù)據(jù)庫理論知識的理解,通過使用具體的 DBMS,掌握一種實際的數(shù)據(jù)庫管理系統(tǒng)并掌握其操作技術(shù),熟練掌握使用數(shù)據(jù)庫前端開發(fā)工具(如 VB、 C++、 Java、 JSP、 Delphi、PowerBuilder 等),進一步提高同學(xué)們運用數(shù)據(jù)庫技術(shù)解決實際問題的能力。
學(xué)校每年都有新生入學(xué)、老生畢業(yè),還有其他各種人事變動。如何有效地管理這些學(xué)生的信息,幫助學(xué)校和老師掌握學(xué)生的情況,這就是學(xué)生信息管理系統(tǒng)需要完成的功能。
關(guān)于本系統(tǒng)的設(shè)計,筆者出于對以下幾點的考慮,最終敲定設(shè)計的課題為學(xué)生信息管理系統(tǒng):
每個學(xué)校每個學(xué)院都有學(xué)生信息管理系統(tǒng),目的是對每年入學(xué)退學(xué)轉(zhuǎn)學(xué)、獲得各項獎勵、獲得各種處分、的學(xué)生基本信息的管理,目前隨著計算機的普及,使用紙質(zhì)檔表格記錄學(xué)生信息的方式已經(jīng)落伍,原因之一是紙質(zhì)檔難以實現(xiàn)對學(xué)生信息的刪除,修改次數(shù)頻繁也會使得紙質(zhì)檔不清晰,無法實現(xiàn)學(xué)生信息的快捷查詢,原因之二是當紙質(zhì)檔學(xué)生信息冊只有一份時,教師修改學(xué)生信息數(shù)據(jù)時需要相互傳閱,麻煩耗時;當紙質(zhì)學(xué)生信息冊有多份時,教師僅僅有權(quán)限實現(xiàn)對本班學(xué)生信息的修改,學(xué)院需要統(tǒng)計各班的學(xué)生信息情況,而這會導(dǎo)致最終學(xué)期匯總時的工作量巨大?;谝陨显?#xff0c;學(xué)生信息管理系統(tǒng)的開發(fā)和設(shè)計十分有必要,考慮到這些因素,筆者最終敲定設(shè)計的課題為學(xué)生信息管理系統(tǒng)。
三、總體設(shè)計
3.1 實驗要求
本系統(tǒng)主要的功能是收集學(xué)生的個人信息,以便向教師提供每個學(xué)生在校的情況。
系統(tǒng)的主要功能有:
1、學(xué)生個人信息輸入,包括:姓名、性別、院系、生日、籍貫、生源所在地;
2、學(xué)生流動情況的輸入,包括:轉(zhuǎn)系、休學(xué)、復(fù)學(xué)、退學(xué)、畢業(yè);
3、獎懲情況的輸入;
4、學(xué)生個人情況查詢和修改,包括流動情況和獎罰情況。
系統(tǒng)功能概念模型:
3.2 本系統(tǒng)所運用到技術(shù)棧
版本控制系統(tǒng):Git
數(shù)據(jù)庫技術(shù):MySql
后端技術(shù):JavaBean、JavaSwing
3.3 本系統(tǒng)所運用到的編程工具
代碼編寫:Eclipse
數(shù)據(jù)庫圖形化管理工具:Navicat for MySQL
前端頁面設(shè)計插件:windowBuilder
代碼托管服務(wù):gitee
3.4 核心技術(shù)介紹
Mysql:MySQL 是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典 MySQL AB 公司開發(fā),目前屬于 Oracle 公司。MySQL 是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。
windowBuilder:windowBuilder是一個工作在Eclipse IDE下的可視化的窗體設(shè)計插件,利用它,通過拖拽、直接屬性設(shè)置等交互式的設(shè)計方式,自動生成所見即所得的界面所需要的Java代碼,從而高效地完成Java GUI程序的圖形用戶界面的設(shè)計。在復(fù)雜的GUI界面設(shè)計上,它將顯著提高開發(fā)效率,事半功倍。
Git:Git 是一個免費并且開源的分布式版本控制系統(tǒng),旨在快速高效地處理從小到大所有項目的版本管理。Git 非常容易學(xué)習(xí),低植入,高性能。因為擁有輕量的本地分支,易用的暫存區(qū),和多工作流的特點,它超越了類似Subversion, CVS,Perforce和ClearCase的其他的 SCM 工具。簡潔來說,Git是一個分布式版本控制系統(tǒng)。
3.5 模塊介紹
數(shù)據(jù)庫表設(shè)計:
學(xué)生基本信息表
學(xué)生獎勵代碼表
學(xué)生獎勵信息表
老師注冊表
學(xué)生注冊表
學(xué)生懲罰信息表
學(xué)生懲罰代碼表
學(xué)生學(xué)籍變更信息表
學(xué)生學(xué)籍信息變更代碼表
登錄模塊:
學(xué)生首頁模塊:
修改密碼模塊:
學(xué)生實名認證模塊:
學(xué)生基本信息模塊:
老師首頁模塊:
老師操作學(xué)生學(xué)籍信息模塊:
老師錄入學(xué)生獎勵信息模塊:
老師錄入學(xué)生處罰信息模塊:
老師查詢學(xué)生信息模塊:
3.6 設(shè)計步驟
1、在Eclipse中安裝windowBuilder插件,并創(chuàng)建WindowBuilder工程項目。
2、在Maven官網(wǎng)下載jar包并導(dǎo)入工程。
3、打開Swing Design插件設(shè)計前端登錄頁面,并完成基本的注冊和退出系統(tǒng)的后端功能。
4、設(shè)計學(xué)生系統(tǒng)首頁和老師系統(tǒng)首頁,并完成登錄模塊的登錄和重置輸入的后端功能。
5、設(shè)計并實現(xiàn)修改密碼、返回登錄窗口、學(xué)生信息實名認證的后端功能。
6、設(shè)計并實現(xiàn)老師系統(tǒng)中錄入學(xué)生學(xué)籍變更、獎勵記錄、處分記錄的后端功能。
7、設(shè)計并實現(xiàn)老師系統(tǒng)中查詢學(xué)生信息的頁面及按鈕的后端功能。
8、設(shè)計并實現(xiàn)學(xué)生系統(tǒng)中查詢自己學(xué)籍變更、獎勵記錄和處罰記錄的后端功能。
四、詳細設(shè)計
4.1 項目資源目錄介紹
4.2 關(guān)鍵代碼介紹
4.2.1 安裝windowBuilder插件,并創(chuàng)建WindowBuilder工程項目
查看eclipse版本,在eclipse官網(wǎng)中找到與之相匹配的windowBuilder插件版本,復(fù)制對應(yīng)的插件版本下載鏈接。在eclipse中點擊Help中的Install New Software進入界面后,點擊Add,將之前復(fù)制過的插件下載鏈接粘貼到Location輸入框中,Name中填寫windowBuilder(隨便填,不填都可以),點擊OK。點擊Select All,點擊Next,一路Next,后點擊接受條約點擊Finish,然后等待安裝成功,重啟Eclipse。
重啟Eclipse后,新建工程,點擊New-other,選擇WindowBuilder-Swing Designer中的JFrame,點擊Next,輸入類名后點擊Finish。在項目實體類中點擊左下角的Design按鈕,進行頁面設(shè)計。
4.2.2 在Maven官網(wǎng)下載jar包并導(dǎo)入工程
打開Maven倉庫,搜索需要的jar包名稱,點擊所需版本的jar包之后,點擊Files欄中的jar按鈕,進入jar包的下載。將下載的jar包拷貝到項目的libs目錄下,點擊Project-properties,進入界面后點擊Java Build Path,選擇Libraries欄,點擊Add JARs…選擇libs目錄下剛添加進去的jar包,點擊OK后完成。如圖4-3所示。
4.2.3設(shè)計前端登錄頁面,并完成注冊和退出系統(tǒng)的后端功能
前端頁面的設(shè)計依賴于windowBuilder插件,在Designer設(shè)計頁面設(shè)置布局后拖拽組件,在Desigen頁面對應(yīng)的java文件中會自動生成Javaswing代碼,此處展示登錄頁面的部分Javaswing代碼,之后不再展示前端代碼:
//登錄按鈕板塊 Login = new JFrame(); login.setBounds(100, 100, 849, 598); login.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); login.setLocationRelativeTo(null);//將登錄界面置于屏幕中間 JButton button_login = new JButton("\u767B\u5F55"); button_login.setBounds(430, 506, 94, 33); button_login.setFont(new Font("微軟雅黑 Light", Font.BOLD, 17));從登錄模塊點擊注冊按鈕后跳轉(zhuǎn)到注冊按鈕,直接退出登錄窗口,打開注冊窗口即可,注冊按鈕實現(xiàn)的后端代碼如下:
button_register.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {new register_frame().main(null);//打開注冊login.dispose();//關(guān)閉登錄窗口} });登錄頁面跳轉(zhuǎn)到注冊頁面后,用戶設(shè)置用戶名和新密碼,以及確認新密碼,獲取用戶輸入的數(shù)據(jù),通過所有判斷條件后調(diào)用sqlUpdate實體類中的方法操作數(shù)據(jù)庫,將用戶輸入的用戶名和密碼插入到相應(yīng)的數(shù)據(jù)庫表中。確定注冊按鈕的后端實現(xiàn)代碼如下:
button_right.addActionListener(new ActionListener() {/*注冊確認按鈕實現(xiàn)的代碼*/public void actionPerformed(ActionEvent e) {if (e.getSource()==button_right) {//用戶點擊了確認按鈕/*判斷用戶行為,顯示相應(yīng)窗口*/if (textField_username.getText().toString().equals("")) {JOptionPane.showMessageDialog(null, "請輸入用戶名和密碼","友情提示",2);//用戶用戶名和密碼均未輸入}else if (textField_password.getText().toString().equals("")) {JOptionPane.showMessageDialog(null, "請輸入密碼","友情提示",2);//用戶未輸入密碼}else if (textField_username.getText().toString().equals("")) {JOptionPane.showMessageDialog(null, "請輸入用戶名","友情提示",2);//用戶未輸入用戶名}else if (textField_rightKey.getText().toString().equals("")) {JOptionPane.showMessageDialog(null, "請確認密碼,保證兩次輸入密碼相同","友情提示",2);//用戶未確認密碼}else {//用戶所有信息均已輸入且滿足確認的要求if (textField_rightKey.getText().toString().equals(textField_password.getText().toString())) {//兩次輸入密碼相同if (comboBox_user.getSelectedItem().toString().equals("老師")) {//判斷出用戶類型為老師String sql="Insert Into register_teacher(username,password) values(?,?)";//編寫sql語句sqlUpdate.update(sql, textField_username.getText().toString(),textField_password.getText().toString());//調(diào)用自定義函數(shù)將老師的賬號和密碼插入到數(shù)據(jù)庫中JOptionPane.showMessageDialog(null, "注冊成功");}else {//判斷出用戶類型為學(xué)生String sql="Insert Into register_student(username,password) values(?,?)";//編寫sql語句sqlUpdate.update(sql, textField_username.getText().toString(),textField_password.getText().toString());//調(diào)用自定義函數(shù)將學(xué)生的賬號和密碼插入到數(shù)據(jù)庫中JOptionPane.showMessageDialog(null, "注冊成功");}new xt_application().main(null);//打開登錄窗口register.dispose();//關(guān)閉注冊窗口}else {//兩次輸入密碼不同JOptionPane.showMessageDialog(null, "兩次輸入的密碼不一致","友情提示",2);}}} }}從登錄模塊退出系統(tǒng),實現(xiàn)退出按鈕的功能,設(shè)計出退出按鈕后,實現(xiàn)其后端代碼,捕獲到用戶行為,彈出提示框,提示用戶是否確定要退出系統(tǒng)并創(chuàng)建變量接收用戶的點擊結(jié)果,當變量為0時,說明用戶點擊了“是”,此時關(guān)閉系統(tǒng),若變量值不為0,則不執(zhí)行退出系統(tǒng)操作,退出系統(tǒng)按鈕實現(xiàn)的后端代碼如下:
/*退出按鈕的代碼實現(xiàn)*/ button_exit.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO 自動生成的方法存根if (e.getActionCommand().toString().equals("退出")) {//捕獲到用戶行為int isExit = JOptionPane.showConfirmDialog(null, "您確定要退出系統(tǒng)嗎?","友情提示",JOptionPane.YES_NO_OPTION);//提示用戶是否要退出系統(tǒng)if(isExit==0) login.dispose();//退出系統(tǒng)}} });4.2.4 設(shè)計學(xué)生系統(tǒng)首頁和老師系統(tǒng)首頁,完成登錄模塊的登錄和重置輸入的后端功能
設(shè)計學(xué)生系統(tǒng)首頁和老師系統(tǒng)首頁直接在Design頁面中拖拉組件即可,在此前端代碼不再展示,不再贅述。此處主要介紹登錄頁面的登錄和重置輸入按鈕的后端實現(xiàn)功能。
當用戶點擊登錄按鈕后,獲取到用戶輸入的用戶名、密碼和下拉框中選擇的登錄身份。當用戶選擇“學(xué)生”的身份進行登錄時,調(diào)用sqlUpdate實體類中的靜態(tài)方法,傳參為sql語句和參數(shù),查詢出學(xué)生登錄表中是否有此賬號,若密碼錯誤或者賬號錯誤則給出相應(yīng)的提示信息;若賬號密碼正確,則關(guān)閉登錄頁面,打開學(xué)生系統(tǒng)頁面。當用戶選擇“老師”的身份進行登錄時,代碼類似,只是查詢數(shù)據(jù)時是在老師登錄表中查詢是否有此賬號。登錄按鈕實現(xiàn)的后端代碼如下(注意:由于老師登錄的代碼與學(xué)生登錄的代碼類似,此處不再展示老師登錄的代碼):
public void actionPerformed(ActionEvent e) {String name=user_text.getText().toString();//用戶名String key=key_text.getText().toString();//密碼String idtf=user_type_comboBox.getSelectedItem().toString();if (e.getActionCommand().equals("登錄")) {if (name.isEmpty()&&!key.isEmpty()) {//用戶未輸入用戶名,只輸入了密碼JOptionPane.showMessageDialog(null,"用戶名不能為空","友情提示",2);//彈出用戶名為空的提示性對話框}else if (key.isEmpty()&&!name.isEmpty()) {//用戶只輸入了用戶名而未輸入密碼JOptionPane.showMessageDialog(null, "密碼不能為空","友情提示",2);//彈出密碼為空的提示性對話框}else if (key.isEmpty()&&name.isEmpty()) {//用戶均未輸入用戶名和密碼JOptionPane.showMessageDialog(null, "用戶名和密碼不能為空","友情提示",2);//彈出用戶名和密碼均為空的提示性對話框}else {if (idtf.equals("學(xué)生")) {//當用戶類型為學(xué)生時try {if (name.equals(sqlUpdate.user_Query("select username from register_student where username=?", name))) {//在數(shù)據(jù)庫中查詢到指定用戶名if (key.equals(sqlUpdate.pwd_Query("select password from register_student where password=?", key))) {//在數(shù)據(jù)庫中查詢到用戶名所對應(yīng)的密碼stu_menu_frame f=new stu_menu_frame();//由于getId()未設(shè)置為靜態(tài)方法,故必須新設(shè)對象一調(diào)用getId()方法f.getId(sqlUpdate.id_Query("select id from register_student where username=?", name));//調(diào)用stu_menu_frame中的getId()方法,達到傳參的目的new stu_menu_frame().main(null);//驗證身份成功,登錄成功login.dispose();//關(guān)閉登錄頁面}else {JOptionPane.showMessageDialog(null, "密碼錯誤,請重新輸入","友情提示",2);//密碼錯誤,驗證身份失敗,登錄失敗}}else {JOptionPane.showMessageDialog(null, "用戶名不存在","友情提示",2);//用戶名不存在或者用戶類型不符合}} catch (HeadlessException e1) {// TODO 自動生成的 catch 塊e1.printStackTrace();} catch (Exception e1) {// TODO 自動生成的 catch 塊e1.printStackTrace();}} }當用戶點擊登錄界面的重置按鈕后,將用戶名和密碼輸入框置空,并將下拉框的選項置為初始值。重置按鈕的后端實現(xiàn)代碼如下:
public void actionPerformed(ActionEvent e) {user_text.setText("");/*將輸入框置空*/key_text.setText("");user_type_comboBox.setSelectedIndex(0);} });4.2.5設(shè)計并實現(xiàn)修改密碼、返回登錄窗口、學(xué)生信息實名認證的后端功能
創(chuàng)建變量保存登錄頁面?zhèn)鱽淼挠脩鬷d,保證之后所有的操作都是圍繞此用戶的信息。當用戶點擊菜單項修改密碼按鈕時,將id進行傳參到menu_frame類中,打開修改密碼的窗口,關(guān)閉學(xué)生系統(tǒng)首頁的窗口。由于點擊菜單項打開新窗口的代碼邏輯類似,在此僅展示點擊修改密碼按鈕后的頁面跳轉(zhuǎn)邏輯,之后類似操作不再贅述,點擊修改密碼按鈕的后端代碼實現(xiàn):
public void mousePressed(MouseEvent e) {// TODO 自動生成的方法存根if (e.getSource()==menuItem_change_key) {//捕獲到用戶點擊了菜單項修改密碼的按鈕stu_change_key_frame change_key=new stu_change_key_frame();//由于change_key_frame類中的getId()方法不是靜態(tài)方法,所以必須先創(chuàng)建對象change_key.getId(s_id);//調(diào)用getId()傳參new stu_change_key_frame().main(null);//打開修改密碼的窗口menu_frame.dispose();//關(guān)閉菜單窗口} }當用戶點擊返回登錄頁面菜單項時,代碼邏輯打開登錄窗口并關(guān)閉菜單窗口即可,邏輯簡單,不再贅述。
當用戶點擊學(xué)生信息實名認證的菜單項時,向?qū)嵜J證的類中傳參id,調(diào)用sqlUpdate類中的靜態(tài)方法查詢數(shù)據(jù)庫學(xué)生信息表中是否存在此id號學(xué)生的信息,若方法返回值不為0,則說明該用戶信息已經(jīng)足夠完善,無需再完善信息;若方法返回值為0,則說明學(xué)生信息表中不存在此id號的學(xué)生信息,需要進行實名認證,打開完善信息的頁面,點擊實名認證菜單項的后端代碼實現(xiàn)如下:
public void mousePressed(MouseEvent e) {// TODO 自動生成的方法存根if (e.getSource()==menuItem_confirm) {try {confrim_frame confrim=new confrim_frame();//由于getId()并沒有設(shè)置為confrim_frame類中的靜態(tài)方法,所以必須新建立對象才能調(diào)用方法confrim.getId(s_id);//向confrim_frame類中傳參/*isId是id_Query()方法的返回值,若數(shù)據(jù)庫中已存在該s_id號,方法返回值為id值,說明在此之前用戶已經(jīng)完善過信息,無需完善,若方法返回0值,說明此前用戶未完善信息*/int isId = sqlUpdate.id_Query("select id from student where id=?", s_id);//查找數(shù)據(jù)庫中是否存在登錄界面?zhèn)鱽淼膇d號if (isId!=0) {//若id號存在說明該用戶無需完善信息JOptionPane.showMessageDialog(null, "信息已足夠完善","友情提示",2);}else {//若id號不存在說明該用戶是新用戶,需要完善信息new confrim_frame().main(null);//打開完善信息頁面}} catch (Exception e2) {// TODO: handle exceptione2.printStackTrace();}} }4.2.6設(shè)計并實現(xiàn)老師系統(tǒng)中錄入學(xué)生學(xué)籍變更、獎勵記錄、處分記錄的功能
當老師點擊錄入信息中的學(xué)籍變更菜單項時,關(guān)閉教師管理系統(tǒng)窗口,打開修改學(xué)籍信息的窗口,老師輸入學(xué)號后點擊查詢,編寫sql語句并執(zhí)行,查詢學(xué)生信息表中的相關(guān)信息,將查詢到的相應(yīng)信息放入相應(yīng)的標簽當中,達到數(shù)據(jù)回顯的目的,然后老師輸入學(xué)籍代碼點擊修改后,通過一系列判斷后,查詢到用戶輸入的學(xué)籍代碼所對應(yīng)的學(xué)生學(xué)籍變更信息,編寫sql語句并執(zhí)行,修改或者增添數(shù)據(jù)庫中學(xué)生學(xué)籍信息表數(shù)據(jù),修改學(xué)籍信息菜單項的后端代碼實現(xiàn)如下:
public void actionPerformed(ActionEvent e) {if (e.getSource()==button_change&&textField_CODE.getText().toString().isEmpty()) {//當用戶未輸入級別代碼卻點擊了修改按鈕JOptionPane.showMessageDialog(null, "請您輸入級別代碼","友情提示",2);//彈出提示窗口}else if (e.getSource()==button_change&&label_getStuId.getText().toString().isEmpty()) {//當學(xué)號標簽上未顯示內(nèi)容,但用戶點擊了修改按鈕JOptionPane.showMessageDialog(null, "請您先查找指定學(xué)生","友情提示",2);//彈出提示窗口}else {int code = Integer.parseInt(textField_CODE.getText().toString());//獲取用戶輸入在文本框內(nèi)的學(xué)籍代碼,并將其轉(zhuǎn)換為int類型String StuId = textField_getStuId.getText().toString();//獲取用戶輸入在文本框內(nèi)的學(xué)號int id=0;try {id = sqlUpdate.id_Query("select ID from student where s_studentid=?", StuId);//查找到相應(yīng)學(xué)號的同學(xué)的id號} catch (Exception e2) {// TODO 自動生成的 catch 塊e2.printStackTrace();}//獲取查詢同學(xué)的id號if (e.getSource()==button_change) {//捕獲到用戶點擊了修改按鈕if (flag1==1) {if (code<0||code>4) {JOptionPane.showMessageDialog(null, "您輸入的學(xué)籍代碼錯誤,請輸入0~4之間的數(shù)字","友情提示",2);}else {if (flag2==1) {//該學(xué)生在學(xué)籍信息的數(shù)據(jù)庫中有記錄,只需修改學(xué)籍信息,而無需增添信息到數(shù)據(jù)庫中sqlUpdate.update("update change_information set CHANGE_CODE=? where STUDENTID=? ", code,StuId);//修改數(shù)據(jù)庫中的內(nèi)容String DESCRIPTION="";try {DESCRIPTION = sqlUpdate.description_Query("select DESCRIPTION from change_code where code=?", code);//調(diào)用函數(shù)查詢到code對應(yīng)的學(xué)籍狀態(tài)} catch (Exception e1) {// TODO 自動生成的 catch 塊e1.printStackTrace();}sqlUpdate.update("update change_information set DESCRIPTION=? where STUDENTID=?", DESCRIPTION,StuId);//將數(shù)據(jù)庫中DESCRIPTION的內(nèi)容修改label_getXjZt.setText(DESCRIPTION);//將標簽的內(nèi)容修改label_getXjCODE.setText(String.valueOf(code));//更新標簽上的內(nèi)容java.util.Date date=new java.util.Date();//獲取點擊按鈕的當前時間SimpleDateFormat dateFormat=new SimpleDateFormat("YYYY-MM-dd");//設(shè)置時間的格式label_getTime.setText(dateFormat.format(date));//修改標簽上的內(nèi)容sqlUpdate.update("update change_information set REC_TIME=? where STUDENTID=?", dateFormat.format(date),StuId);//更改數(shù)據(jù)庫中的內(nèi)容}else {String DESCRIPTION="";try {DESCRIPTION = sqlUpdate.description_Query("select DESCRIPTION from change_code where code=?", code);//調(diào)用函數(shù)查詢到code對應(yīng)的學(xué)籍狀態(tài)} catch (Exception e1) {// TODO 自動生成的 catch 塊e1.printStackTrace();}label_getXjZt.setText(DESCRIPTION);//將標簽的內(nèi)容修改label_getXjCODE.setText(String.valueOf(code));//更新標簽上的內(nèi)容java.util.Date date=new java.util.Date();//獲取點擊按鈕的當前時間SimpleDateFormat dateFormat=new SimpleDateFormat("YYYY-MM-dd");//設(shè)置時間的格式label_getTime.setText(dateFormat.format(date));//修改標簽上的內(nèi)容/*向*/sqlUpdate.update("insert into change_information(ID,STUDENTID,CHANGE_CODE,REC_TIME,DESCRIPTION) values(?,?,?,?,?)", id,StuId,code,dateFormat.format(date),DESCRIPTION);flag2=1;}JOptionPane.showMessageDialog(null, "修改成功","友情提示",2);//彈出修改成功的提示窗口}}else {JOptionPane.showMessageDialog(null, "未查詢到該學(xué)生,故您無法修改學(xué)籍信息","友情提示",2);}}} }});老師錄入學(xué)生獎勵記錄和處罰記錄的代碼邏輯和錄入學(xué)籍信息的類似,再次不再贅述。
4.2.7 設(shè)計并實現(xiàn)老師系統(tǒng)中查詢學(xué)生信息的頁面及按鈕的后端功能
設(shè)計學(xué)生信息查詢頁面同樣是使用windowBuilder組件進行設(shè)計,不再贅述。當輸入查詢條件后,點擊查詢按鈕,根據(jù)用戶輸入的數(shù)據(jù)進行判斷,通過數(shù)據(jù)類型來編寫sql語句(不得不說,我認為這是整個項目自己當時寫的最爛的一部分代碼了,代碼復(fù)用性特別差,完全可以封裝成函數(shù),把獲取參數(shù)添加到集合中去,然后遍歷集合就好了,for循環(huán)中可以使用判斷語句然后拼接字符串最終把sql語句拼接好,然后進行傳參就好),然后調(diào)用類中的方法進行傳參。從數(shù)據(jù)庫表中查詢到信息后放入表格標簽中,實現(xiàn)數(shù)據(jù)顯示,然后每點擊一次查詢就清空一次表格數(shù)據(jù),防止點擊查詢導(dǎo)致數(shù)據(jù)在表格中的追加而不是查詢顯示。另外,在表格右下角設(shè)計了刷新按鈕,此按鈕的目的是清空表格內(nèi)容(其實我感覺是多此一舉的功能,因為每點擊一次查詢,在顯示出學(xué)生信息之前就會將表格內(nèi)容清空),實現(xiàn)邏輯就是調(diào)用model中的setRowCount函數(shù),使得表格中行數(shù)置0,數(shù)據(jù)清空。查詢學(xué)生信息的代碼展示一部分吧(實在太爛太長復(fù)用性太差,就不展示全部代碼了),查詢學(xué)生信息的部分代碼如下:
//若用戶只輸入了性別一欄信息 model.setRowCount( 0 );//將表格的行數(shù)置為0,實現(xiàn)每點擊查詢按鈕一次,表格就清空一次 String sex=comboBox_getSex.getSelectedItem().toString(); List<Student> list = null;//存放學(xué)生變量 try {list = sqlUpdate.Student_Query("select * from student where s_sex=?", sex);//查找數(shù)據(jù)庫中性別全為sex的學(xué)生 } catch (Exception e1) {// TODO 自動生成的 catch 塊e1.printStackTrace(); } for (int i = 0; i < list.size(); i++) {//遍歷集合,將每一個同學(xué)的基本信息輸入到表格中try {//將查詢到相應(yīng)學(xué)號的學(xué)生的獎懲信息賦值予對象的相應(yīng)屬性list.get(i).setXj_information(sqlUpdate.xj_rReward_Punish_query("select DESCRIPTION from change_information where STUDENTID=?", list.get(i).getStudentId()));list.get(i).setReward_information(sqlUpdate.xj_rReward_Punish_query("select DESCRIPTION from reward where STUDENTID=?", list.get(i).getStudentId()));list.get(i).setPunish_information(sqlUpdate.xj_rReward_Punish_query("select DESCRIPTION from punishment where STUDENTID=?", list.get(i).getStudentId()));list.get(i).setIsRight(sqlUpdate.IsPunish_query("select ENABLE from punishment where STUDENTID=?", list.get(i).getStudentId()));} catch (Exception e2) {// TODO: handle exceptione2.printStackTrace();}/*提取出學(xué)生的獎懲屬性賦值給新的變量*/String xj_information = list.get(i).getXj_information();String reward_information = list.get(i).getReward_information();String punish_information = list.get(i).getPunish_information();String isRight = list.get(i).getIsRight();/*提取出學(xué)生的基本屬性賦值給新的變量*/int studentId = list.get(i).getStudentId();String name = list.get(i).getName();String sex2 = list.get(i).getSex();int classid = list.get(i).getClassid();String collage = list.get(i).getCollage();String born = list.get(i).getBorn();String resident = list.get(i).getResident();/*設(shè)置表格中的行內(nèi)容*/Object[] data=new Object[] {studentId,name,sex2,classid,collage,born,resident,xj_information,reward_information,punish_information,isRight};model.addRow(data);4.2.8 設(shè)計并實現(xiàn)學(xué)生系統(tǒng)中查詢自己學(xué)籍變更、獎勵記錄和處罰記錄的功能
學(xué)生系統(tǒng)中查詢學(xué)籍變更、獎勵記錄和處罰記錄的功能其實十分類似,因為學(xué)生是沒有錄入自己獎勵記錄和處罰記錄的功能的,這個操作只能由老師實現(xiàn),所以僅僅是一個數(shù)據(jù)回顯的實現(xiàn),所以后端查詢數(shù)據(jù)庫,前端獲取到數(shù)據(jù)后,將數(shù)據(jù)放入標簽中顯示在頁面中即可。當用戶點擊查詢信息中的學(xué)籍變更菜單項時,將學(xué)生系統(tǒng)頁面關(guān)閉,打開學(xué)籍變更信息頁面,在頁面中可以看到數(shù)據(jù)庫中查詢到的信息。代碼邏輯是當用戶點擊了菜單項跳轉(zhuǎn)頁面時就把學(xué)生id進行傳參,然后在方法體中編寫sql語句,將id作為查詢條件進行查詢學(xué)生的學(xué)號、姓名、學(xué)籍代碼、學(xué)籍狀態(tài)和更新時間等信息,并將這些信息放入到標簽當中,以此在頁面中可以顯示出來。查詢學(xué)生學(xué)籍變更信息的后端代碼實現(xiàn)如下:
try {Connection con = connection.getConnection();String sql="select STUDENTID,CHANGE_CODE,REC_TIME,DESCRIPTION from change_information where ID=?";PreparedStatement statement=con.prepareStatement(sql);statement.setInt(1, s_id);ResultSet set = statement.executeQuery();if (set.next()) {label_getStuId.setText(String.valueOf(set.getInt(1)));//學(xué)號label_getCODE.setText(set.getString(2));//學(xué)籍代碼label_getDes.setText(set.getString(4));//學(xué)籍狀態(tài)label_getTime.setText(set.getString(3));//更新時間label_getName.setText(sqlUpdate.name_query("select s_name from student where id=?", s_id));//姓名} } catch (Exception e) {// TODO: handle exceptione.printStackTrace(); }五、結(jié)果與分析
最終項目成型,學(xué)生信息管理系統(tǒng)目前未發(fā)現(xiàn)任何bug,項目實現(xiàn)了任務(wù)指導(dǎo)書中的所有基本功能,此項目有拓展功能存在,但此項目中存在很多不足之處,以下一并進行分析。
項目拓展功能:
①登錄注冊和修改密碼的功能,任務(wù)指導(dǎo)書上并沒有對這個功能做要求,筆者認為登錄注冊功能是系統(tǒng)所必需的基本功能,感覺沒有登錄注冊功能的系統(tǒng)是不完善的系統(tǒng),所以項目中分別設(shè)計了老師登錄表和學(xué)生登錄表,在前端可以判斷出用戶身份,并對兩張表進行新增數(shù)據(jù)和查詢數(shù)據(jù)。修改密碼功能則是對兩張表進行修改數(shù)據(jù)。
②退出系統(tǒng)的功能:這個功能任務(wù)指導(dǎo)書上也沒有要求,但功能十分簡單,所以就一并實現(xiàn)了。因為整個系統(tǒng)都是在原有頁面上打開的新頁面,所以只需將當前頁面窗口關(guān)閉即可實現(xiàn)退出系統(tǒng)功能。
③返回登錄頁面的功能:此功能也十分簡單,和退出功能十分類似,只需要關(guān)閉當前頁面窗口,打開登錄頁面即可,也就是簡單的頁面跳轉(zhuǎn)。
項目功能不足之處:
①項目整體架構(gòu)不好,只是單獨的Java文件,沒有面向接口編程,沒有利用好項目的三層架構(gòu)。
②沒有封裝好函數(shù),代碼過于冗余,代碼復(fù)用性不好,更新功能或完善功能較為困難。
③前端頁面是利用組件設(shè)計,但在一開始沒設(shè)置布局,某些頁面在顯示數(shù)據(jù)字數(shù)過多時會導(dǎo)致標簽錯位。且前端頁面不夠美觀。
④Jar包沒全部保存在libs目錄下,整個項目是引入的外部jar包,這會導(dǎo)致更改項目路徑后,出現(xiàn)jar包缺失的情況。
⑤項目中判斷語句過多,代碼閱讀性差(但還好注釋比較多)。
⑥類似于dao層的sqlUpdate文件中的代碼并沒有很好地完成它的功能,很多sql語句是其他文件傳參進來的,而應(yīng)該的是sql語句在dao層編寫才對。
⑦涉及到輸入數(shù)據(jù)的部分,大多都是采用的輸入框形勢,并且沒有對輸入的數(shù)據(jù)進行校驗,一旦用戶輸入了非法數(shù)據(jù)(數(shù)據(jù)類型和數(shù)據(jù)庫中存儲的數(shù)據(jù)類型不一致)就會導(dǎo)致報錯,可以說輸入數(shù)據(jù)部分及其不完善。
六、小結(jié)與心得體會
談到項目功能的不足之處還是比較多的,這是當時學(xué)完Java后就做的第一個Swing項目作為練手,當時的主要目的是熟悉類、靜態(tài)方法等基礎(chǔ)知識點,所以這個項目并不成熟,代碼也過于冗余,復(fù)用性不好
但是通過這個項目,學(xué)習(xí)前后端交互知識還是及其不錯的,它是原生的jdbc加載驅(qū)動連接數(shù)據(jù)庫的,這些基礎(chǔ)打牢了再去學(xué)習(xí)一些框架就會輕松許多。另外,該項目能很好地鍛煉到Java基礎(chǔ)知識點,因為筆者是學(xué)完Java就寫的這個項目練手,當時對于類、繼承和靜態(tài)方法等一些不太明白不太熟練的點,這個項目作為練手是很好的選擇。為什么不更新這個項目呢(也就是為什么不把不足之處進行完善)?筆者已經(jīng)說過,該項目沒有采用面向接口編程,沒有利用好三層架構(gòu),函數(shù)封裝的也不夠好,代碼冗余性、復(fù)用性以及閱讀性都不夠好,在此基礎(chǔ)上進行更新完善功能,筆者覺得意義不大,因為項目本身就是當時學(xué)完Java練手寫的,目的是熟悉Java的基礎(chǔ)知識,顯然目的是達到了的,筆者覺得這就足夠了。
通過此項目,還是很好的學(xué)習(xí)到了數(shù)據(jù)庫技術(shù),對于sql語句的編寫,數(shù)據(jù)庫的連接方法,數(shù)據(jù)庫圖形化工具的使用,數(shù)據(jù)庫建模工具的使用,Java基礎(chǔ)知識都有所熟練,為之后框架的學(xué)習(xí)打下了良好的基礎(chǔ)。
體會
談到項目功能的不足之處還是比較多的,這是當時學(xué)完Java后就做的第一個Swing項目作為練手,當時的主要目的是熟悉類、靜態(tài)方法等基礎(chǔ)知識點,所以這個項目并不成熟,代碼也過于冗余,復(fù)用性不好
但是通過這個項目,學(xué)習(xí)前后端交互知識還是及其不錯的,它是原生的jdbc加載驅(qū)動連接數(shù)據(jù)庫的,這些基礎(chǔ)打牢了再去學(xué)習(xí)一些框架就會輕松許多。另外,該項目能很好地鍛煉到Java基礎(chǔ)知識點,因為筆者是學(xué)完Java就寫的這個項目練手,當時對于類、繼承和靜態(tài)方法等一些不太明白不太熟練的點,這個項目作為練手是很好的選擇。為什么不更新這個項目呢(也就是為什么不把不足之處進行完善)?筆者已經(jīng)說過,該項目沒有采用面向接口編程,沒有利用好三層架構(gòu),函數(shù)封裝的也不夠好,代碼冗余性、復(fù)用性以及閱讀性都不夠好,在此基礎(chǔ)上進行更新完善功能,筆者覺得意義不大,因為項目本身就是當時學(xué)完Java練手寫的,目的是熟悉Java的基礎(chǔ)知識,顯然目的是達到了的,筆者覺得這就足夠了。
通過此項目,還是很好的學(xué)習(xí)到了數(shù)據(jù)庫技術(shù),對于sql語句的編寫,數(shù)據(jù)庫的連接方法,數(shù)據(jù)庫圖形化工具的使用,數(shù)據(jù)庫建模工具的使用,Java基礎(chǔ)知識都有所熟練,為之后框架的學(xué)習(xí)打下了良好的基礎(chǔ)。
以上為本次課程設(shè)計的小結(jié)與心得體會,皆為真實感受,不管以后走的多遠,學(xué)的東西有多雜,Java、Mysql的基礎(chǔ)知識部分還是要時常溫習(xí),基礎(chǔ)堅決要打牢,然后學(xué)習(xí)過新技術(shù)后要注意找項目練手,這樣才能對新知識進一步熟練掌握。
總結(jié)
以上是生活随笔為你收集整理的数据库课程设计报告总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中JFrame怎样控制闪烁_在J
- 下一篇: docker 搭建nginx php m