一、实验内容
设计并实现一个基于图形用户界面的学生成绩管理系统,通过GUI界面完成对学生成绩信息的添加、删除和修改等操作。使用MVC结构,建立Student模型。通过实践加深对MVC模式的理解,以及数据库连接和操作的实践能力。
二、源程序
StuinfoController类
package com.rjxy.controller;
import com.rjxy.dao.StuinfoDao;
import com.rjxy.model.Stuinfo;
import com.rjxy.view.StudentGUI;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.sql.Date;
public class StuinfoController {
// 数据层对象
private StuinfoDao stuinfoDao = new StuinfoDao();
public String[][] getDate(String sname) {
// 调用数据层的方法获取数据
String[][] data = stuinfoDao.find(sname);
return data;
}
/**
* 新增按钮的监听器
* @return
*/
public ActionListener addButListener() {
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 显示底部新增区域面板
StudentGUI.southPanel.setVisible(true);
}
};
return listener;
}
public MouseListener hideSouthPanel() {
MouseListener listener = new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
StudentGUI.southPanel.setVisible(false);
}
@Override
public void mousePressed(MouseEvent e) { }
@Override
public void mouseReleased(MouseEvent e) { }
@Override
public void mouseEntered(MouseEvent e) { }
@Override
public void mouseExited(MouseEvent e) { }
};
return listener;
}
public boolean saveStuinfo(String[] addDate) {
Stuinfo stuinfo = new Stuinfo();
stuinfo.setSname(addDate[0]);
stuinfo.setSex(Integer.parseInt(addDate[1]));
stuinfo.setBirthDate(Date.valueOf(addDate[2]));
stuinfo.setClasses(addDate[3]);
stuinfo.setgrade(Integer.parseInt(addDate[4]));
stuinfo.setSid(addDate[5]);
// 调用数据层方法保存数据
int i = stuinfoDao.add(stuinfo);
if(i>0){
return true;
}else {
return false;
}
}
public boolean updateStuinfo(String[] updaDate) {
Stuinfo stuinfo = new Stuinfo();
stuinfo.setSname(updaDate[0]);
stuinfo.setSex(Integer.parseInt(updaDate[1]));
stuinfo.setBirthDate(Date.valueOf(updaDate[2]));
stuinfo.setClasses(updaDate[3]);
stuinfo.setgrade(Integer.parseInt(updaDate[4]));
stuinfo.setSid(updaDate[5]);
// 调用数据层方法修改数据
int i = stuinfoDao.update(stuinfo);
if(i>0){
return true;
}else {
return false;
}
}
public boolean removeStuinfo(String value) {
// 调用数据层方法删除数据
int i = stuinfoDao.remove(Integer.parseInt(value));
if(i>0){
return true;
}else {
return false;
}
}
}
StuinfoManage类
package com.rjxy.dao;
import com.rjxy.model.Stuinfo;
import com.rjxy.util.JDBCUtil;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class StuinfoManage {
public int add(Stuinfo s){
String sql = "insert into stuinfo values (?,?,?,?,?,?)";
PreparedStatement pre = JDBCUtil.getPre(sql);
try {
pre.setString(1,s.getSname());
pre.setInt(2,s.getSex());
pre.setDate(3, (Date) s.getBirthDate());
pre.setString(4,s.getClasses());
pre.setInt(5,s.getgrade());
pre.setString(6,s.getSid());
int i = pre.executeUpdate();
return i;
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.close();
}
return -1;
}
public int update(Stuinfo s){
String sql = "update stuinfo set sname=?,sex=?,birthDate=?,classes=?,grade=? where sid=?";
PreparedStatement pre = JDBCUtil.getPre(sql);
try {
pre.setString(1,s.getSname());
pre.setInt(2,s.getSex());
pre.setDate(3, (Date) s.getBirthDate());
pre.setString(4,s.getClasses());
pre.setInt(5,s.getgrade());
pre.setString(6,s.getSid());
int i = pre.executeUpdate();
return i;
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.close();
}
return -1;
}
public int remove(int sid){
String sql = "delete from stuinfo where sid=?";
PreparedStatement pre = JDBCUtil.getPre(sql);
try {
pre.setInt(1,sid);
int i = pre.executeUpdate();
return i;
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.close();
}
return -1;
}
public String[][] find(String sname){
String sql = "select * from stuinfo";
if (null != sname && !"".equals(sname)){
sql += " where sname like ?";
}
System.out.println("sql = " + sql);
int num = findNum(sname);
PreparedStatement pre = JDBCUtil.getPre(sql);
try {
if (null != sname && !"".equals(sname)){
pre.setString(1,"%"+sname+"%");
}
ResultSet set = pre.executeQuery();
String[][] list = new String[num][];
int i = 1;
while (set.next()){
Stuinfo stuinfo = new Stuinfo(set.getString("sid"), set.getString("sname"), set.getInt("sex")
, set.getDate("birthDate"), set.getString("classes")
, set.getInt("grade"));
list[i-1] = stuinfo.toArray(i);
i++;
}
return list;
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.close();
}
return null;
}
public int findNum(String sname){
String sql = "select count(1) from stuinfo";
if(sname!=null && !"".equals(sname)){
sql += " where sname like ?";
}
PreparedStatement pre = JDBCUtil.getPre(sql);
try {
if (null != sname && !"".equals(sname)){
pre.setString(1,"%"+sname+"%");
}
ResultSet set = pre.executeQuery();
set.next();
return set.getInt(1);
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtil.close();
}
return 0;
}
}
Stuinfo类
package com.rjxy.model;
import java.io.Serializable;
import java.sql.Date;
import java.util.Objects;
/**
* @ClassName Stuinfo
* @Description 学生表实体类
* @Author
* Version 1.0
**/
public class Stuinfo implements Serializable {
private String sid;
private String sname;
private int sex;
private Date birthDate;
private String classes;
private int grade;
public String[] toArray(int i){
String sex1 = sex==0?"女":"男";
return new String[]{i+"",sid+"",sname,sex1,birthDate.toString(),classes,grade+""};
}
public Stuinfo() {
}
public Stuinfo(String sid, String sname, int sex, Date birthDate, String classes, int grade) {
this.sid = sid;
this.sname = sname;
this.sex = sex;
this.birthDate = birthDate;
this.classes = classes;
this.grade = grade;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
public String getClasses() {
return classes;
}
public void setClasses(String classes) {
this.classes = classes;
}
public int getgrade() {
return grade;
}
public void setgrade(int grade) {
this.grade = grade;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Stuinfo stuinfo = (Stuinfo) o;
return sid == stuinfo.sid && sex == stuinfo.sex && Objects.equals(sname, stuinfo.sname) && Objects.equals(birthDate, stuinfo.birthDate) && Objects.equals(classes, stuinfo.classes) && Objects.equals(grade, stuinfo.grade);
}
@Override
public String toString() {
return "Stuinfo{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", sex=" + sex +
", birthDate=" + birthDate +
", classes='" + classes + '\'' +
", grade='" + grade + '\'' +
'}';
}
}
JDBCUtil类
package com.rjxy.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCUtil {
/*
数据库参数(私有静态)
*/
private static String driver = "com.mysql.jdbc.Driver"; // 驱动类名
private static String url = "jdbc:mysql://localhost:3306/students?characterEncoding=utf8&serverTimezone=GMT&useSSL=false"; // 数据库地址
private static String username = "root";
private static String password = "266920";
private static Connection conn = null; // 连接对象
private static PreparedStatement statement = null; // 操作对象
/**
* 获取JDBC操作对象的方法
*/
public static PreparedStatement getPre(String sql) {
try {
Class.forName(driver); // 加载驱动
conn = DriverManager.getConnection(url, username, password); // 获取连接对象
statement = conn.prepareStatement(sql); // 获取操作对象
} catch (Exception e) {
e.printStackTrace();
}
// 返回操作对象
return statement;
}
/**
* 关闭JDBC操作对象和连接对象
*/
public static void close(){
try{ // 关闭连接
if (statement != null) statement.close();
if (conn !=null ) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
StudentGUI类
package com.rjxy.view;
import com.rjxy.conetroller.StuinfoConteroller;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class StudentGUI extends JFrame{
// 学生控制类对象
private StuinfoConteroller controller = new StuinfoConteroller();
// 展示数据的表格
JTable table = new JTable();
// 底部面板 会在控制层调用显示
public static JPanel southPanel = new JPanel();
/**
* 无参构造方法--初始化界面
*
*/
public StudentGUI(){
intoGUI();
menuBarGUI();
mainGUI();
bottomGUI();
}
/**
* 设置界面
* 继承了JFrame类,所以不用再new JFrame
*/
private void intoGUI() {
// 设置标题
setTitle("学生成绩管理系统");
// 设置位置和大小
setBounds(100,100,500,600);
// 显示界面
setVisible(true);
// 设置关闭方式
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
/**
* 界面中间区域设置
*/
public void mainGUI(){
// 设置表格模型
setTableModel(null);
// 滚动面板
JScrollPane scrollPane = new JScrollPane(table);
// 把面板加入到界面的中间区域
this.add(scrollPane, BorderLayout.CENTER);
// 显示内容
this.validate();
// 点击中间区域时隐藏底部区域
scrollPane.addMouseListener(controller.hideSouthPanel());
table.addMouseListener(controller.hideSouthPanel());
}
/**
* 界面底部区域
* 存放新增界面,默认隐藏,点击新增按钮时显示
*/
private void bottomGUI(){
// 设置面板标题
southPanel.setBorder(BorderFactory.createTitledBorder("新增学生信息"));
/* 添加面板组件 */
// southPanel.add(new JLabel("序号"));
// JTextField index1 = new JTextField(10);
// southPanel.add(index1);
southPanel.add(new JLabel("姓名:"));
JTextField suname = new JTextField(10);
southPanel.add(suname);
southPanel.add(new JLabel("性别"));
ButtonGroup buttonGroup = new ButtonGroup();
JRadioButton r1 = new JRadioButton("男");
JRadioButton r2 = new JRadioButton("女");
buttonGroup.add(r1);
southPanel.add(r1);
buttonGroup.add(r2);
southPanel.add(r2);
southPanel.add(new JLabel("出生日期"));
JTextField birthday = new JTextField(10);
southPanel.add(birthday);
southPanel.add(new JLabel("班级"));
JTextField classes = new JTextField(10);
southPanel.add(classes);
southPanel.add(new JLabel("成绩"));
JTextField shf = new JTextField(10);
southPanel.add(shf);
southPanel.add(new JLabel("学号"));
JTextField number = new JTextField(10);
southPanel.add(number);
JButton save = new JButton("保存");
southPanel.add(save);
// 设置首选大小,不设置的话底部默认大小不够
southPanel.setPreferredSize(new Dimension(500,100));
// 把面板加到界面中
this.add(southPanel,BorderLayout.SOUTH);
// 隐藏面板
southPanel.setVisible(false);
// 点击保存按钮的事件
save.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 新增数据的数组
String[] addDate = new String[6];
// 获取输入的值
addDate[0] = suname.getText();
if(r1.isSelected()) addDate[1] = "1";
if(r2.isSelected()) addDate[1] = "0";
addDate[2] = birthday.getText();
addDate[3] = classes.getText();
addDate[4] = shf.getText();
addDate[5] = number.getText();
// 调用控制层保存数据
boolean b = controller.saveStuinfo(addDate);
if(b){
JOptionPane.showMessageDialog(southPanel.getParent(),"新增完成!!!","成功",2);
// 新增成功隐藏界面
southPanel.setVisible(false);
// 新增成功刷新表格
setTableModel(null);
}else {
JOptionPane.showMessageDialog(southPanel.getParent(),"新增失败~~","错误",1);
}
}
});
}
/**
* 设置表格菜单栏
* 每个菜单项用按钮组件
* 每个按钮的监听事件在控制层定义
*/
public void menuBarGUI(){
// 创建菜单栏
JMenuBar menuBar = new JMenuBar( );
menuBar.setMargin(new Insets(3,5,5,3));
/* 新增按钮 */
JButton addBtu = new JButton("新增");
// 把按钮添加到菜单栏
menuBar.add(addBtu);
/* 修改按钮 */
JButton updateBtn = new JButton("修改");
// 把按钮添加到菜单栏
menuBar.add(updateBtn);
// 删除按钮
JButton removeBtn = new JButton("删除");
// 把按钮添加到菜单栏
menuBar.add(removeBtn);
// 查询面板
JButton findBtn = new JButton("查询");
menuBar.add(findBtn);
menuBar.add(new JLabel("姓名:"));
JTextField findNamaInput = new JTextField(5);
menuBar.add(findNamaInput);
// 设置窗口菜单
this.setJMenuBar(menuBar);
// 设置查询按钮的监听
findBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 查询条件
String sname = findNamaInput.getText();
// 按照条件刷新表格
setTableModel(sname);
}
});
// 设置新增按钮的监听
addBtu.addActionListener(controller.addButListener());
// 修改按钮监听事件
updateBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取当前选中的行序号
int row = table.getSelectedRow();
/* 获取数据 */
// 数据数组
String[] updaDate = new String[6];
// 获取选中行的值
updaDate[5] = (String) table.getValueAt(row,1);
updaDate[0] = (String) table.getValueAt(row,2);
updaDate[1] = (String) table.getValueAt(row,3);
updaDate[1] = "女".equals(updaDate[1])?"0":"1";
updaDate[2] = (String) table.getValueAt(row,4);
updaDate[3] = (String) table.getValueAt(row,5);
updaDate[4] = (String) table.getValueAt(row,6);
// 调用控制层修改数据
boolean b = controller.updateStuinfo(updaDate);
if(b){
JOptionPane.showMessageDialog(southPanel.getParent(),"修改完成!!!","成功",2);
// 新增成功刷新表格
setTableModel(null);
}else {
JOptionPane.showMessageDialog(southPanel.getParent(),"修改失败~~","错误",1);
}
}
});
// 删除按钮监听事件
removeBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 删除前提示
int i = JOptionPane.showConfirmDialog(southPanel.getParent(), "删除后数据不可恢复,是否确认删除");
System.out.println("i = " + i);
if(i != 0) return;
// 获取当前选中的行
int row = table.getSelectedRow();
// 获取学号
String value = (String) table.getValueAt(row, 1);
// 调用控制层修改数据
boolean b = controller.removeStuinfo(value);
if(b){
JOptionPane.showMessageDialog(southPanel.getParent(),"删除完成!!!","成功",2);
// 新增成功刷新表格
setTableModel(null);
}else {
JOptionPane.showMessageDialog(southPanel.getParent(),"删除失败~~","错误",1);
}
}
});
}
// 设置表格模板,用来更新数据
private void setTableModel(String sname) {
// 获取表格数据
String[][] value = controller.getDate(sname);
// 表格标题
Object[] titel = {"序号","学号","姓名","性别","出生日期","班级","成绩"};
// 表格模型
DefaultTableModel tableModel = new DefaultTableModel(value, titel);
table.setModel(tableModel);
}
}
Main类
package com.rjxy;
import com.rjxy.view.StudentGUI;
public class Main {
public static void main(String[] args) {
StudentGUI gui = new StudentGUI();
}
}