相关推荐recommended
基于mysql+jdbc+java swing的学生成绩信息管理系统
作者:mmseoamin日期:2023-12-18

Java课程设计

前言

来csdn也有两年了,在这期间学了很多的知识,也跟着许多的大神做了几个小项目。但自己也在想什么时候能够有个自己的项目,之前在学校做过一个基于集合存储数据的学生信息管理系统,现在想着改进一下,于是趁着暑假做了一个小项目吧(基于mysql+jdbc+java swing的学生成绩信息管理系统)。一来是巩固自己的学习成果,二来是记录自己的学习历程,期待后面能做出更多的项目吧。

设计需求和思路

设计需求

1.利用jdbc将java程序与mysql建立连接

2.利用java swing将学生信息和成绩信息显现出来

3.通过使用sql指令来实现对学生信息和成绩信息的crud(增查改删)操作

设计思路

1.利用Navicat创建两个数据表(stu和classes),同时两个数据表用外键约束连接(

CONSTRAINT `fk_classes_stu` FOREIGN KEY (`class_id`) REFERENCES `stu` (`stu_num`) ON DELETE CASCADE

)

2.使用sql指令对数据表中数据进行增删改查,并通过java swing显示

3.查询所有学生信息,利用连接查询将两个数据表的信息一并显示

详细操作

1.设计主界面(登录注册界面)

账号和密码通过HashMap来存储,账号为键密码为值,利用其基本方法来添加账号密码(注册),以及登录。

package view;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
public class MainView extends JFrame {
    private Map userhashmap=new HashMap<>();
    JPanel p1=new JPanel();
    JPanel p2=new JPanel();
    JPanel p3=new JPanel();
    JPanel p4=new JPanel();
    JLabel welcome=new JLabel("欢迎来到学生信息管理系统");
    JLabel username=new JLabel("账号:");
    JLabel password=new JLabel("密码:");
    JTextField usernametext=new JTextField(10);
    JPasswordField passwordField=new JPasswordField(10);
    JButton confirm=new JButton("确认");
    JButton exit=new JButton("退出");
    JButton register=new JButton("注册");
    public MainView() {
        this.setTitle("学生信息管理系统");
        this.setSize(800, 500);
        this.setLayout(new GridLayout(4, 1,10,10));
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        p4.add(welcome);
        p1.add(username);
        p1.add(usernametext);
        p2.add(password);
        p2.add(passwordField);
        p3.add(confirm);
        p3.add(register);
        p3.add(exit);
        this.add(p4);
        this.add(p1);
        this.add(p2);
        this.add(p3);
        register.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getSource()==register){
                    if(userhashmap.containsKey(usernametext.getText())){
                        JOptionPane.showMessageDialog(null,"注册失败,您的账号已存在","警告",JOptionPane.WARNING_MESSAGE);
                        return;
                    }
                    userhashmap.put(usernametext.getText(),passwordField.getText());
                    JOptionPane.showMessageDialog(null,"注册成功","通知",JOptionPane.INFORMATION_MESSAGE);
                }
            }
        });
        confirm.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == confirm) {
                    if (userhashmap.containsKey(usernametext.getText())) {
                        if (userhashmap.get(usernametext.getText()).equals(passwordField.getText())) {
                            JOptionPane.showMessageDialog(null,"登陆成功","通知",JOptionPane.INFORMATION_MESSAGE);
                            dispose();
                            ManagerView mv=new ManagerView();
                            mv.setVisible(true);
                        } else {
                            JOptionPane.showMessageDialog(null,"密码错误","警告",JOptionPane.WARNING_MESSAGE);
                        }
                    }
                    else{
                        JOptionPane.showMessageDialog(null,"该用户不存在","警告",JOptionPane.WARNING_MESSAGE);
                    }
                }
            }
        });
        exit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
    }
    public static void main(String[] args) {
        MainView m=new MainView();
        m.setVisible(true);
    }
}

 基于mysql+jdbc+java swing的学生成绩信息管理系统,第1张

 2.设计学生信息管理界面和成绩信息管理界面

使用GridBagLayout布局设置左边为学生信息管理的按钮,右边为成绩信息管理的按钮

package view;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ManagerView extends JFrame{
     JButton insert=new JButton("添加学生信息");
     JButton delete=new JButton("删除学生");
    JButton update=new JButton("学生信息修改");
    JButton query=new JButton("查询学生信息");
    JButton queryall=new JButton("查询所有学生信息");
    JButton insertclass=new JButton("添加成绩信息");
    JButton deleteclass=new JButton("删除成绩信息");
    JButton updateclass=new JButton("修改成绩信息");
    JLabel labelstu=new JLabel("学生管理系统");//设置“学生管理系统”标签
    JLabel labelclass=new JLabel("成绩管理系统");//设置“成绩管理系统”标签
    public ManagerView(){
        this.setTitle("学生成绩管理");
        this.setSize(1200,500);
        this.setLayout(new GridBagLayout());
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //设置每个按钮长,高为140,120
        Dimension dimension=new Dimension(140,30);//通过setPreferredSize()方法来设置按钮和标签大小,但要传入Dimension对象
        insert.setPreferredSize(dimension);
        delete.setPreferredSize(dimension);
        update.setPreferredSize(dimension);
        query.setPreferredSize(dimension);
        queryall.setPreferredSize(dimension);
        insertclass.setPreferredSize(dimension);
        deleteclass.setPreferredSize(dimension);
        updateclass.setPreferredSize(dimension);
        labelstu.setPreferredSize(dimension);
        labelclass.setPreferredSize(dimension);
        GridBagConstraints constraintsleft=new GridBagConstraints();
        constraintsleft.gridx = 0; // 列为0
        constraintsleft.gridy = GridBagConstraints.RELATIVE; // 按钮的行相对于前一个按钮的行
        constraintsleft.anchor = GridBagConstraints.CENTER; // 设置水平方向上的位置居中
        constraintsleft.fill = GridBagConstraints.HORIZONTAL; // 填充水平方向
        /*constraintsleft.weightx = 0.5; // 水平方向上的权重为0.5*/
        constraintsleft.insets = new Insets(5, 5, 5, 200); // 设置按钮的内边距
        constraintsleft.ipadx = 10;
        this.add(labelstu,constraintsleft);
        this.add(insert,constraintsleft);
        this.add(delete,constraintsleft);
        this.add(update,constraintsleft);
        this.add(query,constraintsleft);
        this.add(queryall,constraintsleft);
        GridBagConstraints constraintsright=new GridBagConstraints();
        constraintsright.gridx=1;
        constraintsleft.gridy = GridBagConstraints.RELATIVE; // 按钮的行相对于前一个按钮的行
        constraintsleft.anchor = GridBagConstraints.CENTER; // 设置水平方向上的位置居中
        constraintsleft.fill = GridBagConstraints.HORIZONTAL; // 填充水平方向
        /*constraintsleft.weightx = 0.5; // 水平方向上的权重为0.5*/
        constraintsleft.insets = new Insets(5, 200, 5, 5); // 设置按钮的内边距
        constraintsleft.ipadx = 10;
        this.add(labelclass,constraintsright);
        this.add(insertclass,constraintsright);
        this.add(deleteclass,constraintsright);
        this.add(updateclass,constraintsright);
        insert.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                InsertStuView insertStuView=new InsertStuView();
                insertStuView.setVisible(true);
            }
        });
        delete.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                DeleteStuView deleteStuView=new DeleteStuView();
                deleteStuView.setVisible(true);
            }
        });
        update.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                UpdateStuview updateStuview=new UpdateStuview();
                updateStuview.setVisible(true);
            }
        });
        query.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                QueryStuView queryStuView=new QueryStuView();
                queryStuView.setVisible(true);
            }
        });
        insertclass.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                InsertClassView insertClassView=new InsertClassView();
                insertClassView.setVisible(true);
            }
        });
        deleteclass.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                DeleteClassView deleteClassView=new DeleteClassView();
                deleteClassView.setVisible(true);
            }
        });
        updateclass.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                UpdateClassView updateClassView =new UpdateClassView();
                updateClassView.setVisible(true);
            }
        });
/*        p1.add(insert);
        p2.add(delete);
        p3.add(query);
        p4.add(update);
        p5.add(orderby);*/
        queryall.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                QueryAllView queryAllView=new QueryAllView();
                queryAllView.setVisible(true);
            }
        });
    }
}

基于mysql+jdbc+java swing的学生成绩信息管理系统,第2张

 3.设计学生信息操作

添加学生信息
package view;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import service.StuManage;
public class InsertStuView extends JFrame {
    JLabel labelname=new JLabel("请输入您的姓名");
    JLabel labelgender=new JLabel("请输入您的性别");
    JLabel labelid=new JLabel("请输入您的学号");
    JTextField textname=new JTextField(15);
    JTextField textgender=new JTextField(15);
    JTextField textid=new JTextField(15);
    JButton confirm=new JButton("确定");
    JButton cancel=new JButton("取消");
    JPanel p1=new JPanel();
    JPanel p2=new JPanel();
    JPanel p3=new JPanel();
    JPanel p4=new JPanel();
    public InsertStuView(){
        this.setSize(500,300);
        this.setTitle("请添加学生信息");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new GridLayout(4,1,10,10));
        p1.add(labelname);
        p1.add(textname);
        p2.add(labelgender);
        p2.add(textgender);
        p3.add(labelid);
        p3.add(textid);
        p4.add(confirm);
        p4.add(cancel);
        this.add(p1);
        this.add(p2);
        this.add(p3);
        this.add(p4);
        confirm.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    StuManage.insertStudata(textname.getText(),textgender.getText(),textid.getText());
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(null,"添加失败","警告",JOptionPane.WARNING_MESSAGE);
                }
                dispose();
            }
        });
        cancel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
    }
}

基于mysql+jdbc+java swing的学生成绩信息管理系统,第3张

通过学号删除学生,因为学号不会重复
package view;
import service.StuManage;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DeleteStuView extends JFrame {
    JLabel labelid=new JLabel("请输入您想删除学生的学号");
    JTextField textField=new JTextField(15);
    JPanel p1=new JPanel();
    JPanel p2=new JPanel();
    JButton confirm=new JButton("确定");
    JButton cancel=new JButton("取消");
    public DeleteStuView(){
        this.setSize(500,300);
        this.setLayout(new GridLayout(2,1,0,0));
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("删除学生");
        p1.add(labelid);
        p1.add(textField);
        p2.add(confirm);
        p2.add(cancel);
        p1.setBorder(BorderFactory.createEmptyBorder(70,0,0,0));
        this.add(p1);
        this.add(p2);
        confirm.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try{
                    StuManage.deleteStudata(textField.getText());
                }catch(Exception ex){
                    JOptionPane.showMessageDialog(null,"删除失败","警告",JOptionPane.WARNING_MESSAGE);
                }
                dispose();
            }
        });
        cancel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dispose();
            }
        });
    }
}

基于mysql+jdbc+java swing的学生成绩信息管理系统,第4张

 学生信息修改
package view;
import service.StuManage;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class UpdateStuview extends JFrame{
JLabel labeloldid=new JLabel("请输入您要修改学生的学号");
JLabel labelname=new JLabel("请输入您要修改后的姓名");
JLabel labelgender=new JLabel("请输入您要修改后的性别");
JLabel labelid=new JLabel("请输入您要修改后的学号");
JTextField textFieldoldid=new JTextField(15);
JTextField textname=new JTextField(15);
JTextField textgender=new JTextField(15);
JTextField textid=new JTextField(15);
JButton confirm=new JButton("确定");
JButton cancel=new JButton("取消");
JPanel p1=new JPanel();
JPanel p2=new JPanel();
JPanel p3=new JPanel();
JPanel p4=new JPanel();
JPanel p5=new JPanel();
public UpdateStuview(){
this.setSize(500,300);
this.setTitle("请修改学生信息");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new GridLayout(5,1,10,10));
p1.add(labeloldid);
p1.add(textFieldoldid);
p2.add(labelname);
p2.add(textname);
p3.add(labelgender);
p3.add(textgender);
p4.add(labelid);
p4.add(textid);
p5.add(confirm);
p5.add(cancel);
this.add(p1);
this.add(p2);
this.add(p3);
this.add(p4);
this.add(p5);
confirm.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
StuManage.updateStudata(textname.getText(),textgender.getText(),textid.getText(),textFieldoldid.getText());
} catch (Exception ex) {
JOptionPane.showMessageDialog(null,"修改失败","警告",JOptionPane.WARNING_MESSAGE);
}
dispose();
}
});
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dispose();
}
});
}
}

基于mysql+jdbc+java swing的学生成绩信息管理系统,第5张

 查询学生信息
package view;
import service.ClassManage;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class QueryStuView extends JFrame {
    JLabel id=new JLabel("请输入学生的id");
    JTextField textid=new JTextField(15);
    JButton confirm=new JButton("确定");
    JButton cancel=new JButton("取消");
    JLabel labelstu=new JLabel("学生信息表");
    JLabel labelscore=new JLabel("成绩信息表");
    JPanel p1=new JPanel();
    JPanel p2=new JPanel();
    JPanel p3=new JPanel();
    JPanel p4=new JPanel();
    String[] stucolumnname={"姓名","性别","学号"};
    String[] scorecolumnname={"学科","分数","教师"};
public QueryStuView(){
    this.setLayout(new GridLayout(4,4,10,10));
    this.setTitle("学生信息查询");
    this.setSize(1000,700);
    DefaultTableModel stumodel=new DefaultTableModel();
    DefaultTableModel scoremodel=new DefaultTableModel();
    stumodel.setColumnIdentifiers(stucolumnname);
    scoremodel.setColumnIdentifiers(scorecolumnname);
    JTable stutable = new JTable(stumodel);
    JTable scoretable=new JTable(scoremodel);
    JScrollPane scrollstu=new JScrollPane(stutable);
    JScrollPane scrollscore=new JScrollPane(scoretable);
    p1.setBorder(BorderFactory.createEmptyBorder(70,0,0,0));
    p1.add(id);
    p1.add(textid);
    p2.add(confirm);
    p2.add(cancel);
    p3.add(labelstu);
    p3.add(scrollstu);
    p4.add(labelscore);
    p4.add(scrollscore);
    this.add(p1);
    this.add(p2);
    this.add(p3);
    this.add(p4);
    confirm.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            try{
                stumodel.setRowCount(0);
                scoremodel.setRowCount(0);
                ClassManage.querystu(textid.getText(),stumodel,scoremodel);
            }catch(Exception ex){
                JOptionPane.showMessageDialog(null,"查找失败","警告",JOptionPane.WARNING_MESSAGE);
            }
        }
    });
    cancel.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            dispose();
        }
    });
    }
}

基于mysql+jdbc+java swing的学生成绩信息管理系统,第6张

查询所有学生信息
package view;
import service.ClassManage;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class QueryAllView extends JFrame{
    JLabel text=new JLabel("学生信息查询");
    DefaultTableModel model=new DefaultTableModel();
    JTable queryall=new JTable(model);
    JScrollPane jScrollPane=new JScrollPane(queryall);
    JPanel p1=new JPanel();
    JPanel p2=new JPanel();
    public QueryAllView(){
        this.setTitle("学生成绩查询");
        this.setSize(1000,700);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        String[] columnname={"姓名","性别","学号","科目","分数"};
        model.setColumnIdentifiers(columnname);
        p1.add(text);
        p2.add(jScrollPane);
        this.add(p1);
        this.add(p2);
        try{
            ClassManage.queryall(model);
        }catch(Exception ex){
            JOptionPane.showMessageDialog(null,"查询失败","警告",JOptionPane.WARNING_MESSAGE);
        }
    }
}

基于mysql+jdbc+java swing的学生成绩信息管理系统,第7张

 功能效果展示

1.项目结构

基于mysql+jdbc+java swing的学生成绩信息管理系统,第8张

 2.stu数据表和classes数据表初始数据

基于mysql+jdbc+java swing的学生成绩信息管理系统,第9张

基于mysql+jdbc+java swing的学生成绩信息管理系统,第10张

3.登录和注册功能演示

基于mysql+jdbc+java swing的学生成绩信息管理系统,第11张

 基于mysql+jdbc+java swing的学生成绩信息管理系统,第12张

 基于mysql+jdbc+java swing的学生成绩信息管理系统,第13张

 基于mysql+jdbc+java swing的学生成绩信息管理系统,第14张

4.添加学生信息

 基于mysql+jdbc+java swing的学生成绩信息管理系统,第15张

 基于mysql+jdbc+java swing的学生成绩信息管理系统,第16张

5. 删除学生

基于mysql+jdbc+java swing的学生成绩信息管理系统,第17张

 基于mysql+jdbc+java swing的学生成绩信息管理系统,第18张

6.学生信息修改

基于mysql+jdbc+java swing的学生成绩信息管理系统,第19张 基于mysql+jdbc+java swing的学生成绩信息管理系统,第20张

 7.查询学生信息

基于mysql+jdbc+java swing的学生成绩信息管理系统,第21张

8.查询所有学生信息

基于mysql+jdbc+java swing的学生成绩信息管理系统,第22张

 9.添加学生成绩

基于mysql+jdbc+java swing的学生成绩信息管理系统,第23张

 基于mysql+jdbc+java swing的学生成绩信息管理系统,第24张

 10.删除学生成绩信息(学号为20210004的学生的Java成绩信息全被删除)

基于mysql+jdbc+java swing的学生成绩信息管理系统,第25张

基于mysql+jdbc+java swing的学生成绩信息管理系统,第26张

 11.修改学生成绩信息(修改学号为20210004的学生的C++成绩,修改为100)

基于mysql+jdbc+java swing的学生成绩信息管理系统,第27张

 基于mysql+jdbc+java swing的学生成绩信息管理系统,第28张

 mysql数据表结构

1.学生数据表(stu)结构

 前言:先创建名为pro_stumanage的数据库,再使用改数据,其次再创建两个数据表基于mysql+jdbc+java swing的学生成绩信息管理系统,第29张

2.成绩数据表(classes)结构

tips:通过外键约束将classes的class_id和stu的stu_num关联,并且添加了删除的级联操作,这样删除学生,其成绩也会删除

基于mysql+jdbc+java swing的学生成绩信息管理系统,第30张

 总结

花了三四天的时间做了个小项目,基本上我想要做的功能已基本实现了,能够基本实现对学生信息的增删改查操作。同时,我学到了很多之前没学到的知识,也对近期学的知识进行了巩固和复习。不过我是学完之后再做,所以可能有些bug和小问题,也欢迎各位来提问指正问题,也期待自己能够作出更多更优质的项目。如果想要源码可以直接私信或者通过百度网盘下载源码。

百度网盘下载链接:

链接:https://pan.baidu.com/s/1LKKdetbWrXk0K3Ynz-E6Sg

提取码:0718