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