學生成績管理系統(六):項目總結
一、項目實現情況
初期項目計划:
-
簡單的圖形界面登錄功能。
-
對數據庫的的信息的查詢功能。
-
對數據庫的的信息的修改功能。
-
對數據庫的的信息的刪除功能。
-
對數據庫的的信息的添加功能。
-
當以學生身份登錄時只有查詢的功能。
-
當教師登陸時既可以查詢也可以進行修改、刪除、添加的操作。
最終項目實現的功能:
軟件功能架構圖:

軟件功能介紹:
- 輸入用戶名和密碼進入系統主界面
- 記錄學生的基本信息,如姓名、學號、性別、專業、班級等
- 記錄各科成績
- 根據用戶需求添加、修改、刪除學生信息
- 學生查找功能分為按年級查找、按班級查找、按專業查找、和顯示總體信息
- 實現常用的統計功能,如:單科成績排名、總分排名、統計成績高於/低於某一臨界值的學生、統計單科/總分平均值
理想與現實的差距
我們初期對學生成績管理系統的規划是:有一個學生登錄界面和一個老師登錄界面。先進入首界面選擇時學生登錄還是老師登錄,根據用戶選擇,進入相應的登錄界面。在學生登錄界面內,輸入學生的學號和密碼,進入主操作界面。當以學生身份登錄時只能進行查詢,當輸入教師賬號登錄時可以查詢,修改,刪除,添加操作。整個程序系統是和Access數據庫相連接,建立三張表:STUDENT(學生信息表)、Teacher(教師賬號管理表)、zhanghao(學生賬號管理表)。
最終版學生成績管理系統PS:詳情請點擊這里我們最終的學生成績管理系統設置了一個登陸入口,用戶直接輸入自己的用戶名和密碼之后進入系統主操作界面。在主操作界面中,分了三大塊:學生管理、學生查找、成績管理。在學生管理這一塊中,又分為增加學生、修改學生、刪除學生、單個查詢(按照學號查詢)這四個功能;在學生查找中分為:查看全體、按年級查找、按班級查找、按專業查找四個功能;在成績管理中分為:單科排名、總分排名、掛科學生、合格學生四個功能。而且我們整個系統的數據庫是使用MySQL來鏈接制作的。
二、項目測試分析
1.數據庫名studentmanagement

2.典型測試數據的構建,並且給出測試數據的預計結果
原數據:

測試數據:
2.1 添加學生
20122222 張曉華 女 2012 2 計算機科學與技術 19941215 95 96 85


2.2 刪除學生
20145223


2.3 修改學生
20145236 馮佳 女 2014 3 管理 19960125 56 84 97



2.4 單個查找


2.5 查詢全體

2.6 按年級查找 2012級

2.7 按班別查找 1班

2.8 按專業查找

2.9 單科排名並顯示平均分

2.10 總分排名並顯示平均分

2.11 單科及格學生

2.12 單科不及格學生

三、項目實現中的問題與解決
問題1:如何實現一個管理員登錄界面
解決方法:
由於這一部分書上並沒有具體指導的方法,所以我們選擇百度”java界面編程”,在百度知道中我們找到了答案:Java界面編程
其中給出了整個具體的代碼,這就很大程度上幫助了我們在后續界面的設計和編碼。因此我們基本上后續所有界面的代碼都是在這個代碼的基礎上所進行修改而得出的。牛頓說過要站在巨人的肩膀上,我們也是再利用了別人的代碼的基礎上再進行完善和修改,最終一步步做出了屬於我們自己的操作界面。
代碼如下:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class Login {
private JFrame frame = new JFrame("登錄");
private Container c = frame.getContentPane();
private JTextField username = new JTextField();
private JPasswordField password = new JPasswordField();
private JButton ok = new JButton("確定");
private JButton cancel = new JButton("取消");
public Login(){
frame.setSize(300,200);
c.setLayout(new BorderLayout());
initFrame();
frame.setVisible(true);
}
private void initFrame() {
//頂部
JPanel titlePanel = new JPanel();
titlePanel.setLayout(new FlowLayout());
titlePanel.add(new JLabel("系統管理員登錄"));
c.add(titlePanel,"North");
//中部表單
JPanel fieldPanel = new JPanel();
fieldPanel.setLayout(null);
JLabel l1 = new JLabel("用戶名:");
l1.setBounds(50, 20, 50, 20);
JLabel l2 = new JLabel("密 碼:");
l2.setBounds(50, 60, 50, 20);
fieldPanel.add(l1);
fieldPanel.add(l2);
username.setBounds(110,20,120,20);
password.setBounds(110,60,120,20);
fieldPanel.add(username);
fieldPanel.add(password);
c.add(fieldPanel,"Center");
//底部按鈕
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());
buttonPanel.add(ok);
buttonPanel.add(cancel);
c.add(buttonPanel,"South");
}
public static void main(String[] args){
new Login();
}
}
程序運行結果如下:

問題2:Botton和Jbotton的區別
在程序界面的設計過程中,我們遇到了漢字無法顯示的問題:

解決過程:
經過百度,我們知道了,因為Button是awt包中的控件,而JButton是swing包中的控件,AWT是依靠本地方法來實現其功能的,Swing是在AWT的基礎上構建的一套新的 圖形界面系統。於是我們將Button換成Jbotton,便可以顯示中文了。
問題3:數據庫的鏈接
我們的成績管理系統一開始使用的是access數據庫,但是百度了之后並沒有發現與netbeans和access鏈接相關的代碼,在qq上向老師尋求幫助之后,我們決定換為mysql這個數據庫。
使用mysql的好處:
1.MySQL是一個關系型數據庫管理系統,在 WEB 應用方面MySQL是最好的 RDBMS (Relational Database Management System,關系數據庫管理系統) 應用軟件之一。
2.MySQL是一種關聯數據庫管理系統,關聯數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度並提高了靈活性。
3.MySQL所使用的 SQL 語言是用於訪問數據庫的最常用標准化語言。MySQL 軟件采用了雙授權政策,它分為社區版和商業版,由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網站的開發都選擇 MySQL 作為網站數據庫。
解決過程:
我們查閱了相關資料以及參考了盧肖明的博客 最終我們成功將我們的程序與數據庫成功連接上。
1.我們項目選擇的是mysql的數據庫,之前老師發在群里有一個集成各種軟件的功能強大的XAMPP:

2.選擇xampp的這兩個功能:

3.我們現在可以進入到彈出的網頁中,這里就是我們建立數據庫的地方,選擇選項中的new,我們就可以在此創建自己需要的數據庫:

4.我們建立一個名為studentmanagement的數據庫,在這個數據庫中創建一個名為student的表:


5.由於我們選擇的是Netbeans程序進行項目,所以我們需要這Netbeans中進行如下的操作:
·導入庫文件:

·導入jar包:

·程序連接代碼:
package 最終版學生成績管理系統;
import java.sql.*;
//連接數據庫類
public class DataBaseCreate {
//連接數據庫靜態方法,若產生錯誤,則拋出相應錯誤信息
public static Connection getConnection()throws SQLException,java.lang.ClassNotFoundException{
//建立本地數據庫連接,編碼規則轉換為utf-8(正常錄入中文)
String url="jdbc:mysql://localhost:3306/studentmanagement?useUnicode=true&characterEncoding=utf8";
Class.forName("com.mysql.jdbc.Driver");
String userName="root";
Connection con=DriverManager.getConnection(url, userName, "");
return con;
}
}
如果有其他的小伙伴對於這方面的知識有興趣的話,可以參考盧肖明關於書上數據庫聯機的帖子:數據庫聯機 以及我們團隊小組第五次的項目總結:學生成績管理系統(五):系統的完善與數據庫的聯機
問題4:如何點擊按鈕彈出窗口
解決過程:
在監聽器下
if(o=你的按鈕){
new 你需要的新對話框
}
(該方法可以在實現actionPerformed方法中,也可以直接寫匿名內部類)
或者不實現ActionListener而直接在代碼中加入該監聽
偽代碼:
ActionListener listener=new ActionListener(){
public void actionPerformed(ActionEvent e){
if(o=你的按鈕){
new 你需要的新對話框
}
}
};
參考代碼
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class popupWindows{
JFrame mainWindow;
public popupWindows(){
mainWindow = new JFrame("pop up window");
//mainWindow.setBounds(10,10,10,10);
JButton JB = new JButton("PopUp");
JB.addActionListener(new creatNewWindow());
mainWindow.setVisible(true);
mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainWindow.add(JB);
mainWindow.pack();
}
class creatNewWindow implements ActionListener{
public void actionPerformed(ActionEvent e){
new popupWindows().mainWindow.setBounds(100,100,100,100);
}
}
public static void main(String[] args){
new popupWindows();
}
}
問題5:程序功能多導致的主程序代碼過長
解決方法:
我們的項目里涉及到很多功能,考慮到分工合作問題以及程序代碼編寫容易發生混亂,我們將主程序里運用到的多個子程序單獨作為一個class類,主程序main直接調用就可以。
類的設計過程:
本程序包括19個類文件,每個類文件只含有一個類,分別是包含main方法的主類 Main,實現登錄功能的類 Login, 實現各種功能選擇功能的類 Function, 實現數據庫連接的類 DataBaseCreate, 實現學生信息編輯功能類 StudentEdit, 執行增加學生功能的類 AddStudent, 執行刪除學生功能的類 DeleteStudent, 執行修改學生功能的類 UpdateStudent, 執行單個查詢功能的類 IndexOfSingle, 實現條件查找和成績管理功能的類 IndexOrManage, 執行查詢全體功能的類 LookAllStudents, 執行按年級查詢功能的類 IndexOfGrade, 執行按班別查詢功能的類 IndexOfClass, 執行按專業查詢的類 IndexOfMajor, 執行單科排名功能的類 SubjectScoreRanking, 執行總分排名功能的類 TotalScoreRanking, 執行查找單科及格學生功能的類 PassStudents, 執行查找單科不及格學生功能的類 NotPassStudents, 執行將文本域內容保存到TXT文件的類 TxtSave。以上19個類,除了Main類以外,均包含一個構造方法,有些還包含actionPerformed(e)方法。

問題6:關於下拉列表的實現,錄入學生信息的時候,剛開始我們設計的是所有學生信息必須通過手動輸入,后來我們想要設置為能有一個下拉列表,類似於性別、班級、年級、專業這類的輸入使管理員能夠不用再重新輸入,而是通過下拉列表進行選擇。包括在查詢管理和學生查找中的單科排名和合格學生、掛科學生、按班級查找、按年級查找、按專業查找我們用同樣的方法設置了下拉列表。
解決方法:
我們通過在需要下拉列表的類 IndexOrManage、類 IndexOfGrade、類 IndexOfClass、類 PassStudents、類 NotPassStudents中添加類import javax.swing.JComboBox;顯示一個項列表,擴展的是ListModel接口的模型,它的顯示繪制器通過實現ListCellBenderer接口來繪制列表下拉列表。JComboBox類是一個組件,它結合了一個按鈕或可編輯字段與下拉列表。
代碼如下:
String[] classes={"","1","2","3"};
JComboBox clas=new JComboBox(classes);//班級下拉列表
JLabel la=new JLabel("選擇查詢班別");
String[] grades={"","2012","2013","2014","2015"};
JComboBox grade=new JComboBox(grades);
JLabel la=new JLabel("選擇查詢年級");
String[] majors={"","電子信息工程","計算機科學與技術","通信工程","管理","信息安全"};
JComboBox major=new JComboBox(majors);
JLabel la=new JLabel("選擇查詢專業");
String[] subjects={"","語文","英語","數學"};
JComboBox subject=new JComboBox(subjects);
JLabel la=new JLabel("選擇查詢科目");
效果如下圖:








問題7:在進行數據庫連接之后查詢的數據無法顯示出來
解決方法:
在程序中加上類
import java.sql.Connection;//與數據庫連接的類
import java.sql.ResultSet;//ResultSet 對象具有指向其當前數據行的指針,默認的 ResultSet 對象不可更新,僅有一個向前移動的指針;
//ResultSet 對象的列的編號、類型和屬性由 ResultSet.getMetaData 方法返回的 ResulSetMetaData 對象提供。
import java.sql.SQLException;//無效的列索引
import java.sql.Statement;//是 Java 執行數據庫操作的一個重要方法,用於在已經建立數據庫連接的基礎上,向數據庫發送要執行的SQL語句。
//Statement對象,用於執行不帶參數的簡單SQL語句。
並將程序中的主鍵和數據庫相連接,這樣當管理員點擊主鍵的時候就能夠直接對數據進行操作。相關代碼如下:
try{
Connection con=DataBaseCreate.getConnection();
Statement sql=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
//按班別查找數據庫數據
ResultSet rs=sql.executeQuery("select * from student where Class like '%"+clas.getSelectedItem()+"%'");
text.append("全校"+clas.getSelectedItem()+"班學生信息:\r\n");
text.append("學號 姓名 性別 生日 專業 年級 班別 語文 英語 數學 總分\r\n");
while(rs.next()){
text.append(rs.getString("Num")+" "+rs.getString("Name")+" "+rs.getString("Sex")+" "+rs.getString("Birth")+" "+rs.getString("Major")
+" "+rs.getString("Grade")+" "+rs.getString("Class")+
" "+rs.getFloat("Chinese")+" "+rs.getFloat("English")
+" "+rs.getFloat("Maths")+" "+rs.getFloat("Total")+"\r\n");
}
}catch(java.lang.ClassNotFoundException err){
JOptionPane.showMessageDialog(null, err.getMessage(), "ClassNotFoundException:",
JOptionPane.INFORMATION_MESSAGE);
}catch (SQLException ex){
JOptionPane.showMessageDialog(null, ex.getMessage(), "SQLException: ", JOptionPane.INFORMATION_MESSAGE);
}
}
問題8:當管理員輸入的信息不符合系統設置的操作要求時,應該怎么辦???也許你會說這很簡單啊,設置個if語句不就OK了嗎。然而操作起來並沒有那么簡單,我們剛開始設想了一下如果管理員輸入錯誤的話應該如何彈出消息提示框提示管理員進行正確操作呢?后來終於找到了正確的解決辦法參考資料
解決方法:
在程序中加入類import javax.swing.JOptionPane;構建使用消息提示框
相關代碼如下:
if(number.equals("")){
JOptionPane.showMessageDialog(null, "不存在此學生", "Messages",
JOptionPane.INFORMATION_MESSAGE);
}
if(clas.getSelectedItem().equals("")){
JOptionPane.showMessageDialog(null, "找不到該班別", "Message",
JOptionPane.INFORMATION_MESSAGE);
}
if(grade.getSelectedItem().equals("")){
JOptionPane.showMessageDialog(null, "找不到該年級", "Message",
JOptionPane.INFORMATION_MESSAGE);
}
if(major.getSelectedItem().equals("")){
JOptionPane.showMessageDialog(null, "找不到該專業", "Message",
JOptionPane.INFORMATION_MESSAGE);
}
else{
JOptionPane.showMessageDialog(null, "用戶名或密碼錯誤", "Error", JOptionPane.INFORMATION_MESSAGE);
}
效果如下圖:(PS:由於消息提示框類型都一樣在此就不一一列舉了)

問題9:程序中有很多操作功能的界面和操作功能基本相同,所以我們干脆讓它們繼承同一個類,這里就用到了我們Java課本上的子類繼承父類的的知識。
解決辦法:
AddStudent, DeleteStudent, UpdateStudent, IndexOfSingle 界面和操作基本相同,所以上4類均繼承StudentEdit。LookAllStudents, IndexOfGrade, IndexOfClass, IndexOfMajor, SubjectScoreRanking, TotalScoreRanking, PassStudents, NotPassStudents, 界面和操作基本相同,所以上8類均繼承IndexOrManage。所以這幾個功能操作運行出來之后界面顯示和相關的功能操作都是一樣的。我們用super()來繼承父類。
super();//this通常指代當前對象,super通常指代父類
p1.add(la);
p1.add(clas);
//注冊監聽
b1.addActionListener(this);//給b1實例加一個監聽器,當鼠標點擊了這個b1時就觸發了這個監聽器
b2.addActionListener(this);
b3.addActionListener(this);
pack();
setVisible(true);//數據模型已經構造好了,允許JVM可以根據數據模型執行paint方法開始畫圖並顯示到屏幕上了
}
使用super關鍵字
子類可以繼承父類的非私有成員變量和成員方法(不是以private關鍵字修飾的)作為自己的成員變量和成員方法。但是,如果子類中聲明的成員變量與父類的成員變量同名,則子類不能繼承父類的成員變量,此時稱子類的成員變量隱藏了父類的成員變量。如果子類中聲明的成員方法與父類的成員方法同名,並且方法的返回值及參數個數和類型也相同,則子類不能繼承父類的成員方法,此時稱子類的成員方法重寫了父類的成員方法。這時,如果想在子類中訪問父類中被子類隱藏的成員方法或變量,就可以使用super關鍵字。
調用父類的構造方法:
子類可以調用由父類聲明的構造方法。但是必須在子類的構造方法中使用super關鍵字來調用。語法格式如下:
super([參數列表]);
如果父類的構造方法中包含參數,則參數列表為必選項,用於指定父類構造方法的入口參數。
super調用和this調用很像,區別在於super調用的是其父類的構造方法,而this調用的是同一個類中重載的構造方法。因此,使用super調用父類構造也必須出現在子類構造執行體的第一行,所以this調用和super調用不會同時出現。
問題10:當運行程序后發現對信息進行錄入的時候,錄入漢字之后程序就會出現錯誤提示。如下圖:

解決方法:
通過不懈努力之后發現是在建立數據庫的時候在需要錄入漢字的功能的字符集編碼設置錯誤。參考資料
在數據庫中對已經建好的表里需要錄入漢字的主鍵進行編輯。如果在建表的時候沒有注意這一細節,數據表將會將字符集編碼默認設置成latin1,而你只需要將latin1改為utf8_general_ci。具體操作見下圖:
點擊你需要修改字符集編碼的主鍵。比如我們程序中的Name、Sex、Major需要錄入中文,所以我們就依次修改這三個主鍵,點擊修改。

然后點擊排序規則中的下拉鍵,選擇utf8_general_ci,最后點擊保存。

四、項目展望與改進
我們的項目還有很大的發展空間,但是由於我們的時間精力和能力有限,所以更新學生成績管理系統的的重任只能落在學弟學妹們身上啦!你們應該也已經看到了我們項目的最初計划了,所以你們完全可以按照我們剛開始計划的那樣,完后我們未了的心願。在我們的第二篇博客學生成績管理系統(二):項目介紹中有詳細的介紹和說明,這個程序可以加上多人操作功能,可以設置管理員操作窗口、教師操作窗口、學生操作窗口。
●管理員端
管理員可以進行的操作如下:
1、對學生信息進行增、刪、改、查
2、對教師信息進行增、刪、改、查
3、對課程信息進行增、刪、改、查
4、查看個人信息並進行性修改
5、查看學生的成績以及排名情況,其中在查看學生排名時,可以根據學生的所學課程和所在專業進行排名查詢
●教師端
教師可以進行的操作如下:
1、查看個人信息並修改登錄密碼
2、查看學生信息,其中包括對學生成績進行查詢與修改,在本系統中,將教師的成績錄入功能與成績修改功能合並
3、查看學生的排名情況,包括學生的課程排名與專業排名
●學生端
學生可以進行的操作如下:
1、修改個人登錄系統的密碼
2、查詢自己成績以及成績排名情況,同時擁有通過學號查詢其他人成績的權利
另外,你們也可以將界面設計的溫馨一點兒,而不是像我們現在這么官方,將相關的操作再完善一下,加油吧!騷年!我們相信你們可以長江后浪推前浪,將我們拍在沙灘上!哈哈哈哈!祝你們好運!!!
代碼托管
代碼托管連接
五、團隊成員貢獻與成績分配
| 學號 | 姓名 | 貢獻 | 成績分配 |
|---|---|---|---|
| 20145223 | 楊夢雲 | 編輯程序(學生管理這一部分),查找相關資源,進行數據庫的連接和建數據表,程序的改進和完善,博客的更新,1-5題的解決 | 31 |
| 20145236 | 馮佳 | 編輯程序(學生查找這一部分),在數據庫中建數據表,及其數據表的完善,程序界面和功能的改進和完善,博客的更新,6-10題的解決 | 29 |
| 20145104 | 張家明 | 編輯程序(成績管理這一部分),在數據庫中建數據表 | 15 |
