


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、/需求分析:写一个较为严谨的学生选课系统,实现学生可以选择多门选课课程, 并将有效选课结果保存到数据库。 学生需要登录后,才能选课。让学生可以在选 课系统通过多种方式查询到要选的课程信息。/选课规如此:1每个学生可以选多门课程,屡次选课的总学分不能超过6学分;2、不能重复选择一门课程;3、每一门课程的选课人数都有数量限制,当某 门课程的选课名额满时,如此应另选课程。 4、凭用户名和密码登录,通过提交 某一课程号来选课/总体设计方案:建立三个类:登录类register ,选课类studentChooseCourse, 数据库工具类JDBCUtil ; 一个SQL脚本文件用于生成数据库表结构和初始
2、记录, 以搭建数据库环境。登录类register类,负责对用户的身份进展验证;工具类JDBCUtil用于实现连 接,你可调用JDBCUtil的getConnection()方法等到。选课类studentChooseCourse用于,实现选课功能。其中包括几个主要方法:1、actionPeformed(ActionEvent) 用于监听用户“查询"和“提交"操作, 并 负责调用各种方法对其进展处理2、createSearchCourse()用于产生图形用户界面3、processBeforemit()用于对用户的“提交"查找进展验证,剔除无效的用户 操作4、trymi
3、t()负责对有效的“提交"操作,进一步处理,并将有效的操作结果时 时保存到数据库,并更新数据库原有信息/本程序用到的知识点:数据库连接 JDBC SQL建表、插入输入、动态查询;图 形用户界面的产生以与处理查询结果集并较好显示;程序设计根底知识。/代码如下:import java.awt.GridLayout;import java.awt.eve nt.Acti on Eve nt;import java.awt.eve nt.Actio nListe ner;import java.sql.*;import javax.swi ng.*;import javax.sw in g.
4、table.DefaultTableModel;import school.schoolPicture .J dbcUtil; public class Stude ntChooseCourse exte nds JFrame impleme ntsActi on Liste ner JTextField jtfSearch = new JTextField(11);String columnNames = new String " 课程 ID"," 课程名","学时","学 分","学期",&
5、quot;性质"DefaultTableModel dtmSearch = new DefaultTableModel(colum nN ames, 27);JTable jtSearch = new JTable(dtmSearch);JScrollPa ne jspSearch = new JScrollPa ne(jtSearch);oBox jcbSearch = new oBox();JTextField jtfSelectedCourse = new JTextField(10);Connection con = n ull;PreparedStateme nt ps =
6、 nu II;ResultSet rs = null;private static Stri ng usrName;private static String passwrd;/在构造方法中添加两个参数。以便在"提交"时,将学生的身份连同所选的课程, 一同记录在学生选课表中。public Stude ntChooseCourse(Stri ng usrName, String passwrd) createSearchCourse();this.usrName = usrName;this.passwrd = passwrd;public Stri ng getUsrNam
7、e() return usrName;public void setUsrName(Stri ng usrName) this.usrName = usrName;public String getPasswrd() return passwrd;public void setPasswrd(Stri ng passwrd) this.passwrd = passwrd;/根据用户的时间,做出相应的反映public void actio nPeformed(Actio nEve nt e) Stri ng str = e.getActi onman d();/清空结果显示区中的内容,如果有的话
8、。if ("查询".trim().equals(str) int k = 1;while (k < 10) for (int i = 1; i < 7; i+) jtSearch.setValueAt(null, k - 1, i - 1);k+;/调用下面的这个方法,在数据库中进展查找,并将结果显示在表格中。searchAvailableCourse(); else if (" 提交".equals(str) processBeforemit()对用户选课操作进展有效性检验;/剔除无效操作:如输入无效的课程号,或已经选择了某一课程,已经选满
9、的6学分等各种情况boolea n effect=processBeforemit();/如果课程存在,且该学生具有选择该课程的资格,即effect为true,进入正式提交程序(trymit()if(effect=true)trymit();/对用户选课操作进展有效性检验;public boolea n processBeforemit()/清空原结果显示区中的内容,如果有的话。int k = 1;while (k < 10) for (int i = 1; i < 7; i+) jtSearch.setValueAt(null, k - 1, i - 1);k+;/取得用户输入的
10、课程号Stri ng userl nput = jtfSelectedCourse.getText().toStri ng().trim().toLowerCase();/无效操作1:在数据库中的coursexx表中查询该课程号。如果不存在该课程, 给出提示。Stri ng sql = "select o from coursexx where o=?"boolea n flagCourseExist = false;try ps = con .prepareStateme nt(sql);ps.setStri ng(1, userl nput);rs = ps.execu
11、teQuery(); flagCourseExist = rs. next(); catch (Excepti on eC) eC.pri ntStackTrace();if (flagCourseExist) JOptionPane.showMessageDialog(null,"该课程不存在,请重新输入");return false;/判断该学生选修课已选课程的总学分是否小于6;/无效操作2:如果已有选课记录,并且总学分大于6学分,该学生不能在选了PreparedStateme nt ps = nu II;sql = "select sum(grade)&qu
12、ot;+ "from (select x.s name , x.o,k.grade grade "+ "from coursexx k join choicesxx x "+ "on k.o=x.o and x.s name二?)result"Stri ng grade =n ull;try ps = con .prepareStateme nt(sql);ps.setStri ng(1, usrName);rs = ps.executeQuery();while (rs. next() grade = rs.getStri ng(1
13、);if(grade=二nu ll)grade二"0" catch (Excepti on rrr) rrr.pri ntStackTrace();System.out.pri ntl n(" 总学分:"+ grade);if (In teger.parse In t(grade) > 6) JOptio nPan e.showMessageDialog( null,"你已经选满 6 学分,系统将退出");this.setVisible(false);return false;/无效操作3:课程该学生已经选择了某课程,如此不能再
14、选该课程了。sql = "select * from choicesxx where sn ame=? and o=?"boolea n flag = false;try ps = con .prepareStateme nt(sql);ps.setStri ng(1, this.getUsrName();ps.setStri ng(2, userl nput);rs = ps.executeQuery();flag = rs.n ext(); catch (Excepti on eaa) eaa.pri ntStackTrace();if (flag) JOptionPa
15、ne.showMessageDialog(null,"你已经选择了该课程。请另选课程"); return false;/如果以上无效操作都不存在,如此返回true,意为这是一个准有效操作return true;/对有效的提交操作的进展处理public void trymit() / userInput为用户输入的课程ID.Stri ng userI nput = jtfSelectedCourse.getText().toStri ng().trim().toLowerCase();/ if course still available(cou nt<MAX_STUD
16、ENT),save result./ else if course n ot available,show Message to stude nt.PreparedStateme nt ps;String sql = "select (Max-selectedCo unt) as Rema in edCo unt "+ "from Coursexx where o=?"try ps = con .prepareStateme nt(sql);/取得学生ID或名字,将课程ID存入学生选课表choicesxxps.setStri ng(1, userI np
17、ut);rs = ps.executeQuery();ResultSetMetaData meta = rs.getMetaData();int cols = meta.getColu mnCoun t();int Rema in edCo unt = -1;while (rs. next() Rema in edCo unt = rs.getI nt(1);System.out.pri ntl n("Remai nedCo un t:" + Remai nedCo un t);/如果该课程还有选择的名额,提示单项选课操作成功。if (RemainedCount >
18、0) / save stude ntld and courseId to stude nt-course table./ this.getUsrName();userl nputsql = "in sert into choicesxx values(?,?)"ps = con .prepareStateme nt(sql);ps.setStri ng(1, this.getUsrName();ps.setStri ng(2, userI nput);ps.executeUpdate();JOptio nPan e.showMessageDialog( null,"
19、;选课成功:"+ this.getUsrName()+ " 选了 " + userInput + "." + "" + "还有"+ RemainedCount+ "人可以选该课程。");/更新课程中已选该课程的人数:即将可选该课程的人数减去1个人。sql = "update CourseXX set selectedCou nt=selectedCou nt+1 where o=?"ps = con .prepareStateme nt(sql);ps.setStr
20、i ng(1, userI nput);ps.executeUpdate();con. mit();/如果该课程已经没有选择名额,提示重新选课 catch (Excepti on es) es.pri ntStackTrace();try con .rollback。; catch (Excepti on ey) ey.pri ntStackTrace();/对用户查询课程信息,进展处理,并显示查询结果public void searchAvailableCourse() /让程序自动选择连接的是 Oracle或SqlServer.if (JDBCUtil.getConnection() !=
21、 null) System.out.pri ntln(JDBCUtil.getCo nn ectio n();con = JDBCUtil.getCo nn ectio n(); else con = JdbcUtil.getC onn ecti on();/userI nput取得用户输入的信息,selectedItem取得用户选择的查询方式Stri ng userI nput = jtfSearch.getText().toStri ng().trim().toLowerCase();Stri ng selectedItem = jcbSearch.getSelectedltem().to
22、Stri ng().trim();System.out.pri ntln ("User search:" + userI nput);System.out.pri ntl n("selectedltem:" + selectedItem);Stri ng sql = nu II;/按用户查询方式,如按课程名,课程ID或学时的查询进展处理;并在表格中 实现结果try if (" 课程名".equals(selectedItem) sql = "select o,ame,hour,grade,term,isNeed from C
23、ourseXXwhere ame = ?" ps = con .prepareStateme nt(sql);ps.setStri ng(1, userI nput); else if (" 课程 ID".equals(selectedltem) sql = "select o,ame,hour,grade,term,isNeed from CourseXX where o = ?" ps = con .prepareStateme nt(sql);ps.setStri ng(1, userI nput); else if (" 学时
24、".equals(selectedItem) sql = "select o,ame,hour,grade,term,isNeed ps = con .prepareStateme nt(sql);ps.setInt(1, Integer.parseInt(userInput); else if (" 学分".equals(selectedItem) sql = "select o,ame,hour,grade,term,isNeed ps = con .prepareStateme nt(sql);ps.setInt(1, Integer.p
25、arseInt(userInput); else if (" 学期".equals(selectedItem) sql = "select o,ame,hour,grade,term,isNeed ps = con .prepareStateme nt(sql);ps.setStri ng(1, userI nput);System.out.pri ntln( sql);rs = ps.executeQuery();con. mit();ResultSetMetaData meta = rs.getMetaData(); int cols = meta.getCo
26、lu mnCoun t();Stri ng result = n ull;int k = 1;boolea n flag = false;/将查询结果以表格的形式显示出来from CourseXXwhere hour = ?"from CourseXXwhere grade = ?"from CourseXXwhere term = ?"while (rs. next() for (i nt i = 1; i <= cols; i+) result = rs.getStri ng(i); System.out.pri ntln( result); jtSea
27、rch.setValueAt(result, k - 1, i - 1);k+;flag = true;/如果查询结果集为空,提示用户没有该课程if (flag = false) JOptio nPan e.showMessageDialog( null," return;该课程不存在,请重新输入"); catch (Excepti on ex) ex.pri ntStackTrace(); try con .rollback。; catch (Excepti on er) er.pri ntStackTrace();/产生图形用户界面,以便用户操作public void
28、createSearchCourse() this.setLayout( new GridLayout(3, 1);JPa nel jp1 = new JPa nel();jp1.setLayout( new GridLayout(4, 1);JPa nel jp2 = new JPa nel();JPa nel jp3 = new JPa nel();JPanel jp10 = new JPanel();JPanel jp11 = new JPanel();JPanel jp12 = new JPanel();JPanel jp13 = new JPanel();JLabel jlSearc
29、h = new JLabel("学生选课系统 ”); jp11.add(jlSearch);jcbSearch.addltem(new String("课程名"); jcbSearch.addltem(new String("课程 ID"); jcbSearch.addltem(new String("学时"); jcbSearch.addltem(new String("学分"); jcbSearch.addltem(new String("学期"); jp12.add(jtfSea
30、rch);jp12.add(jcbSearch);utton OK = new utton(” 查询");OK.addActi on Liste ner(this); OK.setSize(90, 20);jp13.add(OK);jp1.add(jp10);jp1.add(jp11);jp1.add(jp12);jp1.add(jp13);jp2.add(jspSearch);JLabel jlSelectedCourse = new JLabel('请输入课程 ID:"); utton SelectedCourse = new utton("提交&qu
31、ot;);SelectedCourse.addAct ion Liste ner(this); jp3.add(jlSelectedCourse);jp3.add(jtfSelectedCourse);jp3.add(SelectedCourse);this.add(jp1);this.add(jp2);this.add(jp3);this.setVisible(true);this.setSize(485, 600);/当某学生有效登录后,启动程序将学生的登录信息也传过来,以便保存选课操作时使用public static void main( Stri ng args) /Stri ng u
32、srName = "xulia ng"/Stri ng passwrd = "123"new Stude ntChooseCourse(usrName, passwrd);/-以下为搭建学生选课系统的SQLW本文件。只需运行一次,就可有完整的 数据库表结构和初始记录。/该脚本针对SQLserver ; Oracle的SQL脚本类似,只需将将数据类型如varchar 改为 varchar2,int改为 number等-table1: registerXU 登录表drop table registerXu;create table registerXu (i
33、d varchar(20),userName varchar(20),passWord varchar(20),ide ntify varchar(20);in sert into registerXu values('s001','xulia ng','123','学生');in sert into registerXu values('s002','xulia ng2','1234','学生');in sert into registerXu values(
34、9;j001','jack','12345','学生');in sert into registerXu values('001','user','user','学生');in sert into registerXu values('z001','zlm','corejava','教师');-Stri ng sql = "select * from registerXu " -+ "
35、;where userName=? and passWord=? and ide ntify=?"-table 2:Coursexx 课程表drop table Coursexx;create table Coursexx(o varchar(20) primary key,ame varchar(20),hour Int, grade In t,term varchar(20),isNeed varchar(20), selectedCo unt In t ,MaxIn t);insert into Coursexxvalues('c001','CoreJa
36、va',50,5,'201007','NoNecessary',0,50);insert into Coursexxvalues('c002','XML',20,2,'201008','NoNecessary',0,40);insert into Coursexxvalues('c003','HIBERNATE',20,4,'201008','NoNecessary',0,30);insert into Coursexxvalu
37、es('c004','SQL',20,4,'201006','NoNecessary',0,5);insert into Coursexxvalues('c005','JDBC',20,2,'201008','NoNecessary',0,3);insert into Coursexx values('c006','AJAX',20,2,'201010','NoNecessaiy',0,1);insert
38、 into Coursexxvalues('c007','JSP',100,8,'201009','NoNecessary',0,1-sql = "select o,ame,hour,grade,term,isNeed from CourseXXwhere ame= ?"-table 3:学生表-drop table stude ntxx;create table studentxx(sidvarchar(20),sname varchar(20) primary key,sexvarchar(20),birt
39、hday varchar(20),className varchar(20), image varchar(20);insert into stude ntxxvalues('s001','xulia ng','male','19901124','sd1003','good');insert into stude ntxxvalues('s002','xulia ng2','male','19851124','sd0910
40、9;,'good');insert into stude ntxxvalues('j001','jack','male','19881124','sd1003','good');insert into stude ntxxvalues('001','user','male','19901124','sd1005','good');insert into stude ntxxvalues(&
41、#39;s003','sisi','female','19880124','sd1007','good');insert into stude ntxxvalues('as003','crystal','female','19880124','asd1007','good');-table 4:choices学生选课表drop table choicesxx;create table choicesxx(sn a
42、me varchar(20) refere nces stude ntxx(s name),o varchar(20) refere nces coursexx(o);-判断某一个学生已经选的课程的总学分是否小于6分/ 用户登录类/用途:验证用户是否具有登录系统的资格 package school;import javax.swi ng.*;import school.schoolPicture.JdbcUtil;import java.sql.*;import java.awt.*;import java.awt.eve nt.*;public class Register impleme
43、nts Action Liste ner JFrame jf = new JFrame(”学生成绩管理与选课系统");JTextField jtfUserName = new JTextField(10);JPasswordField jpfPassWord = new JPasswordField(10);oBox ide ntify = new oBox();/con structorpublic Register() CreateRegisterGUI();/ deal with user action, when user check:"登录","
44、;取消"or "注册"public void actio nPerformed(Actio nEve nt e) Stri ng str = e.getActi onman d();if (str.equalsIg no reCase(”登录")/当用户点击登录时,调用以下方法去数据库做匹配processLogi n(); else if (str.equalsIg noreCase(”取消")jtfUserName.setText("");jpfPassWord.setText(""); else if
45、 (str.equalsIg noreCase(”注册")new CreateLogi n();/当用户点击登录时,调用以下方法去数据库做匹配public void processLogi n() / create conn ecti on to the database.Connection con = n ull;/ Co nn ection con = JDBCUtil.getCo nn ectio n();/让程序自动连接相应的数据库,以防止连接数据库时频繁改动连接程序if (JdbcUtil.class = null) /连接达内Oracle数据库con = JdbcUti
46、l.getC onn ecti on(); else /连接本地SQLSERVER据库con = JDBCUtil.getCo nn ectio n();/ write sql sentenceStri ng usrName = jtfUserName.getText().trim();String passwrd = new String(jpfPassWord.getPassword().trim();Stri ng ide nt = ide ntify.getSelectedltem().toStri ng().trim();Stri ng sql = "select * fr
47、om registerXu "+ "where userName=? and passWord=? and ide ntify=?"System.out.pri ntl n(usrName + ":" + passwrd + ":" + ide nt);/ create object of PreparedStateme nttry PreparedStateme nt ps = con .prepareStateme nt(sql);/ Prepare parameter for the sqlps.setStri ng(
48、1, usrName);ps.setStri ng(2, passwrd);ps.setStri ng(3, ide nt);/ send parameter to piler to pile.ResultSet rs = ps.executeQuery();Strin gBuffer sb = new Strin gBuffer("");ResultSetMetaData meta = rs.getMetaData();int cols = meta.getColu mnCoun t();/you can use ano ther simple way to check
49、whether the people has records in database:/define a boolean flag=false, if has record change it/to true;otherwise, if flag=flase,showMessage("l nput ERROR")while (rs. next() for (i nt i = 1; i < cols; i+) sb.appe nd(meta.getColu mn Name(i);sb.appe nd(rs.getStri ng(i);if (sb.le ngth() &
50、lt; 1) JOptionPane.showMessageDialog(null,"用户名或密码错误"); else if (sb.le ngth() >= 1) if (ide nt.equals("stude nt") /if he or she is a stude nt, and usrName-passwrd alright, the n go to学生选课系统new StudentChooseCourse(usrName, passwrd);jf.setVisible(false);/ new Stude ntE ntered();
51、else if (ide nt.equals("teacher") / new TeacherE ntered(usrName,passwrd);new TeacherE ntered();jf.setVisible(false); else if (ide nt.equals("adm in") / go to admi ni strator pages. catch (Excepti on er) er.pri ntStackTrace();/产生图形用户界面public void CreateRegisterGUI() jf.setLayout (
52、new GridLayout(5, 1);JPa nel jp1 = new JPan el();JLabel jl1 = new JLabel("学生成绩管理系统");jp1.add(jl1);jf.add(jp1);JPa nel jp2 = new JPan el();JLabel jl2 = new JLabel(" 用户名:");jp2.add(jl2);jp2.add(jtfUserName);jf.add(jp2);JPa nel jp3 = new JPan el();/ JPasswordField jpfPassWord = new JPasswordField(10); JLabel passWord = new JLabel(" 密 码:");jp3.add(passWord);jp3.add(jpfPassWord);jf.add(jp3);JPa nel jp4 = new JPa nel();JLabel jl4 = new JLabel(&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 注册公司的租地合同范本
- 电梯装潢承包合同协议书
- 精装销售合同协议书模板
- 水质在线监测服务协议书
- 私人饭店里劳务合同范本
- 美业门店合伙协议书范本
- 防火触电交底协议书模板
- 独家冠名广告协议书范本
- 油罐车机械租赁合同范本
- 自闭症机构与家长协议书
- 销售人员个人软装备系统标准课件
- 糖化简介0623课件
- 经鼻肠梗阻导管护理课件
- DB3701-T 29-2022附件:智慧中药房建设与运行规范
- 大专毕业论文3000字格式12篇
- 人才盘点操作及应用(简版)
- 学校老师联系方式惠州市
- DBJ46-048-2018 海南省建筑工程防水技术标准
- 200个句子涵盖了高中英语3500词汇诵读加记忆
- 皮肤、斑的认识PPT课件
- 外研版九年级上册英语课文原文与翻译
评论
0/150
提交评论