一、概述
随着学校的规模不断扩大,学生数量急剧增加;面对庞大的信息量需要有一个学生管理系统来提高学生管理工作的效率。通过学生选课管理信息系统可以做到信息的规范管理、科学统计和快速査询、修改、增加、删除等,从而实现管理方面的工作量。目前社会上信息管理系统发展飞快,各个企业单位都引入了信息管理软件来管理自己日益增长的各种信息,学生管理系统也有了很大的发展,商业化的管理软件也是日益增多。本学生系统完全独立开发,力求系统功能简明、操作界面简单、易于操作。
学生信息管理系统是一个教育单位不可缺少的部分。简单易用的信管理系统不但能有效地减轻学校相员的工作负担,它的內容对于学校的决策者和管理者来说都至关重要。所以学生信息管理系统应该能够为用户提供充足的信息和快捷的査询手段。本系统是将现代化的计算机应用技术与教务工作相结合,按照正常的工作流程设计完成,为使系统在管理中发挥更大的作用,提高工作效率和工作质量。
该软件允许三种身份登录,分别是学生、教师、管理员,各自拥有不同的权限。学生可以查询个人信息、在选课的时间进行选课、查看考试成绩、查看可选课程和所属学院;教师可以查看个人信息、开课课程、选择自己课程学生的部分信息、录入学生成绩;管理员除了录入学生成绩之外,其余的功能几乎都可以实现,譬如增加、修改学生信息;以及对数据进行报表功能等等。
整个系统的研究、设计与实施基于 Window开发平台,后台使用Sql Server 2012数据库,数据源方式选的是OJBC,开发语言是Java语言,开发工具选用的是Eclipse,系统界面采用的是WinForm。
二、需求分析
数据库的数据需求是根据用户的需求与设计者对用户者的需求进行分析所得,以下是学生信息管理系统的数据需求分析:
(1)学生信息表(student)
学号sno:char(9)
姓名sname:nvarchar(8)
性别ssex:nchar(1) 男 或 女
年龄sage:int(4) 14≤sage≤24
系别sdept:nvarchar(30)
(2)课程信息表(course)
课程号cno:char(6)
课程名cname:nvarchar(50)
先行课编号cpno:char(6)
学分ccredit:smallint(2)
(3)教师信息表(teacher)
教工号tno:char(8)
姓名tname:nvarchar(8)
性别tsex:nchar(1) 男 或 女
年龄tage:int(4) 24≤sage≤60
学历teb:nvarchar(10) 学士、硕士、博士
职称tpt:nvarchar(10) 助教、讲师、副教授、教授
主讲课程一cno1: char(6)
主讲课程二cno2: char(6)
主讲课程三cno3: char(6)
(4)院系信息表(department)
系编号dno:char(3)
系名dname:varchar(30)
系主任dmanager:char(8)
(5)选课信息表(sct)
学号sno:char(9)
课程号cno:char(6)
教工号tno:char(8)
成绩grade:int(4)
(1) 用户及权限管理。提供用户管理、权限分配、登录权限验证功能,包括:
(2) 学生基本信息管理。提供学生基本信息的录入、维护、报表与查询功能,包括:
(3) 教师基本信息管理。提供教师基本信息的录入、维护、报表与查询功能,包括:
(4)学院基本信息管理。提供学院基本信息的录入、维护、报表与查询功能,包括:
(5)课程基本信息管理。提供课程基本信息的录入、维护、报表与查询功能,包括:
(6)学生选课管理:提供在规定时间选课功能:
(7)学生成绩管理。提供老师对学生考试成绩的录入、修改以及查询功能,包括:
图1.1 学生信息管理系统功能模块
(1) 每个用户分配特定的用户试图,对应其应有的访问权限
(4) 用户只能在适合他们完成工作需要的窗口中看到需要的数据
三、概念结构设计
图3.1 学生实体集
图3.2 教师实体集
图3.3 课程实体集
图3.4 学院实体集
图3.5 选课实体集
2、完整的ER图
图3.6 完整ER图
四、逻辑结构设计
student(sno,sname,ssex,sage,sdept)
图4-1 学生表
属性名 |
数据类型 |
属性描述 |
sno |
char(9) |
学号 |
sname |
nvarchar(8) |
姓名 |
ssex |
nchar(1) |
性别 |
sage |
int |
年龄 |
sdept |
varchar(30) |
学院 |
teacher(tno,tname,tsex,tage,teb,tpt,cno1,cno2,cno3)
图4-2 教师表
属性名 |
数据类型 |
属性描述 |
tno |
char(8) |
教工号 |
tname |
nvarchar(8) |
教工姓名 |
tsex |
nchar(1) |
性别 |
tage |
int |
年龄 |
teb |
nvarchar(10) |
学历 |
tpt |
nvarchar(10) |
职称 |
cno1 |
char(6) |
主讲课程1 |
cno2 |
char(6) |
主讲课程2 |
cno3 |
char(6) |
主讲课程3 |
course(cno,cname,cpno,ccredit)
图4-3 课程表
属性名 |
数据类型 |
属性描述 |
cno |
char(6) |
课程号 |
cname |
nvarchar(50) |
课程名 |
cpno |
char(6) |
先行课程 |
ccredit |
smallint |
学分 |
department(dno,dname,dmanager)
图4-4 院系表
属性名 |
数据类型 |
属性描述 |
dno |
char(3) |
系编号 |
dname |
varchar(30) |
系名 |
dmanager |
char(8) |
系主任 |
选课联系集转化的关系模式如下,属性定义如下图所示:
XuanKe(sno,cno,tno,grade)
图4-5 选课表
属性名 |
数据类型 |
属性描述 |
sno |
char(9) |
学号 |
cno |
char(6) |
课程号 |
tno |
char(8) |
教工号 |
grade |
int |
成绩 |
图4.1 关系图
五、主要模块的设计以及代码
图5-1 登录界面
关键代码:
public Start() { //构造函数
init(); //初始化界面函数
}
public static void main(String[] args) {
Start ssc = new Start(); //开启运行程序
}
@Override
public void actionPerformed(ActionEvent e) {
String username = text1.getText().trim(); //用户名输入文本框
String password = text2.getText().trim(); //密码输入文本框
if (e.getSource() == Button1) {
if (RadioButton1.isSelected()) { //选择学生身份
if (StringUntil.isEmpty(username)) {
JOptionPane.showMessageDialog(null, "用户名不能为空");
return; // 要明白加上return的作用就是下面的带代码不再运行
}
if (StringUntil.isEmpty(password)) {
JOptionPane.showMessageDialog(null, "密码不能为空");
return;
}
AdminCon ac = new AdminCon(); //连接数据库调用的函数
String sql = "select * from student where sno='" + username + "' and studentpwd='" + password + "'"; // 把sql语句传给数据库操作对象
if (ac.Login(sql)) {
this.dispose(); //关闭这个窗口
new Student(); //调用学生界面
} else {
JOptionPane.showMessageDialog(null, "用户名或密码错误!");
}
}
if (RadioButton2.isSelected()) { //选择教师身份
if (StringUntil.isEmpty(username)) {
JOptionPane.showMessageDialog(null, "用户名不能为空");
return; // 要明白加上return的作用就是下面的带代码不再运行
}
if (StringUntil.isEmpty(password)) {
JOptionPane.showMessageDialog(null, "密码不能为空");
return;
}
AdminCon ac = new AdminCon(); //连接数据库所调用的函数
String sql = "select * from teacher where tno='" + username + "' and teacherpwd='" + password + "'"; // 把sql语句传给数据库操作对象
if (ac.Login(sql)) {
this.dispose();
new Teacher();
} else {
JOptionPane.showMessageDialog(null, "用户名或密码错误!");
}
}
if (RadioButton3.isSelected()) { //选择管理员身份
if (StringUntil.isEmpty(username)) {
JOptionPane.showMessageDialog(null, "用户名不能为空");
return;
}
if (StringUntil.isEmpty(password)) {
JOptionPane.showMessageDialog(null, "密码不能为空");
return;
}
AdminCon ac = new AdminCon(); //管理员登录函数,验证登录
String sql = "select * from admin where admin='" + username + "' and adpwd='" + password + "'"; // 把sql语句传给数据库操作对象
if (ac.Login(sql)) {
this.dispose();
Admin a = new Admin();
// a.setExtendedState(a.MAXIMIZED_BOTH); 设置窗口的最大化
}
else {
JOptionPane.showMessageDialog(null, "用户名或密码错误!");
}}
}
if (e.getSource() == Button2) {
dispose(); //取消登录
}}
(2)学生选课功能
学生选课需要管理员开启学生选课功能了之后方可以进行选课功能界面,否则会提示还没到选课时间;选课功能界面含有可选课程和已选课程,学生可以根据课程名和教授名进行模糊查询,便可以查到想要选的课程,当点击选课按钮时,如果学生所选的课程不违反数据库的约束的话(譬如已选课程不能再重复选择),已选课程表当中就会刷新出刚刚选课的信息。
关键代码:
package view; //程序在view包下
public class XuanKe extends JInternalFrame implements ActionListener{ //类继承内部窗口
private JButton button; //按钮
PreparedStatement ps=null;
Connection ct=null;
ResultSet rs=null;
Statement stmt;
private JLabel lblNewLabel_2; //标签
private JLabel label;
Vector rowData,columnNames; //表1的列名
Vector rowData1,columnNames1; //表2的列名
DefaultTableModel dtm=null;
private JScrollPane scrollPane; //添加滚动条
private JTable table; //表1
private JTable table_1;
private JScrollPane scrollPane_1;
private JLabel label_1;
private JButton Button2;
private JTextField textField; //查询课程名文本框
private JTextField textField_1; //查询教师名文本框
@Override //重写
public void actionPerformed(ActionEvent e) { //监控点击按钮事件
if(e.getSource()==button) {
String s = Start.text1.getText().toString();
String s1 = table.getValueAt(table.getSelectedRow(), 0).toString(); //将选择的行转为String类型
String s2 = table.getValueAt(table.getSelectedRow(), 2).toString();
String s3 = table.getValueAt(table.getSelectedRow(), 2).toString();
String sql = "insert into sct values('"+s+"','"+s1+"','"+s2+"','','123')";
try {
stmt = ct.createStatement(); //连接数据库
int i = stmt.executeUpdate(sql);
JOptionPane.showMessageDialog(null, "选课成功!");
} catch (SQLException e1) {
JOptionPane.showMessageDialog(null, "选课失败!");
e1.printStackTrace();
}
((DefaultTableModel)table_1.getModel()).getDataVector().removeAllElements();
String sql1 = "select sct.sno,sct.cno,cname,teacher.tname,ccredit\r\n" +
"from teacher,course,sct,student\r\n" + //根据多表查询显示在表中
"where teacher.tno=sct.tno and course.cno=sct.cno and sct.sno=student.sno and sct.sno='"+Start.text1.getText().trim()+"'";
try {
ps = ct.prepareStatement(sql1);
rs=ps.executeQuery();
while(rs.next()){
//rowData可以存放多行
Vector hang=new Vector();
hang.add(rs.getString(2)); //向表中添加某一行的元素
hang.add(rs.getString(3)); //向表中添加某一行的元素
hang.add(rs.getString(4)); //向表中添加某一行的元素
hang.add(rs.getString(5)); //向表中添加某一行的元素
//加入到rowData
rowData1.add(hang);
}
} catch (SQLException e1) {
e1.printStackTrace();
}
}
if(e.getSource()==Button2) {
String text_1 = textField.getText().trim();
String text_2 = textField_1.getText().trim();
if(text_1.equals("")&&text_2.equals("")) {
JOptionPane.showMessageDialog(null, "你没有输入信息");
}else if(!text_1.equals("")&&!text_2.equals("")){
for (int i = 0; i < table.getRowCount(); i++) {
if(table.getValueAt(i, 1).toString().contains(text_1)&&table.getValueAt(i, 3).toString().contains(text_2)) {
table.setRowSelectionInterval(i,i); //设置某一行被选中
return;
}
}
}else {
JOptionPane.showMessageDialog(null, "课程名和教师名对话框都需要输入");
}
}
}
public XuanKe() { //构造函数
setTitle("\u5B66\u751F\u9009\u8BFE"); //设置标题名字
setMaximizable(true); //内置窗口可以最大化
setIconifiable(true);
setClosable(true); //设置内置窗口可以关闭
setBounds(100, 50, 589, 500); //设置窗口的大小
getContentPane().setLayout(null); //设置布局管理
JLabel label = new JLabel("\u5B66\u751F\u9009\u8BFE\u529F\u80FD");
label.setIcon(new ImageIcon(XuanKe.class.getResource("/images/\u5B66\u751F\u7BA1\u7406.png")));
label.setFont(new Font("宋体", Font.PLAIN, 16));
label.setBounds(227, 20, 145, 27);
getContentPane().add(label);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setViewportBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
scrollPane.setBounds(47, 87, 392, 170);
getContentPane().add(scrollPane);
columnNames=new Vector();
//设置列名
columnNames.add("课程号");
columnNames.add("课程名");
columnNames.add("教工号");
columnNames.add("教师名");
columnNames.add("学分");
rowData = new Vector();
table = new JTable(rowData,columnNames);
table=new JTable(rowData,columnNames){
public boolean isCellEditable(int row, int column)
{
return false;}//表格不允许被编辑
};
table.setFillsViewportHeight(true);
scrollPane.setViewportView(table);
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//加载驱动 ct=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=BigTest","sa","432156789a"); //连接数据库
ps=ct.prepareStatement("select cno,cname,tno,tname,ccredit\r\n" +
"from course,teacher\r\n" +
"where cno=cno1 or cno=cno2 or cno=cno3");
rs=ps.executeQuery();
while(rs.next()){
//rowData可以存放多行
Vector hang=new Vector();
hang.add(rs.getString(1));
hang.add(rs.getString(2));
hang.add(rs.getString(3));
hang.add(rs.getString(4));
hang.add(rs.getInt(5));
//加入到rowData
rowData.add(hang);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
button = new JButton("\u9009\u8BFE");
button.setIcon(new ImageIcon(XuanKe.class.getResource("/images/\u786E\u8BA4.png")));
button.setBounds(474, 225, 89, 32);
getContentPane().add(button);
scrollPane_1 = new JScrollPane();
scrollPane_1.setViewportBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
scrollPane_1.setBounds(50, 310, 389, 133);
getContentPane().add(scrollPane_1);
columnNames1=new Vector();
//设置列名
columnNames1.add("课程号");
columnNames1.add("课程名");
columnNames1.add("教师名");
columnNames1.add("学分");
rowData1 = new Vector();
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
ct=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=BigTest","sa","432156789a");
String sql = "select sct.sno,sct.cno,cname,teacher.tname,ccredit\r\n" +
"from teacher,course,sct,student\r\n" +
"where teacher.tno=sct.tno and course.cno=sct.cno and sct.sno=student.sno and sct.sno='"+Start.text1.getText().trim()+"'";
ps = ct.prepareStatement(sql);
rs=ps.executeQuery();
while(rs.next()){
//rowData可以存放多行
Vector hang=new Vector();
hang.add(rs.getString(2));
hang.add(rs.getString(3));
hang.add(rs.getString(4));
hang.add(rs.getString(5));
//加入到rowData
rowData1.add(hang);
}
} catch (ClassNotFoundException | SQLException e1) {
e1.printStackTrace();
}
table_1 = new JTable(rowData1,columnNames1); //设置表中有多少行与列
table_1.setFillsViewportHeight(true);
scrollPane_1.setViewportView(table_1);
JLabel lblNewLabel = new JLabel("\u53EF\u9009\u8BFE\u7A0B");
lblNewLabel.setBounds(47, 66, 54, 15);
getContentPane().add(lblNewLabel);
label_1 = new JLabel("\u5DF2\u9009\u8BFE\u7A0B");
label_1.setBounds(47, 289, 54, 15);
getContentPane().add(label_1);
Button2 = new JButton("\u67E5\u8BE2");
Button2.setIcon(new ImageIcon(XuanKe.class.getResource("/images/\u641C\u7D22.png")));
Button2.setBounds(474, 183, 89, 32);
getContentPane().add(Button2);
textField = new JTextField();
textField.setBounds(475, 87, 88, 21);
getContentPane().add(textField);
textField.setColumns(10);
JLabel lblNewLabel_1 = new JLabel("\u8BFE\u7A0B\u540D\uFF1A");
lblNewLabel_1.setBounds(474, 66, 54, 15);
getContentPane().add(lblNewLabel_1);
JLabel lblNewLabel_3 = new JLabel("\u6559\u5E08\u540D\uFF1A");
lblNewLabel_3.setBounds(474, 118, 54, 15);
getContentPane().add(lblNewLabel_3);
textField_1 = new JTextField();
textField_1.setColumns(10);
textField_1.setBounds(474, 143, 88, 21);
getContentPane().add(textField_1);
button.addActionListener(this); //添加事件按钮监听
Button2.addActionListener(this); //添加事件按钮监听
scrollPane = new JScrollPane(); //添加滚动条
scrollPane.setBounds(37, 41, 428, 148);
setVisible(true); //设置当前窗口可见
}
}
(3)教师录入成绩功能
学生考试结束后,教师可以录入学生的成绩,单职业选了该任课老师的课,该老师才能够查看该学生课程信息并且录入成绩,否则,该老师并不能够查看学生信息并且录入成绩。
public class TeaInsert extends JInternalFrame implements ActionListener,ListSelectionListener{
private JTextField textField; //学号文本框
private JTextField textField_1; //课程号文本框
private JTextField textField_2; //成绩文本框
private JButton Button; //录入成绩按钮
private JPanel contentPane;
private JButton button; //查询成绩按钮
Vector
Connection conn=null;
ResultSet rs=null;
Statement stmt;
PreparedStatement ps=null;
Connection ct=null;
private JTable table; //表
DefaultTableModel dtm=null;
int mode=0;
@Override
public void valueChanged(ListSelectionEvent e) {
int i = table.getSelectedRow(); //表中选择的某一行
if(i>=0) {
textField.setText(table.getValueAt(i, 0)+""); //设置学号文本框对应选择行的学号值
textField_1.setText(table.getValueAt(i, 2)+""); //设置课程号文本框对应选择行的课程号值
textField_2.setText(table.getValueAt(i, 4)+""); //设置分数文本框对应选择分数的学号值
}
}
@Override
public void actionPerformed(ActionEvent e) { //按钮点击触件
int t =table.getSelectedRow();
if(e.getSource()==Button) {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //加载数据库
ct=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=BigTest","sa","432156789a"); //连接数据库
String sql = "update sct set grade='"+textField_2.getText().trim()+"' where sno='"+textField.getText().trim()+"' and cno='"+textField_1.getText().trim()+"' and tno='"+Start.text1.getText().trim()+"'";
try {
stmt = ct.createStatement(); //执行数据库的命令
int i = stmt.executeUpdate(sql);
} catch (SQLException e1) {
JOptionPane.showMessageDialog(null, "录入成绩失败!");
e1.printStackTrace();
}
} catch (ClassNotFoundException | SQLException e1) {
e1.printStackTrace();
}
dtm.setDataVector(rowData,columnNames);
table.setValueAt(textField_2.getText().trim(), t , 3);
}
if(e.getSource()==button) {
String stname = textField.getText().trim().toString();
if(StringUntil.isEmpty(stname)) {
JOptionPane.showMessageDialog(null, "输入为空");
return;
}
for (int i = 0; i < table.getRowCount(); i++) {
String strtable = table.getValueAt(i, 0).toString().trim();
String strtable1 = table.getValueAt(i, 1).toString().trim();
String strtable2 = table.getValueAt(i, 4).toString().trim();
if(strtable.contains(stname)) {
table.setRowSelectionInterval(i,i); //选择到某一行
}}}
}
public TeaInsert() { //录入成绩的构造函数
setTitle("\u5F55\u5165\u6210\u7EE9"); //设置标题
setResizable(true); //设置可最大化
setClosable(true);
setMaximizable(true); //设置内置窗口可最大化
setIconifiable(true);
setBounds(120, 90, 550, 414);
JDesktopPane desktopPane = new JDesktopPane();
desktopPane.setToolTipText("\u5F55\u5165\u6210\u7EE9");
desktopPane.setBounds(0, 0, 534, 384);
desktopPane.setBackground(SystemColor.control);
JLabel lblNewLabel = new JLabel("\u5F55\u5165\u5B66\u751F\u6210\u7EE9");
lblNewLabel.setFont(new Font("宋体", Font.PLAIN, 16));
lblNewLabel.setBounds(221, 14, 109, 26);
desktopPane.add(lblNewLabel);
JLabel lblNewLabel_1 = new JLabel("\u5B66\u53F7\uFF1A");
lblNewLabel_1.setIcon(new ImageIcon(TeaInsert.class.getResource("/images/\u5B66\u53F7.png")));
lblNewLabel_1.setBounds(40, 275, 66, 15);
desktopPane.add(lblNewLabel_1);
JLabel lblNewLabel_2 = new JLabel("\u8BFE\u7A0B\u53F7\uFF1A");
lblNewLabel_2.setIcon(new ImageIcon(TeaInsert.class.getResource("/images/\u8BFE\u7A0B\u5217\u8868.png")));
lblNewLabel_2.setBounds(194, 275, 82, 15);
desktopPane.add(lblNewLabel_2);
JLabel lblNewLabel_3 = new JLabel("\u5206\u6570\uFF1A");
lblNewLabel_3.setIcon(new ImageIcon(TeaInsert.class.getResource("/images/\u5B66\u5206.png")));
lblNewLabel_3.setBounds(366, 275, 66, 15);
desktopPane.add(lblNewLabel_3);
textField = new JTextField();
textField.setBounds(109, 272, 54, 21);
desktopPane.add(textField);
textField.setColumns(10);
textField_1 = new JTextField();
textField_1.setBounds(274, 272, 54, 21);
desktopPane.add(textField_1);
textField_1.setColumns(10);
textField_2 = new JTextField();
textField_2.setBounds(432, 272, 54, 21);
desktopPane.add(textField_2);
textField_2.setColumns(10);
Button = new JButton("\u5F55\u5165\u6210\u7EE9");
Button.setIcon(new ImageIcon(TeaInsert.class.getResource("/images/\u4FEE\u6539.png")));
Button.setBounds(316, 331, 109, 32);
Button.addActionListener(this);
desktopPane.add(Button);
JScrollPane scrollPane = new JScrollPane(); //设置滚动条
scrollPane.setBounds(40, 50, 446, 194);
desktopPane.add(scrollPane);
columnNames=new Vector();
//设置列名
columnNames.add("学号");
columnNames.add("姓名");
columnNames.add("课程号");
columnNames.add("课程名");
columnNames.add("成绩");
rowData = new Vector();
dtm = new DefaultTableModel(rowData,columnNames);
table = new JTable(dtm);
table=new JTable(dtm){
public boolean isCellEditable(int row, int column)
{
return false;}//表格不允许被编辑
};
TableRowSorter sorter = new TableRowSorter(table.getModel());
table.setRowSorter(sorter);
try {
//加载驱动
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
//得到连接
ct=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=BigTest","sa","432156789a");
String sql = "select sct.sno,sname,sct.cno,cname,grade,tno\r\n" +
"from sct,student,course\r\n" +
"where sct.sno=student.sno and course.cno=sct.cno";
ps=ct.prepareStatement(sql);
rs=ps.executeQuery();
while (rs.next()) {
if (rs.getString("tno").trim().equals(Start.text1.getText().trim())) {
Vector hang = new Vector();
hang.add(rs.getString(1));
hang.add(rs.getString(2));
hang.add(rs.getString(3));
hang.add(rs.getString(4));
hang.add(rs.getInt(5));
// 加入到rowData
rowData.add(hang);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(ct!=null){
ct.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
table.getSelectionModel().addListSelectionListener(this);
getContentPane().setLayout(null);
table.setFillsViewportHeight(true);
scrollPane.setViewportView(table);
getContentPane().add(desktopPane);
button = new JButton("\u67E5\u8BE2\u5B66\u751F");
button.setIcon(new ImageIcon(TeaInsert.class.getResource("/images/\u641C\u7D22.png")));
button.setBounds(122, 331, 109, 32);
button.addActionListener(this); //添加触键按钮事件监听器
desktopPane.add(button);
contentPane = new JPanel(); //容器选择是Jpanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setVisible(true); //设置当前窗口可见
}
}
(4)管理员报表功能
管理员可以在相应的窗口界面上显示学生、教师、课程、院系、选课等信息并且按照一定的条件筛选出并且可以通过打印机输出的功能。
public class StuReport extends JInternalFrame implements ActionListener{ //学生报表
private JTable table; //报表中用到显示的表
public static JTextField textField; //学号
public static JTextField textField_1; //性别
public static JTextField textField_2; //学院
private JButton Button2; //刷新按钮
private JButton Button1; //报表按钮
private JScrollPane scrollPane; //滚动条
AdminCon ac = new AdminCon(); //调用连接数据库函数
PreparedStatement ps=null;
Connection ct=null;
ResultSet rs=null;
Statement stmt = null;
Vector
DefaultTableModel dtm=null;
private JLabel Labelcount;
String sql = null; //数据库语句
@Override
public void actionPerformed(ActionEvent e) { //按钮触件
String tableName;
if(e.getSource()==Button2) { //刷新表
((DefaultTableModel)table.getModel()).getDataVector().removeAllElements();
String text_1 = textField.getText().trim();
String text_2 = textField_1.getText().trim();
String text_3 = textField_2.getText().trim();
studentreport(text_1,text_2,text_3);
}
if(e.getSource()==Button1) { //学生数据报表
String SQL = "select * from student";
tableName="学生表"; //生成的excel表名
try {
ReportTable.Path(table,tableName,SQL);
} catch (ClassNotFoundException | SQLException | IOException e1) {
e1.printStackTrace();
}}
}
public void studentreport(String text_1,String text_2,String text_3) { //多条件查询
int count=0;
if(!text_1.equals("")||!text_2.equals("")||!text_3.equals("")) {
sql ="select * from student where p=123 ";
if(!text_1.equals("")) {
sql=sql+"and sno LIKE '%"+text_1+"%'"; //可以进行模糊查询
}
if(!text_2.equals("")) {
sql =sql+"and ssex LIKE '%"+text_2+"%'";
}
if(!text_3.equals("")) {
sql =sql+"and sdept LIKE '%"+text_3+"%'";
}
try {
stmt = ct.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs=stmt.executeQuery(sql);
while(rs.next()){
//rowData可以存放多行
Vector hang=new Vector(); //向table表中添加一行的数据元素
hang.add(rs.getString(1));
hang.add(rs.getString(2));
hang.add(rs.getString(3));
hang.add(rs.getInt(4));
hang.add(rs.getString(5));
rowData.add(hang);
count++;
}
} catch (SQLException e) {
e.printStackTrace();
}
Labelcount.setText("共查询到"+count+"条记录");}
}
public void database() {
int count=0;
try {
ps=ct.prepareStatement("select * from student");
rs=ps.executeQuery();
while(rs.next()){
//rowData可以存放多行
Vector hang=new Vector();
hang.add(rs.getString(1));
hang.add(rs.getString(2));
hang.add(rs.getString(3));
hang.add(rs.getInt(4));
hang.add(rs.getString(5));
rowData.add(hang);
count++;
}
Labelcount.setText("共查询到"+count+"条记录");
} catch (SQLException e) {
e.printStackTrace();
}
}
Java连接Sql Server 2012数据库需要一个.jar包,在连接数据库操作之前需要把.jar包添加到java编译环境的路径之下, 否则代码会显示错误。
连接数据库的代码:
public class TotalConn {
public Connection getCon(){
String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver"; //加载数据库驱动的代码
String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=BigTest"; //sql server数据库的默认端口是1433,我的数据库名称是BigTest;
try {
Class.forName(driverName);//加载驱动,若显示错误,表明加载失败
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection conn = null;
try {
conn = DriverManager.getConnection(dbURL, "sa", "432156789a"); //连接数据库,用户名是“sa”,密码是“432156789a”
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public void closeCon(Connection conn)throws Exception{
if(conn!=null){
conn.close();
}
}
public static void main(String[] args) {
TotalConn tc=new TotalConn();
try {
tc.getCon(); //连接数据库的函数
System.out.println("数据库连接成功!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("数据库连接失败");
}}}
从后台读取数据库的代码:
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
ct=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=BigTest","sa","432156789a");
ps=ct.prepareStatement("select * from department");
rs=ps.executeQuery();
while(rs.next()){ //将数据库中的数据读取东控制台表中
//rowData可以存放多行
Vector hang=new Vector();
hang.add(rs.getString(1));
hang.add(rs.getString(2));
hang.add(rs.getString(3));
//加入到rowData
rowData.add(hang);
}
} catch (Exception e) {
e.printStackTrace();
}
查询、插入、更新、删除数据到数据库的代码:
查询:ResultSet rs = null;
String sql=null;
Statement stmt = null;
Connection dconn = Conn();
sql ="select * from department where oo=12 ";
while(rs.next()) {
s = s + "系编号:"+rs.getString(1)+" 学院:"+rs.getString(2)+" 系主任:"+rs.getString(3);
i=1; }
插入:String sql = "insert into course values('"+textField.getText().trim()+"','"+textField_1.getText().trim()+"','"+textField_2.getText().trim()+"','"+comboBox.getSelectedItem()+"','12')";
更新:String sql = "update sct set grade='"+textField_2.getText().trim()+"' where sno='"+textField.getText().trim()+"' and cno='"+textField_1.getText().trim()+"' and tno='"+Start.text1.getText().trim()+"'";
stmt = ct.createStatement(); //执行数据库的命令
int i = stmt.executeUpdate(sql);
} catch (SQLException e1) {
JOptionPane.showMessageDialog(null, "录入成绩失败!");
删除:String sql = "delete from course where cno='"+table.getValueAt(table.getSelectedRow(), 0)+"'"