Java完整的學(xué)生選課系統(tǒng)源碼_第1頁
Java完整的學(xué)生選課系統(tǒng)源碼_第2頁
Java完整的學(xué)生選課系統(tǒng)源碼_第3頁
Java完整的學(xué)生選課系統(tǒng)源碼_第4頁
Java完整的學(xué)生選課系統(tǒng)源碼_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Java完整的學(xué)生選課系統(tǒng)源碼需求分析:寫一個較為嚴(yán)謹(jǐn)?shù)膶W(xué)生選課系統(tǒng),實現(xiàn)學(xué)生可以選擇多門選課課程,并將有效選課結(jié)果保存到數(shù)據(jù)庫。學(xué)生需要登錄后,才能選課。讓學(xué)生可以在選課系統(tǒng)通過多種方式查詢到要選的課程信息。/選課規(guī)則:1、每個學(xué)生可以選多門課程,多次選課的總學(xué)分不能超過6學(xué)分;2、不能重復(fù)選擇一門課程;3、每一門課程的選課人數(shù)都有數(shù)量限制,當(dāng)某門課程的選課名額滿時,則應(yīng)另選課程。4、憑用戶名和密碼登錄,通過提交某一課程號來選課/總體設(shè)計方案:建立三個類:登錄類register,選課類studentChooseCourse,數(shù)據(jù)庫工具類JDBCUtil;一個SQL腳本文件用于生成數(shù)據(jù)庫表結(jié)構(gòu)

2、和初始記錄,以搭建數(shù)據(jù)庫環(huán)境。登錄類register類,負(fù)責(zé)對用戶的身份進(jìn)行驗證;工具類JDBCUtil用于實現(xiàn)連接,你可調(diào)用JDBCUtil的getConnection()方法等到鏈接。選課類studentChooseCourse用于,實現(xiàn)選課功能。其中包括幾個主要方法:1、actionPerformed(ActionEvent) 用于監(jiān)聽用戶“查詢”和“提交”操作,并負(fù)責(zé)調(diào)用各種方法對其進(jìn)行處理2、createSearchCourse()用于產(chǎn)生圖形用戶界面3、processBeforeCommit()用于對用戶的“提交”查找進(jìn)行驗證,剔除無效的用戶操作4、tryCommit()負(fù)責(zé)對有效

3、的“提交”操作,進(jìn)一步處理,并將有效的操作結(jié)果時時保存到數(shù)據(jù)庫,并更新數(shù)據(jù)庫原有信息/本程序用到的知識點:數(shù)據(jù)庫連接JDBC;SQL建表、插入輸入、動態(tài)查詢;圖形用戶界面的產(chǎn)生以及處理查詢結(jié)果集并較好顯示;程序設(shè)計基礎(chǔ)知識。 /代碼如下:import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.*;import javax.swing.*;import javax.swing.table.DefaultTableModel;i

4、mport school.schoolPicture.JdbcUtil;public class StudentChooseCourse extends JFrame implements ActionListener JTextField jtfSearch = new JTextField(11);String columnNames = new String "課程ID", "課程名", "學(xué)時", "學(xué)分", "學(xué)期", "性質(zhì)" ;DefaultTableModel

5、 dtmSearch = new DefaultTableModel(columnNames, 27);JTable jtSearch = new JTable(dtmSearch);JScrollPane jspSearch = new JScrollPane(jtSearch);JComboBox jcbSearch = new JComboBox();JTextField jtfSelectedCourse = new JTextField(10);Connection con = null;PreparedStatement ps = null;ResultSet rs = null;

6、private static String usrName;private static String passwrd;/在構(gòu)造方法中添加兩個參數(shù)。以便在"提交"時,將學(xué)生的身份連同所選的課程,一同記錄在學(xué)生選課表中。public StudentChooseCourse(String usrName, String passwrd) createSearchCourse();this.usrName = usrName;this.passwrd = passwrd;public String getUsrName() return usrName;public void s

7、etUsrName(String usrName) this.usrName = usrName;public String getPasswrd() return passwrd;public void setPasswrd(String passwrd) this.passwrd = passwrd; /根據(jù)用戶的時間,做出相應(yīng)的反映public void actionPerformed(ActionEvent e) String str = e.getActionCommand();/清空結(jié)果顯示區(qū)中的內(nèi)容,如果有的話。if ("查詢".trim().equals(s

8、tr) int k = 1;while (k < 10) for (int i = 1; i < 7; i+) jtSearch.setValueAt(null, k - 1, i - 1);k+;/調(diào)用下面的這個方法,在數(shù)據(jù)庫中進(jìn)行查找,并將結(jié)果顯示在表格中。searchAvailableCourse(); else if ("提交".equals(str) /processBeforeCommit()對用戶選課操作進(jìn)行有效性檢驗;/剔除無效操作:如輸入無效的課程號,或已經(jīng)選擇了某一課程,已經(jīng)選滿的6學(xué)分等各種情況boolean effect=processB

9、eforeCommit(); /如果課程存在,且該學(xué)生具有選擇該課程的資格,即effect為true,進(jìn)入正式提交程序(tryCommit()if(effect=true)tryCommit();/對用戶選課操作進(jìn)行有效性檢驗;public boolean processBeforeCommit()/清空原結(jié)果顯示區(qū)中的內(nèi)容,如果有的話。int k = 1;while (k < 10) for (int i = 1; i < 7; i+) jtSearch.setValueAt(null, k - 1, i - 1);k+;/取得用戶輸入的課程號String userInput =

10、 jtfSelectedCourse.getText().toString().trim().toLowerCase();/無效操作1:在數(shù)據(jù)庫中的coursexx表中查詢該課程號。如果不存在該課程,給出提示。String sql = "select cno from coursexx where cno=? "boolean flagCourseExist = false;try ps = con.prepareStatement(sql);ps.setString(1, userInput);rs = ps.executeQuery();flagCourseExist

11、= rs.next(); catch (Exception eC) eC.printStackTrace();if (!flagCourseExist) JOptionPane.showMessageDialog(null, "該課程不存在,請重新輸入");return false;/判斷該學(xué)生選修課已選課程的總學(xué)分是否小于6;/無效操作2:如果已有選課記錄,并且總學(xué)分大于6學(xué)分,該學(xué)生不能在選了。PreparedStatement ps = null;sql = "select sum(grade) "+ "from (select x.sn

12、ame , o,k.grade grade "+ "from coursexx k join choicesxx x "+ "on o=o and x.sname=?) result"String grade =null;try ps = con.prepareStatement(sql);ps.setString(1, usrName);rs = ps.executeQuery();while (rs.next() grade = rs.getString(1);if(grade=null)grade="0" catch

13、(Exception rrr) rrr.printStackTrace();System.out.println("總學(xué)分:" + grade);if (Integer.parseInt(grade) > 6) JOptionPane.showMessageDialog(null, "你已經(jīng)選滿6學(xué)分,系統(tǒng)將退出");this.setVisible(false);return false;/無效操作3:課程該學(xué)生已經(jīng)選擇了某課程,則不能再選該課程了。sql = "select * from choicesxx where sname=?

14、and cno=?"boolean flag = false;try ps = con.prepareStatement(sql);ps.setString(1, this.getUsrName();ps.setString(2, userInput);rs = ps.executeQuery();flag = rs.next(); catch (Exception eaa) eaa.printStackTrace();if (flag) JOptionPane.showMessageDialog(null, "你已經(jīng)選擇了該課程。請另選課程");return f

15、alse;/如果以上無效操作都不存在,則返回true,意為這是一個準(zhǔn)有效操作return true;/對有效的提交操作的進(jìn)行處理public void tryCommit() / userInput為用戶輸入的課程ID.String userInput = jtfSelectedCourse.getText().toString().trim().toLowerCase();/ if course still available(count<MAX_STUDENT),save result./ else if course not available,show Message to st

16、udent.PreparedStatement ps;String sql = "select (Max-selectedCount) as RemainedCount "+ "from Coursexx where cno=?"try ps = con.prepareStatement(sql);/ 取得學(xué)生ID或名字,將課程ID存入學(xué)生選課表choicesxxps.setString(1, userInput);rs = ps.executeQuery();ResultSetMetaData meta = rs.getMetaData();int c

17、ols = meta.getColumnCount();int RemainedCount = -1;while (rs.next() RemainedCount = rs.getInt(1);System.out.println("RemainedCount:" + RemainedCount);/如果該課程還有選擇的名額,提示單項選課操作成功。if (RemainedCount > 0) / save studentId and courseId to student-course table./ this.getUsrName();userInputsql =

18、"insert into choicesxx values(?,?)"ps = con.prepareStatement(sql);ps.setString(1, this.getUsrName();ps.setString(2, userInput);ps.executeUpdate();JOptionPane.showMessageDialog(null, "選課成功: " + this.getUsrName()+ " 選了" + userInput + "." + "" + "

19、還有 " + RemainedCount+ " 人可以選該課程。");/ 更新課程中已選該課程的人數(shù):即將可選該課程的人數(shù)減去1個人。sql = "update CourseXX set selectedCount=selectedCount+1 where cno=?"ps = con.prepareStatement(sql);ps.setString(1, userInput);ps.executeUpdate();mit();/如果該課程已經(jīng)沒有選擇名額,提示重新選課 catch (Exception es) es.printStack

20、Trace();try con.rollback(); catch (Exception ey) ey.printStackTrace();/對用戶查詢課程信息,進(jìn)行處理,并顯示查詢結(jié)果public void searchAvailableCourse() / 讓程序自動選擇連接的是Oracle或SqlServer.if (JDBCUtil.getConnection() != null) System.out.println(JDBCUtil.getConnection();con = JDBCUtil.getConnection(); else con = JdbcUtil.getConn

21、ection();/userInput取得用戶輸入的信息,selectedItem取得用戶選擇的查詢方式String userInput = jtfSearch.getText().toString().trim().toLowerCase();String selectedItem = jcbSearch.getSelectedItem().toString().trim();System.out.println("User search:" + userInput);System.out.println("selectedItem:" + selec

22、tedItem);String sql = null;/按用戶查詢方式,如按課程名,課程ID或?qū)W時的查詢進(jìn)行處理;并在表格中實現(xiàn)結(jié)果try if ("課程名".equals(selectedItem) sql = "select cno,cname,hour,grade,term,isNeed from CourseXX where cname = ?"ps = con.prepareStatement(sql);ps.setString(1, userInput); else if ("課程ID".equals(selectedIt

23、em) sql = "select cno,cname,hour,grade,term,isNeed from CourseXX where cno = ?"ps = con.prepareStatement(sql);ps.setString(1, userInput); else if ("學(xué)時".equals(selectedItem) sql = "select cno,cname,hour,grade,term,isNeed from CourseXX where hour = ?"ps = con.prepareState

24、ment(sql);ps.setInt(1, Integer.parseInt(userInput); else if ("學(xué)分".equals(selectedItem) sql = "select cno,cname,hour,grade,term,isNeed from CourseXX where grade = ?"ps = con.prepareStatement(sql);ps.setInt(1, Integer.parseInt(userInput); else if ("學(xué)期".equals(selectedItem

25、) sql = "select cno,cname,hour,grade,term,isNeed from CourseXX where term = ?"ps = con.prepareStatement(sql);ps.setString(1, userInput);System.out.println(sql);rs = ps.executeQuery();mit();ResultSetMetaData meta = rs.getMetaData();int cols = meta.getColumnCount();String result = null;int k

26、 = 1;boolean flag = false;/將查詢結(jié)果以表格的形式顯示出來while (rs.next() for (int i = 1; i <= cols; i+) result = rs.getString(i);System.out.println(result);jtSearch.setValueAt(result, k - 1, i - 1);k+;flag = true;/如果查詢結(jié)果集為空,提示用戶沒有該課程if (flag = false) JOptionPane.showMessageDialog(null, "該課程不存在,請重新輸入"

27、);return; catch (Exception ex) ex.printStackTrace();try con.rollback(); catch (Exception er) er.printStackTrace();/產(chǎn)生圖形用戶界面,以便用戶操作public void createSearchCourse() this.setLayout(new GridLayout(3, 1);JPanel jp1 = new JPanel();jp1.setLayout(new GridLayout(4, 1);JPanel jp2 = new JPanel();JPanel jp3 = n

28、ew JPanel();JPanel jp10 = new JPanel();JPanel jp11 = new JPanel();JPanel jp12 = new JPanel();JPanel jp13 = new JPanel();JLabel jlSearch = new JLabel(" 學(xué) 生 選 課 系 統(tǒng) ");jp11.add(jlSearch);jcbSearch.addItem(new String("課程名");jcbSearch.addItem(new String("課程ID");jcbSearch.ad

29、dItem(new String("學(xué)時");jcbSearch.addItem(new String("學(xué)分");jcbSearch.addItem(new String("學(xué)期");jp12.add(jtfSearch);jp12.add(jcbSearch);JButton jbOK = new JButton("查詢");jbOK.addActionListener(this);jbOK.setSize(90, 20);jp13.add(jbOK);jp1.add(jp10);jp1.add(jp11);j

30、p1.add(jp12);jp1.add(jp13);jp2.add(jspSearch);JLabel jlSelectedCourse = new JLabel("請輸入課程ID:");JButton jbSelectedCourse = new JButton("提交");jbSelectedCourse.addActionListener(this);jp3.add(jlSelectedCourse);jp3.add(jtfSelectedCourse);jp3.add(jbSelectedCourse);this.add(jp1);this.a

31、dd(jp2);this.add(jp3);this.setVisible(true);this.setSize(485, 600);/當(dāng)某學(xué)生有效登錄后,啟動程序(將學(xué)生的登錄信息也傳過來,以便保存選課操作時使用)public static void main(String args) /String usrName = "xuliang"/String passwrd = "123"new StudentChooseCourse(usrName, passwrd);/-以下為搭建學(xué)生選課系統(tǒng)的SQL腳本文件。只需運行一次,就可有完整的數(shù)據(jù)庫表結(jié)構(gòu)和初

32、始記錄。 /-/該腳本針對SQLserver;Oracle的SQL腳本類似,只需將將數(shù)據(jù)類型如varchar改為varchar2,int改為number等-table1: registerXU 登錄表drop table registerXu;create table registerXu (id varchar(20),userName varchar(20),passWord varchar(20),identify varchar(20);insert into registerXu values('s001','xuliang','123'

33、;,'學(xué)生');insert into registerXu values('s002','xuliang2','1234','學(xué)生');insert into registerXu values('j001','jack','12345','學(xué)生');insert into registerXu values('001','user','user','學(xué)生');insert into r

34、egisterXu values('z001','zlm','corejava','老師');-String sql = "select * from registerXu "-+ "where userName=? and passWord=? and identify=?"-table 2:Coursexx課程表drop table Coursexx;create table Coursexx(cno varchar(20) primary key,cname varchar(20),h

35、our Int,grade Int,term varchar(20),isNeed varchar(20), selectedCount Int ,Max Int);insert into Coursexx values('c001','CoreJava',50,5,'201007','NoNecessary',0,50);insert into Coursexx values('c002','XML',20,2,'201008','NoNecessary',0,40

36、);insert into Coursexx values('c003','HIBERNATE',20,4,'201008','NoNecessary',0,30);insert into Coursexx values('c004','SQL',20,4,'201006','NoNecessary',0,5);insert into Coursexx values('c005','JDBC',20,2,'201008'

37、,'NoNecessary',0,3);insert into Coursexx values('c006','AJAX',20,2,'201010','NoNecessary',0,1);insert into Coursexx values('c007','JSP',100,8,'201009','NoNecessary',0,1-sql = "select cno,cname,hour,grade,term,isNeed from Co

38、urseXX where cname = ?"  -table 3:學(xué)生表-drop table studentxx;create table studentxx(sid varchar(20),sname varchar(20) primary key,sex varchar(20),birthday varchar(20),className varchar(20), image varchar(20);insert into studentxx values('s001','xuliang','male','19

39、901124','sd1003','good');insert into studentxx values('s002','xuliang2','male','19851124','sd0910','good');insert into studentxx values('j001','jack','male','19881124','sd1003','good')

40、;insert into studentxx values('001','user','male','19901124','sd1005','good');insert into studentxx values('s003','sisi','female','19880124','sd1007','good');insert into studentxx values('as003',&

41、#39;crystal','female','19880124','asd1007','good');-table 4:choices學(xué)生選課表drop table choicesxx;create table choicesxx(sname varchar(20) references studentxx(sname),cno varchar(20) references coursexx(cno);-判斷某一個學(xué)生已經(jīng)選的課程的總學(xué)分是否小于6分/-用戶登錄類 -/用途:驗證用戶是否具有登錄系統(tǒng)的資格-package

42、school;import javax.swing.*;import school.schoolPicture.JdbcUtil;import java.sql.*;import java.awt.*;import java.awt.event.*;public class Register implements ActionListener JFrame jf = new JFrame("學(xué)生成績管理與選課系統(tǒng)");JTextField jtfUserName = new JTextField(10);JPasswordField jpfPassWord = new JP

43、asswordField(10);JComboBox identify = new JComboBox();/constructorpublic Register() CreateRegisterGUI();/ deal with user action, when user check:"登錄","取消"or "注冊"public void actionPerformed(ActionEvent e) String str = e.getActionCommand();if (str.equalsIgnoreCase("登

44、錄") /當(dāng)用戶點擊登錄時,調(diào)用以下方法去數(shù)據(jù)庫做匹配processLogin(); else if (str.equalsIgnoreCase("取消") jtfUserName.setText("");jpfPassWord.setText(""); else if (str.equalsIgnoreCase("注冊") new CreateLogin();/當(dāng)用戶點擊登錄時,調(diào)用以下方法去數(shù)據(jù)庫做匹配public void processLogin() / create connection to

45、the database.Connection con = null;/ Connection con = JDBCUtil.getConnection();/讓程序自動連接相應(yīng)的數(shù)據(jù)庫,以避免連接數(shù)據(jù)庫時頻繁改動連接程序if (JdbcUtil.class = null) /連接達(dá)內(nèi)Oracle數(shù)據(jù)庫con = JdbcUtil.getConnection(); else /連接本地SQLSERVER數(shù)據(jù)庫con = JDBCUtil.getConnection();/ write sql sentenceString usrName = jtfUserName.getText().trim

46、();String passwrd = new String(jpfPassWord.getPassword().trim();String ident = identify.getSelectedItem().toString().trim();String sql = "select * from registerXu "+ "where userName=? and passWord=? and identify=?"System.out.println(usrName + ":" + passwrd + ":&quo

47、t; + ident);/ create object of PreparedStatementtry PreparedStatement ps = con.prepareStatement(sql);/ Prepare parameter for the sqlps.setString(1, usrName);ps.setString(2, passwrd);ps.setString(3, ident);/ send parameter to compiler to compile.ResultSet rs = ps.executeQuery();StringBuffer sb = new

48、StringBuffer("");ResultSetMetaData meta = rs.getMetaData();int cols = meta.getColumnCount();/you can use another simple way to check whether the people has records in database:/define a boolean flag=false, if has record change it/to true;otherwise, if flag=flase,showMessage("Input ERR

49、OR")while (rs.next() for (int i = 1; i < cols; i+) sb.append(meta.getColumnName(i);sb.append(rs.getString(i); if (sb.length() < 1) JOptionPane.showMessageDialog(null, "用戶名或密碼錯誤"); else if (sb.length() >= 1) if (ident.equals("student") /if he or she is a student, and

50、 usrName-passwrd alright, then go to 學(xué)生選課系統(tǒng)new StudentChooseCourse(usrName, passwrd);jf.setVisible(false);/ new StudentEntered(); else if (ident.equals("teacher") / new TeacherEntered(usrName,passwrd);new TeacherEntered();jf.setVisible(false); else if (ident.equals("admin") / go

51、to administrator pages. catch (Exception er) er.printStackTrace();/當(dāng)用戶點擊登錄時,調(diào)用以下方法去數(shù)據(jù)庫做匹配public void processLogin() / create connection to the database.Connection con = null;/ Connection con = JDBCUtil.getConnection();/讓程序自動連接相應(yīng)的數(shù)據(jù)庫,以避免連接數(shù)據(jù)庫時頻繁改動連接程序if (JdbcUtil.class = null) /連接達(dá)內(nèi)Oracle數(shù)據(jù)庫con = Jdb

52、cUtil.getConnection(); else /連接本地SQLSERVER數(shù)據(jù)庫con = JDBCUtil.getConnection();/ write sql sentenceString usrName = jtfUserName.getText().trim();String passwrd = new String(jpfPassWord.getPassword().trim();String ident = identify.getSelectedItem().toString().trim();String sql = "select * from regi

53、sterXu "+ "where userName=? and passWord=? and identify=?"System.out.println(usrName + ":" + passwrd + ":" + ident);/ create object of PreparedStatementtry PreparedStatement ps = con.prepareStatement(sql);/ Prepare parameter for the sqlps.setString(1, usrName);ps.setString(2, passwrd);ps.setString(3, ident);/ send parameter to compiler to compile.ResultSet rs = ps.executeQuery();StringBuffer sb = new StringBuffer("");ResultSetMetaData meta

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論