最新Java完整的学生选课系统源码.docx
- 文档编号:3441948
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:18
- 大小:22.54KB
最新Java完整的学生选课系统源码.docx
《最新Java完整的学生选课系统源码.docx》由会员分享,可在线阅读,更多相关《最新Java完整的学生选课系统源码.docx(18页珍藏版)》请在冰豆网上搜索。
最新Java完整的学生选课系统源码
Java完整的学生选课系统源码
需求分析:
写一个较为严谨的学生选课系统,实现学生可以选择多门选课课程,并将有效选课结果保存到数据库。
学生需要登录后,才能选课。
让学生可以在选课系统通过多种方式查询到要选的课程信息。
//选课规则:
1、每个学生可以选多门课程,多次选课的总学分不能超过6学分;2、不能重复选择一门课程;3、每一门课程的选课人数都有数量限制,当某门课程的选课名额满时,则应另选课程。
4、凭用户名和密码登录,通过提交某一课程号来选课
//总体设计方案:
建立三个类:
登录类register,选课类studentChooseCourse,数据库工具类JDBCUtil;一个SQL脚本文件用于生成数据库表结构和初始记录,以搭建数据库环境。
登录类register类,负责对用户的身份进行验证;工具类JDBCUtil用于实现连接,你可调用JDBCUtil的getConnection()方法等到链接。
选课类studentChooseCourse用于,实现选课功能。
其中包括几个主要方法:
1、actionPerformed(ActionEvent)用于监听用户“查询”和“提交”操作,并负责调用各种方法对其进行处理
2、createSearchCourse()用于产生图形用户界面
3、processBeforeCommit()用于对用户的“提交”查找进行验证,剔除无效的用户操作
4、tryCommit()负责对有效的“提交”操作,进一步处理,并将有效的操作结果时时保存到数据库,并更新数据库原有信息
//本程序用到的知识点:
数据库连接JDBC;SQL建表、插入输入、动态查询;图形用户界面的产生以及处理查询结果集并较好显示;程序设计基础知识。
//代码如下:
importjava.awt.GridLayout;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.sql.*;
importjavax.swing.*;
importjavax.swing.table.DefaultTableModel;
importschool.schoolPicture.JdbcUtil;
publicclassStudentChooseCourseextendsJFrameimplementsActionListener{
JTextFieldjtfSearch=newJTextField(11);
String[]columnNames=newString[]{"课程ID","课程名","学时","学分","学期","性质"};
DefaultTableModeldtmSearch=newDefaultTableModel(columnNames,27);
JTablejtSearch=newJTable(dtmSearch);
JScrollPanejspSearch=newJScrollPane(jtSearch);
JComboBoxjcbSearch=newJComboBox();
JTextFieldjtfSelectedCourse=newJTextField(10);
Connectioncon=null;
PreparedStatementps=null;
ResultSetrs=null;
privatestaticStringusrName;
privatestaticStringpasswrd;
//在构造方法中添加两个参数。
以便在"提交"时,将学生的身份连同所选的课程,一同记录在学生选课表中。
publicStudentChooseCourse(StringusrName,Stringpasswrd){
createSearchCourse();
this.usrName=usrName;
this.passwrd=passwrd;
}
publicStringgetUsrName(){
returnusrName;
}
publicvoidsetUsrName(StringusrName){
this.usrName=usrName;
}
publicStringgetPasswrd(){
returnpasswrd;
}
publicvoidsetPasswrd(Stringpasswrd){
this.passwrd=passwrd;
}
//根据用户的时间,做出相应的反映
publicvoidactionPerformed(ActionEvente){
Stringstr=e.getActionCommand();
//清空结果显示区中的内容,如果有的话。
if("查询".trim().equals(str)){
intk=1;
while(k<10){
for(inti=1;i<7;i++){
jtSearch.setValueAt(null,k-1,i-1);
}
k++;
}
//调用下面的这个方法,在数据库中进行查找,并将结果显示在表格中。
searchAvailableCourse();
}elseif("提交".equals(str)){
//processBeforeCommit()对用户选课操作进行有效性检验;
//剔除无效操作:
如输入无效的课程号,或已经选择了某一课程,已经选满的6学分等各种情况
booleaneffect=processBeforeCommit();
//如果课程存在,且该学生具有选择该课程的资格,即effect为true,进入正式提交程序(tryCommit())
if(effect==true)
{tryCommit();}
}
}
//对用户选课操作进行有效性检验;
publicbooleanprocessBeforeCommit(){
//清空原结果显示区中的内容,如果有的话。
intk=1;
while(k<10){
for(inti=1;i<7;i++){
jtSearch.setValueAt(null,k-1,i-1);
}
k++;
}
//取得用户输入的课程号
StringuserInput=jtfSelectedCourse.getText().toString().trim()
.toLowerCase();
//无效操作1:
在数据库中的coursexx表中查询该课程号。
如果不存在该课程,给出提示。
Stringsql="selectcnofromcoursexxwherecno=?
";
booleanflagCourseExist=false;
try{
ps=con.prepareStatement(sql);
ps.setString(1,userInput);
rs=ps.executeQuery();
flagCourseExist=rs.next();
}catch(ExceptioneC){
eC.printStackTrace();
}
if(!
flagCourseExist){
JOptionPane.showMessageDialog(null,"该课程不存在,请重新输入");
returnfalse;
}
//判断该学生选修课已选课程的总学分是否小于6;
//无效操作2:
如果已有选课记录,并且总学分大于6学分,该学生不能在选了。
PreparedStatementps=null;
sql="selectsum(grade)"
+"from(selectx.sname,o,k.gradegrade"
+"fromcoursexxkjoinchoicesxxx"
+"ono=oandx.sname=?
)result";
Stringgrade=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(Exceptionrrr){
rrr.printStackTrace();
}
System.out.println("总学分:
"+grade);
if(Integer.parseInt(grade)>6){
JOptionPane.showMessageDialog(null,"你已经选满6学分,系统将退出");
this.setVisible(false);
returnfalse;
}
//无效操作3:
课程该学生已经选择了某课程,则不能再选该课程了。
sql="select*fromchoicesxxwheresname=?
andcno=?
";
booleanflag=false;
try{
ps=con.prepareStatement(sql);
ps.setString(1,this.getUsrName());
ps.setString(2,userInput);
rs=ps.executeQuery();
flag=rs.next();
}catch(Exceptioneaa){
eaa.printStackTrace();
}
if(flag){
JOptionPane.showMessageDialog(null,"你已经选择了该课程。
请另选课程");
returnfalse;}
//如果以上无效操作都不存在,则返回true,意为这是一个准有效操作
returntrue;
}
//对有效的提交操作的进行处理
publicvoidtryCommit(){
//userInput为用户输入的课程ID.
StringuserInput=jtfSelectedCourse.getText().toString().trim()
.toLowerCase();
//ifcoursestillavailable(count //elseifcoursenotavailable,showMessagetostudent. PreparedStatementps; Stringsql="select(Max-selectedCount)asRemainedCount" +"fromCoursexxwherecno=? "; try{ ps=con.prepareStatement(sql); //取得学生ID或名字,将课程ID存入学生选课表choicesxx ps.setString(1,userInput); rs=ps.executeQuery(); ResultSetMetaDatameta=rs.getMetaData(); intcols=meta.getColumnCount(); intRemainedCount=-1; while(rs.next()){ RemainedCount=rs.getInt (1); System.out.println("RemainedCount: "+RemainedCount); } //如果该课程还有选择的名额,提示单项选课操作成功。 if(RemainedCount>0){ //savestudentIdandcourseIdtostudent-coursetable. //this.getUsrName();userInput sql="insertintochoicesxxvalues(? ? )"; ps=con.prepareStatement(sql); ps.setString(1,this.getUsrName()); ps.setString(2,userInput); ps.executeUpdate(); JOptionPane.showMessageDialog(null,"选课成功: "+this.getUsrName() +"选了"+userInput+"."+""+"还有"+RemainedCount +"人可以选该课程。 "); //更新课程中已选该课程的人数: 即将可选该课程的人数减去1个人。 sql="updateCourseXXsetselectedCount=selectedCount+1wherecno=? "; ps=con.prepareStatement(sql); ps.setString(1,userInput); ps.executeUpdate(); mit(); //如果该课程已经没有选择名额,提示重新选课 } }catch(Exceptiones){ es.printStackTrace(); try{ con.rollback(); }catch(Exceptioney){ ey.printStackTrace(); } } } //对用户查询课程信息,进行处理,并显示查询结果 publicvoidsearchAvailableCourse(){ //让程序自动选择连接的是Oracle或SqlServer. if(JDBCUtil.getConnection()! =null){ System.out.println(JDBCUtil.getConnection()); con=JDBCUtil.getConnection(); }else{ con=JdbcUtil.getConnection(); } //userInput取得用户输入的信息,selectedItem取得用户选择的查询方式 StringuserInput=jtfSearch.getText().toString().trim().toLowerCase(); StringselectedItem=jcbSearch.getSelectedItem().toString().trim(); System.out.println("Usersearch: "+userInput); System.out.println("selectedItem: "+selectedItem); Stringsql=null; //按用户查询方式,如按课程名,课程ID或学时的查询进行处理;并在表格中实现结果 try{ if("课程名".equals(selectedItem)){ sql="selectcno,cname,hour,grade,term,isNeedfromCourseXXwherecname=? "; ps=con.prepareStatement(sql); ps.setString(1,userInput); }elseif("课程ID".equals(selectedItem)){ sql="selectcno,cname,hour,grade,term,isNeedfromCourseXXwherecno=? "; ps=con.prepareStatement(sql); ps.setString(1,userInput); }elseif("学时".equals(selectedItem)){ sql="selectcno,cname,hour,grade,term,isNeedfromCourseXXwherehour=? "; ps=con.prepareStatement(sql); ps.setInt(1,Integer.parseInt(userInput)); }elseif("学分".equals(selectedItem)){ sql="selectcno,cname,hour,grade,term,isNeedfromCourseXXwheregrade=? "; ps=con.prepareStatement(sql); ps.setInt(1,Integer.parseInt(userInput)); }elseif("学期".equals(selectedItem)){ sql="selectcno,cname,hour,grade,term,isNeedfromCourseXXwhereterm=? "; ps=con.prepareStatement(sql); ps.setString(1,userInput); } System.out.println(sql); rs=ps.executeQuery(); mit(); ResultSetMetaDatameta=rs.getMetaData(); intcols=meta.getColumnCount(); Stringresult=null; intk=1; booleanflag=false; //将查询结果以表格的形式显示出来 while(rs.next()){ for(inti=1;i<=cols;i++){ result=rs.getString(i); System.out.println(result); jtSearch.setValueAt(result,k-1,i-1); } k++; flag=true; } //如果查询结果集为空,提示用户没有该课程 if(flag==false){ JOptionPane.showMessageDialog(null,"该课程不存在,请重新输入"); return; } }catch(Exceptionex){ ex.printStackTrace(); try{ con.rollback(); }catch(Exceptioner){ er.printStackTrace(); } } //产生图形用户界面,以便用户操作 publicvoidcreateSearchCourse(){ this.setLayout(newGridLayout(3,1)); JPaneljp1=newJPanel(); jp1.setLayout(newGridLayout(4,1)); JPaneljp2=newJPanel(); JPaneljp3=newJPanel(); JPaneljp10=newJPanel(); JPaneljp11=newJPanel(); JPaneljp12=newJPanel(); JPaneljp13=newJPanel(); JLabeljlSearch=newJLabel("学生选课系统"); jp11.add(jlSearch); jcbSearch.addItem(newString("课程名")); jcbSearch.addItem(newString("课程ID")); jcbSearch.addItem(newString("学时")); jcbSearch.addItem(newString("学分")); jcbSearch.addItem(newString("学期")); jp12.add(jtfSearch); jp12.add(jcbSearch); JButtonjbOK=newJButton("查询"); jbOK.addActionListener(this); jbOK.setSize(90,20); jp13.add(jbOK); jp1.add(jp10); jp1.add(jp11); jp1.add(jp12); jp1.add(jp13); jp2.add(jspSearch); JLabeljlSelectedCourse=newJLabel("请输入课程ID: "); JButtonjbSelectedCourse=newJButton("提交"); jbSelectedCourse.addActionListener(this); jp3.add(jlSelectedCourse); jp3.add(jtfSelectedCourse); jp3.add(jbSelectedCourse); this.add(jp1); this.add(jp2); this.add(jp3); this.setVisible(true); this.setSize(485,600); } //当某学生有效登录后,启动程序(将学生的登录信息也传过来,以便保存选课操作时使用) publicstaticvoidmain(String[]args){ //StringusrName="xuliang"; //Stringpasswrd="123"; newStudentChooseCourse(usrName,passwrd); } } //---以下为搭建学生选课系统的SQL脚本文件。 只需运行一次,就可有完整的数据库表结构和初始记录。 //----------------------------------------------------------------------------------------- //该脚本针对SQLserver;Oracle的SQL脚本类似,只需将将数据类型如varchar改为varchar2,int改为number等 --table1: registerXU登录表 droptableregisterXu; createtableregisterXu(idvarchar(20),userNamevarchar(20),passWordvarchar(20),identifyvarchar(20)); insertintoregisterXuvalues('s001','xuliang','123','学生'); insertintor
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新 Java 完整 学生 选课 系统 源码
![提示](https://static.bdocx.com/images/bang_tan.gif)