山东交通学院
java语言课程设计
题 目 学生成绩管理系统
系(部): 信息科学与电气工程学院
专 业: 信息管理及信息系统
班 级: 信管111
姓 名: 田忠平
学 号: 110813125
指导教师: 庞希雨
时间:20xx年4月1日 至 4月14日 共2周
指导教师(签字)
系 主 任(签字)
20xx年 4 月 1 日
1
目 录
1设计目的及内容要求 ............ 1
2 系统总体设计 .................. 1
3 系统详细设计 .................. 2
4 运行结果及分析 ............... 17
5 参考文献 ..................... 22
2
关键词:学生成绩管理系统;存储过程;数据库;java。
1设计目的及内容要求
1、 设计目的:巩固和加深学生对高级语言程序设计课程的基本知识的理解和掌握,掌握java语言编程和程序调试的基本技能,利用java语言进行基本的软件设计,提高运用java语言解决实际问题的能力。
2、 内容要求实现学生成绩的管理(增、删、改、查询、持久化、成绩排序、成绩统计等功能),在文件中增加、删除、学生信息,根据学号查询、修改学生信息,统计功能求每个人的总分并按从高到低排序,通过这些操作对文件中的信息保存。
2 系统总体设计
成功登陆系统以后,出现成绩管理界面,系统初始化,可对学生成绩进行增加、删除、查询、修改、统计,进入相应界面进行成绩管理,退出系统自动保存本次操作内容,保存信息.
3
简易流程图:
3 系统详细设计
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.util.Vector;
import javax.swing.*;
public class
extends JFrame implements ActionListener {
Connection conn = null; //与特定数据库连接。 PreparedStatement ps; //执行sql语句。 ResultSet rs= null; //返回sql结果。
JPanel jp1,jp2,jp3; //轻量级容器
JLabel jl,jl1; //显示文本,图像。
JButton jb1,jb2,jb3,jb4,jb5,jb6; //按钮。
JTable jt ; //表格。
JTextField jtf,jtf1; //单文本框。
JScrollPane jsp =null; //滚条。
StudentModel sm=null; //创类对象。
public StudentManagement() //构造函数。
4
{
jp1=new JPanel();
jl=new JLabel("请输入名字:");
jtf=new JTextField(20);
jb1=new JButton("查询");
jb1.addActionListener(this);//注册监听器。查询按钮
jp1.add(jl);
jp1.add(jtf);
jp1.add(jb1);
jp2=new JPanel();
jb2=new JButton("添加");
jb3 =new JButton("修改");
jb4 =new JButton("删除");
jb5 =new JButton("返回");
jb2.addActionListener(this);//注册监听器。添加按钮
jb3.addActionListener(this);//注册监听器。修改按钮
jb4.addActionListener(this);//注册监听器。删除按钮
jb5.addActionListener(this);//注册监听器。删除按钮
jp2.add(jb2);
jp2.add(jb3);
jp2.add(jb4);
jp2.add(jb5);
jp3=new JPanel();
jl1=new JLabel("请输入名字:");
jtf1=new JTextField(20);
jb6=new JButton("成绩查询");
jb6.addActionListener(this);//注册监听器。查询按钮
jp3.add(jl1);
jp3.add(jtf1);
jp3.add(jb6);
sm =new StudentModel();
jt=new JTable(sm);
jsp=new JScrollPane(jt);
this.add(jsp);
this.add(jp1,BorderLayout.NORTH);
this.add(jp3,BorderLayout.WEST);
this.add(jp2,BorderLayout.SOUTH);
this.setSize(800,250);
this.setLocation(200, 200); //窗口在屏幕中的位置。 this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 进程。
5 //关闭
}
public static void main(String[] args) {
StudentManagement ta=new StudentManagement();//形成一个实例。开始段。
}
@Override
public void actionPerformed(ActionEvent e)
{
// TODO Auto-generated method stub
if(e.getSource()==jb1){ //jb1查询,e.getSource()按钮响应事件
String name=this.jtf.getText().trim(); //trim()->去掉头和尾的空格。
String sql ="select * from stuView where stuName='"+name+"'"; if(name.trim().equals("")){
sm = new StudentModel();
}
else{
sm = new StudentModel(sql);//【如何返回原窗口】;
}
jt.setModel(sm); //更换表格
}
else if(e.getSource()==jb2){ //添加 StuAddDialog sad =new StuAddDialog(this,"添加学生",true); //this->JFrame
sm =new StudentModel(); //添加成功后,返回最顶层窗口
jt.setModel(sm); //更换表格
}
else if(e.getSource()==jb3){ //修改
System.out.println("修改");
int rownum =this.jt.getSelectedRow(); //getSelectedRow()-选中其中一行,并将行数送给rownum.
if(rownum==-1){
JOptionPane.showMessageDialog(this,"请选择表格中的一行"); //弹出小对话框,
return;
}
new StudentUpdateDialog(this,"修改对话框
",true,sm,rownum);//this->JFrame
sm =new StudentModel();
jt.setModel(sm);//重置表格
}
6
else if(e.getSource()==jb4)
{
int rownum=this.jt.getSelectedRow(); //getSelectedRow()-选中其中一行,并将行数送给rownum.
if(rownum==-1)
{ JOptionPane.showMessageDialog(this,"请选择一行"); //弹出小对话框, return; } String stuId=(String)sm.getValueAt(rownum, 1); try{ Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); conn
=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mysql","sa","tian");
{
{
//trim()->去掉头和尾的空格。 try{ jtf.setText(null);//将查询完后 返回时 使但文本框中的名字消失。 sm =new StudentModel(); jt.setModel(sm); } ps=conn.prepareStatement("delete from student where stuName=?"); ps.setString(1, stuId); ps.executeUpdate(); }catch(Exception dd){ dd.printStackTrace(); } sm =new StudentModel(); jt.setModel(sm); } else if(e.getSource()==jb5) else if(e.getSource()==jb6)
String url
="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mysql"; String user = "sa";
String psword = "tian";
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//加载驱动
7
conn =DriverManager.getConnection(url,user,psword); //连接数据库
String name=this.jtf1.getText().trim();
//创建存储过程的对象
CallableStatement c=conn.prepareCall("{call dt_stu(?,?)}"); //问号将用作参数的占位
//给存储过程的第一个参数设置值 c.setString(1,name); //注册存储过程的第二个参数,java.sql.Types.INTEGER——>注册的 JDBC 类//换言之, registerOutParameter 使用的是 JDBC 类型(因此它与数据库型所对应的 java 类型。 返回的 JDBC 类型匹配)
c.registerOutParameter(2,java.sql.Types.INTEGER);
//执行存储过程 c.execute(); int in=c.getInt(2); if(in==0){ } System.out.println ("成绩是:"+in); // getXXX 方法将取回参数值 conn.close(); System.out.println("请输入你要查询的姓名:"); return;
}catch(Exception ee)
{
ee.printStackTrace();
}
/*String sql ="select * from stuView where stuName='"+name+"'"; if(name.trim().equals("")){ sm = new StudentModel();
}
else{ sm = new StudentModel(sql);//【如何返回原窗口】;
} jt.setModel(sm); //更换表格*/
8 } } }
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;
import javax.swing.table.AbstractTableModel;
public class
extends AbstractTableModel{ Vector rowData,columnNames;//表格的行,列。
Connection conn = null; //与特定数据库连接。
PreparedStatement ps;
ResultSet rs= null;
public StudentModel() //无参构造函数
{
this.init(""); //引用定义函数
}
//
public StudentModel(String sql)//有参构造函数
{
this.init(sql); //引用定义函数
}
/////////////////////////////
public void init(String sql) //自定义函数
{
if( sql.trim().equals("")) //判断传来的sql是否为空,trim()->去掉头和尾的空格。
{
sql="select stuId,stuName,stuSex,stuAge,kchName,grade from stuView";
}
columnNames = new Vector();
columnNames.add("学号");//将参数指定的组件追加到这个容器的尾部
columnNames.add("姓名");
columnNames.add("性别");
columnNames.add("年龄");
columnNames.add("课名");
columnNames.add("成绩");
9
rowData = new Vector();
try{
String url
="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mysql"; String user = "sa";
String psword = "tian";
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");//加载驱动
conn =DriverManager.getConnection(url,user,psword); //连接数据库
ps = conn.prepareStatement(sql);//用于处理预编译的SQL语句。
rs=ps.executeQuery(); //把SQL语句发送到数据库中执行,并返回。
while(rs.next())
{ Vector row1 = new Vector();
row1.add(rs.getString(1));
row1.add(rs.getString(2));
row1.add(rs.getString(3));
row1.add(rs.getInt(4));
row1.add(rs.getString(5));
row1.add(rs.getInt(6));
rowData.add(row1);
}
}catch(Exception e)
{
e.printStackTrace();
}
}
////////////////////
@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return this.columnNames.size(); //查看列有多少元素。
}
@Override
public int getRowCount() {
10
// TODO Auto-generated method stub
return this.rowData.size(); //查看行有多少元素。
}
@Override
public String getColumnName(int column) {
// TODO Auto-generated method stub
return (String)this.columnNames.get(column);
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
return ((Vector)this.rowData.get(rowIndex)).get(columnIndex); }
}
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.*;
import javax.swing.*;
public class StuAddDialog extends JDialog implements ActionListener{ JLabel jl1,jl2,jl3,jl4,jl5,jl6;
JButton jb1,jb2;
JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6;
JPanel jp1,jp2,jp3;
public StuAddDialog(Frame owner , String title , boolean modal) //构造函数,modal-》true只能操作当前窗体
{
super(owner,title,modal);
jl1 = new JLabel("学号"); //静态文本,图片
11
jl2 = new JLabel("姓名");
jl3 = new JLabel("性别");
jl4 = new JLabel("年龄");
jl5 = new JLabel("课名");
jl6 = new JLabel("成绩");
jtf1 = new JTextField();
jtf2 = new JTextField();
jtf3 = new JTextField();
jtf4 = new JTextField();
jtf5 = new JTextField();
jtf6 = new JTextField();
jb1 = new JButton("添加");
jb2 = new JButton("取消");
jp1 = new JPanel();
jp2 = new JPanel();
jp3 = new JPanel();
jp1.setLayout(new GridLayout(7,1));// jp2.setLayout(new GridLayout(7,1));
jp1.add(jl1);
jp1.add(jl2);
jp1.add(jl3);
jp1.add(jl4);
jp1.add(jl5);
jp1.add(jl6);
jp2.add(jtf1);
jp2.add(jtf2);
jp2.add(jtf3);
jp2.add(jtf4);
jp2.add(jtf5);
jp2.add(jtf6);
jp3.add(jb1);
jp3.add(jb2);
this.add(jp1,BorderLayout.WEST); this.add(jp2,BorderLayout.CENTER); this.add(jp3,BorderLayout.SOUTH);
jb1.addActionListener(this); //注册监听 jb2.addActionListener(this);
12
this.setSize(300, 200);
this.setLocation(200, 300);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == jb1)
{
Connection conn=null;
PreparedStatement ps=null;
PreparedStatement pss=null;
try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
conn =
DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mysql","sa", "tian");
ps = conn.prepareStatement("insert into student values (?,?,?,?)"); //预编译
String ss=this.jtf1.getText().trim();
String sss="Id";
ps.setString(1,this.jtf1.getText().trim());
ps.setString(2,this.jtf2.getText().trim());
ps.setString(3,this.jtf3.getText().trim());
ps.setInt(4,Integer.parseInt(this.jtf4.getText().trim())); //对int型的处理
pss = conn.prepareStatement("insert into grade1 values (?,?,?,?)"); //预编译
pss.setString(1,ss);
pss.setString(2,sss);
pss.setString(3,this.jtf5.getText().trim());
pss.setInt(4,Integer.parseInt(this.jtf6.getText().trim())); //对int型的处理
int i= ps.executeUpdate(); //一个指示受影响的行数的 int,如果使用 DDL 语句,则为 0。
int j= pss.executeUpdate();
if(i != 0&&j!=0 ){
System.out.println("添加完成");
}else{
13
System.out.println("添加失败");
}
}catch(Exception es){
es.printStackTrace();
}
this.dispose();//释放由该window,其子组件及其拥有的所有子组件使用的所有本机屏幕资源。
}
else if(e.getSource() == jb2)
{
this.dispose();
}
}
}
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.*;
public class StudentUpdateDialog extends JDialog implements
ActionListener{
JLabel jl1, jl2,jl3, jl4, jl5 ,jl6;
JButton jb1,jb2;
JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6;
JPanel jp1,jp2,jp3;
public StudentUpdateDialog(Frame owner,String title,boolean
model,StudentModel sm,int rownum){ //构造函数
super(owner,title, model); //作用对象是直接父类。
jl1=new JLabel("学号");
jl2=new JLabel("姓名");
jl3=new JLabel("性别");
jl4=new JLabel("年龄");
jl5=new JLabel("课名");
jl6=new JLabel("成绩");
jtf1=new JTextField();
jtf2=new JTextField();
jtf3=new JTextField();
jtf4=new JTextField();
14
jtf5=new JTextField();
jtf6=new JTextField();
jtf1.setText((String)sm.getValueAt(rownum,0)); //rownum:行,0:列。getValueAt()获得指定的表格中的数据。
jtf1.setEditable(false); //使调用这个函数的控件不能被编辑,如果设为true或者不调用这个函数,则控件可以编辑.
jtf2.setText((String)sm.getValueAt(rownum,1));
jtf3.setText((String)sm.getValueAt(rownum,2));
jtf4.setText(sm.getValueAt(rownum,3)+"");
jtf5.setText((String)sm.getValueAt(rownum,4));
jtf6.setText(sm.getValueAt(rownum,5)+"");
jb1=new JButton ("修改");
jb2=new JButton ("取消");
jp1=new JPanel();
jp2=new JPanel();
jp3=new JPanel();
//设置布局
jp1.setLayout(new GridLayout(7,1));
jp2.setLayout(new GridLayout(7,1));
//添加组件
jp1.add(jl1);
jp1.add(jl2);
jp1.add(jl3);
jp1.add(jl4);
jp1.add(jl5);
jp1.add(jl6);
jp2.add(jtf1);
jp2.add(jtf2);
jp2.add(jtf3);
jp2.add(jtf4);
jp2.add(jtf5);
jp2.add(jtf6);
jp3.add(jb1);
jp3.add(jb2);
//布局
this.add(jp1,BorderLayout.WEST);
this.add(jp2,BorderLayout.CENTER);
this.add(jp3,BorderLayout.SOUTH);
//注册监听
jb1.addActionListener(this);
jb2.addActionListener(this);
15
//展现
this.setSize(300,200);//调整组件大小(width,height)
this.setLocation(200, 200); //窗口在屏幕中的位置。
this.setVisible(true);//根据参数的值显示或隐藏该window
}
@Override
public void actionPerformed(ActionEvent e)
{
// TODO Auto-generated method stub
if(e.getSource()==jb1) //修改
{
Connection ct =null; //接口 创建PreparedStatement的对象
PreparedStatement ps =null; //预编译SQL语句,并调用其方法传给数据库。 PreparedStatement pss =null; //预编译SQL语句,并调用其方法传给数据库。 try {
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); ct
=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mysql","sa","tian");
ps=ct.prepareStatement("update student set
stuName=?,stuSex=?,stuAge=? where stuId=?");
String ss="Id";
ps.setString(1,this.jtf2.getText());//1:位置,
this.jtf2.getText():加入的字符
ps.setString(2,this.jtf3.getText());
ps.setString(3,this.jtf4.getText());
ps.setString(4,this.jtf1.getText());
String s=this.jtf1.getText();
pss=ct.prepareStatement("update grade1 set
kchId=?,kchName=?,grade=? where stuId=?");
pss.setString(1,ss);
pss.setString(2,this.jtf5.getText());
pss.setString(3,this.jtf6.getText());
pss.setString(4,s);
int j=pss.executeUpdate(); //更新数据库
int i=ps.executeUpdate(); ////一个指示受影响的行数的 int,如果使用 DDL 语句,则为 0。
if(i==1&&j==1){
System.out.print("修改成功ok");
}else{
16
System.out.print("修改失败");
}
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
this.dispose();
}
else if(e.getSource() == jb2)
{
this.dispose();
}
}
}
4 运行结果及分析
1、成绩管理界面
对系统进行初始化,读出文件信息,监听按钮,创建其它界面对象,弹出界面
17
2、 添加信息
输入学生信息,监听添加按钮,实现向文件中添加信息,若学号以存在需要重新添加
3、 修改信息
输入学生学号,查找所有成绩,在文本框中直接修改按钮,点击修改及完成修改功能
18
4、 删除信息
输入需要删除的学生的学号,删除对应学号的学生信息
5、 查询界面
通过对输入的学号进行查询,将查到的对象的相应信息输出到文本框中
19
6、 统计信息
进入统计界面后,点击统计按钮,实现对学生成绩求总分,并按总分从大到小输出到文本区域中
参考文献
[1] 张海藩.软件工程导论. 清华大学出版社, 2010
[2] 沈洪, 施明利. VB程序设计案例汇编. 清华大学出版社, 2010
[3] 孟德欣. VB程序设计. 清华大学出版社, 2011
[4] 石志国. VB.NET数据库编程. 清华大学出版社, 2009
[5] 张友生. 软件体系结构原理、方法与实践. 清华大学出版社, 2010
20