JAVA课程设计-学生成绩管理系统

功能描述:学生成绩管理系统,从MySQL数据库中根据学号查询学生的成绩信息。支持教师和学生两种身份登录,两种身份登录后可实现的功能不同。教师端,可以对学生成绩进行添加,删除,查询,修改;学生端的权限只有查询查看成绩信息。学生的信息全部在数据库中存储。

主要技术应用
     序号       主要技术                                描述
       1面向对象设计

使用了面向对象技术设计系统。

       2登录功能

客户端使用localhost对用户名、密码进行加密。一定程度上提高了了系统的安全性。

       3数据库读写编码

使用了DAO模式。使用了mysql数据库连接池连接数据库,提高了数据库链接的性能。

       4数据库设计

采用MySQL数据库。表设计符合第三范式。

       5

模式-视图-控制器(MVC)模式

ModelDAO 类似于模型层,负责数据和业务逻辑;JTable 和相关组件属于视图层,显示数据;事件监听器则充当控制器的角色,响应用户操作。

1.学生成绩管理系统设计

1.1登录界面设计

实现代码:

public class denglv {
    public  void denglv2() {

        JFrame f = new JFrame("登录");
        f.setSize(370, 330);
        f.setLocation(200, 200);
        f.setLayout(null);

        JPanel pNorth = new JPanel();
        pNorth.setBounds(10,150, 300, 100);


        JLabel lName = new JLabel("账号:");
        lName.setBounds(10, 10, 10, 20);
        JTextField tfName = new JTextField("");
        tfName.setText("");
        tfName.setPreferredSize(new Dimension(80, 30));

        JLabel lPassword = new JLabel("密码:");
        JPasswordField tfPassword = new JPasswordField("");
        tfPassword.setText("");
        tfPassword.setPreferredSize(new Dimension(80, 30));

        pNorth.add(lName);
        pNorth.add(tfName);
        pNorth.add(lPassword);
        pNorth.add(tfPassword);

        JLabel l = new JLabel();
        l.setVisible(true);
        f.add(l);

        JButton b= new JButton("教师登陆");
        b.setBounds(130, 200, 100, 30);
        f.add(b);
        JButton c= new JButton("学生登陆");
        c.setBounds(130, 240, 100, 30);
        f.add(c);
        b.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                String name = tfName.getText();
                String password = new String( tfPassword.getPassword());
                if(0==name.length()){
                    JOptionPane.showMessageDialog(f, "账号不能为空");
                    tfName.grabFocus();

                    return;
                }
                if(0==password.length()){
                    JOptionPane.showMessageDialog(f, "密码不能为空");
                    tfPassword.grabFocus();
                    return;
                }

                if(check(name, password))
                {
                    JOptionPane.showMessageDialog(f, "登陆成功");
                    zhujiemian zhujiemian1 = new zhujiemian();
                    f.dispose();
                    zhujiemian1.de2();

                }
                else
                    JOptionPane.showMessageDialog(f, "密码错误");

            }
        });

        c.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                String name = tfName.getText();
                String password = new String( tfPassword.getPassword());
                if(0==name.length()){
                    JOptionPane.showMessageDialog(f, "账号不能为空");
                    tfName.grabFocus();

                    return;
                }
                if(0==password.length()){
                    JOptionPane.showMessageDialog(f, "密码不能为空");
                    tfPassword.grabFocus();
                    return;
                }

                if(check2(name, password))
                {
                    JOptionPane.showMessageDialog(f, "登陆成功");
                    f.dispose();
                    zhujiemian2 zhujiemian1 = new zhujiemian2();
                    zhujiemian1.dex();

                }
                else
                    JOptionPane.showMessageDialog(f, "密码错误");

            }
        });

        f.add(pNorth);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.setVisible(true);
    }


     //教师登录
    public static boolean check(String name, String password) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        boolean result = false;
        try (Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/ideajava?user=root&password=chdyyds&characterEncoding=gbk&useSSL=true",
                "root", "chdyyds");
             Statement s = c.createStatement();

        ) {

            String sql = "select * from user_ where name = '" + name +"' and password = '" + password+"'";


            ResultSet rs = s.executeQuery(sql);

            if(rs.next())
                result = true;

        } catch (SQLException e) {

            e.printStackTrace();
        }

        return result;
       // return true;

}

   //学生登录
    public static boolean check2(String name, String password) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        boolean result = false;
        try (Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/ideajava?user=root&password=chdyyds&characterEncoding=gbk&useSSL=true",
                "root", "chdyyds");
             Statement s = c.createStatement();

        ) {

            String sql = "select * from user_ where name = '" + name +"' and password = '" + password+"'";


            ResultSet rs = s.executeQuery(sql);

            if(rs.next())
                result = true;

        } catch (SQLException e) {

            e.printStackTrace();
        }

        return result;
        //return true;

    }
}

实现效果:

 使用Java.Swing构建GUI,(这里使用 setBounds 方法对组件进行了绝对定位。为了使布局更灵活,可用FlowLayout,BorderLayout实现。)通过为“教师登录”和“学生登录”按钮添加ActionListener,实现登录逻辑。从文本字段获取用户名和密码。调用 check 方法(或 check2 方法)验证用户名和密码。check 方法尝试连接MySQL数据库,并执行SQL查询以验证用户凭据。如果验证成功,显示登录成功的消息,并可能打开一个新的窗口(zhujiemian 或 zhujiemian2 类的实例)。学生登陆成功跳转zhujiemian2,教师登录成功跳转zhujiemian。如果验证失败,显示密码错误的提示。

1.2主界面设计

1.2.1教师端主界面

代码:

import javax.swing.*;
import java.awt.event.ActionListener;
import Table.add;
import Table.delate;
import Table.seek;
import Table.update;
import java.awt.event.*;
class zhujiemian  {
    public static void main(String[] args) {

    }
    public  void de2() {

        JFrame f = new JFrame("学生成绩管理系统");//设置窗口
        f.setSize(800, 600);
        f.setLocation(100, 100);
        f.setLayout(null);

        JLabel l = new JLabel();


        JButton a = new JButton("增加学生成绩信息");//按钮名称
        JButton b = new JButton("删除学生成绩信息");
        JButton c = new JButton("查看学生成绩信息");
        JButton d = new JButton("修改学生成绩信息");
        JButton a1 = new JButton("管理用户");
        JButton a2 = new JButton("退出系统");

        a.setBounds(0, 1, 140, 30);//按钮位置和大小
        b.setBounds(141, 1, 140, 30);
        c.setBounds(282, 1, 140, 30);
        d.setBounds(423, 1, 140, 30);
        a2.setBounds(563, 1, 100, 30);
        a1.setBounds(664, 1, 100, 30);

        // 给按钮 增加 监听
        a.addActionListener(new ActionListener() {

            // 当按钮被点击时,就会触发 ActionEvent事件
            // actionPerformed 方法就会被执行
            public void actionPerformed(ActionEvent e) {
                add add1 = new add();
                add1.de1();
            }
        });
        b.addActionListener(new ActionListener() {

            // 当按钮被点击时,就会触发 ActionEvent事件
            // actionPerformed 方法就会被执行
            public void actionPerformed(ActionEvent e) {
                delate add1 = new delate();
                add1.de2();

            }
        });
        c.addActionListener(new ActionListener() {

            // 当按钮被点击时,就会触发 ActionEvent事件
            // actionPerformed 方法就会被执行
            public void actionPerformed(ActionEvent e) {
                seek add2 = new seek();
                add2.de3();

            }
        });
        d.addActionListener(new ActionListener() {

            // 当按钮被点击时,就会触发 ActionEvent事件
            // actionPerformed 方法就会被执行
            public void actionPerformed(ActionEvent e) {
                update add2 = new update();
                add2.de4();

            }
        });
        a2.addActionListener(new ActionListener() {

            // 当按钮被点击时,就会触发 ActionEvent事件
            // actionPerformed 方法就会被执行
            public void actionPerformed(ActionEvent e) {
                f.dispose();
            }
        });


        f.add(l);
        f.add(a);
        f.add(b);
        f.add(c);
        f.add(d);
        f.add(a2);


        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭

        f.setVisible(true);//可见
    }

}

实现效果: 

教师可对学生成绩进行增、删、改、查。

 1.2.2学生端主界面

代码实现

import javax.swing.*;
import java.awt.event.ActionListener;

import Table.seek2;

import java.awt.event.*;
 class zhujiemian2  {
    public static void main(String[] args) {

    }
    public  void dex() {

        JFrame f = new JFrame("学生成绩管理系统");//设置窗口
        f.setSize(800, 600);
        f.setLocation(100, 100);
        f.setLayout(null);

        JLabel l = new JLabel();



        JButton c = new JButton("查看学生成绩信息");
        JButton a2 = new JButton("退出系统");
        a2.setBounds(333, 1, 140, 30);
        c.setBounds(111, 1, 140, 30);


        // 给按钮 增加 监听

        c.addActionListener(new ActionListener() {

            // 当按钮被点击时,就会触发 ActionEvent事件
            // actionPerformed 方法就会被执行
            public void actionPerformed(ActionEvent e) {
                seek2 add2 = new seek2();
                add2.de3();

            }
        });
        a2.addActionListener(new ActionListener() {

            // 当按钮被点击时,就会触发 ActionEvent事件
            // actionPerformed 方法就会被执行
            public void actionPerformed(ActionEvent e) {
                f.dispose();
            }
        });




        f.add(l);//按钮加进去

        f.add(c);
        f.add(a2);

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭

        f.setVisible(true);//可见
    }

}

实现效果(背景图根据自己的喜好需求添加) :

学生可查看成绩信息。 

1.3各功能模块具体实现

1.3.1教师端学生成绩添加功能:add类

代码实现:

package Table;
import java.awt.event.ActionListener;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import Test.scoreDAO;
import Test.score;

public class add {

    public void de1() {
        JFrame f = new JFrame("增加页面");
        f.setSize(800, 300);
        f.setLocation(200, 200);
        f.setLayout(new BorderLayout());

        final ModelDAO htm = new ModelDAO();

        final JTable t = new JTable(htm);

        JPanel p = new JPanel();

        final JLabel lName = new JLabel("姓名");
        final JTextField tfName = new JTextField("");
        final JLabel lmyclass = new JLabel("班级");
        final JTextField tfmyclass = new JTextField("");

        final JLabel lnumber = new JLabel("学号");
        final JTextField tfnumber = new JTextField("");
        final JLabel lChinesegrade = new JLabel("语文成绩");
        final JTextField tfChinesegrade = new JTextField("");

        final JLabel lMathgrade = new JLabel("数学成绩");
        final JTextField tfMathgrade = new JTextField("");
        final JLabel lEnglishgrade = new JLabel("英语成绩");
        final JTextField tfEnglishgrade = new JTextField("");

        JButton bAdd = new JButton("增加");
        tfName.setPreferredSize(new Dimension(40, 30));
        tfmyclass.setPreferredSize(new Dimension(40, 30));
        tfnumber.setPreferredSize(new Dimension(120, 30));
        tfChinesegrade.setPreferredSize(new Dimension(40, 30));
        tfMathgrade.setPreferredSize(new Dimension(40, 30));
        tfEnglishgrade.setPreferredSize(new Dimension(40, 30));

        p.add(lName);
        p.add(tfName);
        p.add(lmyclass);
        p.add(tfmyclass);

        p.add(lnumber);
        p.add(tfnumber);
        p.add(lChinesegrade);
        p.add(tfChinesegrade);

        p.add(lMathgrade);
        p.add(tfMathgrade);
        p.add(lEnglishgrade);
        p.add(tfEnglishgrade);
        p.add(bAdd);


        JButton a5 = new JButton("返回");
        p.add(a5);
        a5.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                f.dispose();
            }
        });


        bAdd.addActionListener(new ActionListener() {


            public void actionPerformed(ActionEvent e) {

                String name = tfName.getText();
                String name1 = tfmyclass.getText();
                String name2 = tfnumber.getText();
                String name3 = tfChinesegrade.getText();
                String name4 = tfMathgrade.getText();
                String name5 = tfEnglishgrade.getText();
                if (0 == name.length() || 0 == name1.length() || 0 == name2.length() || 0 == name3.length() || 0 == name4.length() || 0 == name5.length()) {
                    JOptionPane.showMessageDialog(f, "输入错误!");
                    tfnumber.grabFocus();

                    return;
                }

                scoreDAO dao = new scoreDAO();


                score h = new score();
                h.name = tfName.getText();
                h.myclass = tfmyclass.getText();
                h.number = Integer.parseInt(tfnumber.getText());
                h.Chinesegrade = Integer.parseInt(tfChinesegrade.getText());
                h.Mathgrade = Integer.parseInt(tfMathgrade.getText());
                h.Englishgrade = Integer.parseInt(tfEnglishgrade.getText());


                dao.add(h);


                htm.scores = dao.list();


                t.updateUI();
            }
        });

        JScrollPane sp = new JScrollPane(t);

        f.add(p, BorderLayout.NORTH);
        f.add(sp, BorderLayout.CENTER);

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.setVisible(true);
    }
}

界面实现图: 

依然使用Swing 组件。添加逻辑:从文本字段获取用户输入的数据。检查输入是否为空,如果为空则弹出提示框。如果输入有效,则创建 score 对象并使用 scoreDAO 的 add 方法将分数添加到数据源。使用 updateUI() 方法刷新 JTable,以显示最新数据。

1.3.2教师端学生成绩删除功能:delate类

代码实现:

package Table;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

import Test.scoreDAO;
import Test.score;

public class delate {

    public void de2() {


        JFrame f = new JFrame("删除界面");
        f.setSize(400, 300);
        f.setLocation(200, 200);
        f.setLayout(new BorderLayout());

        final ModelDAO htm = new ModelDAO();

        final JTable t = new JTable(htm);

        JPanel p = new JPanel();

        final JLabel lnumber = new JLabel("学号");
        final JTextField tfnumber = new JTextField("");
        tfnumber.setText("");

        JButton bAdd = new JButton("删除");

        tfnumber.setPreferredSize(new Dimension(120, 30));


        JButton a5 = new JButton("返回");
        p.add(a5);
        a5.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                f.dispose();
            }
        });

        p.add(lnumber);
        p.add(tfnumber);
        p.add(bAdd);


        // 为增加按钮添加监听
        bAdd.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                String name = tfnumber.getText();
                if (0 == name.length()) {
                    JOptionPane.showMessageDialog(f, "输入错误!");
                    tfnumber.grabFocus();

                    return;
                }

                scoreDAO dao = new scoreDAO();


                score h = new score();
                h.number = Integer.parseInt(tfnumber.getText());

                dao.delete(h.number);


                htm.scores = dao.list();

                t.updateUI();
            }
        });

        JScrollPane sp = new JScrollPane(t);

        f.add(p, BorderLayout.NORTH);
        f.add(sp, BorderLayout.CENTER);

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.setVisible(true);
    }
}

实现效果:

删除逻辑:从文本字段获取学号。检查输入是否为空,如果为空则弹出提示框。创建scoreDAO对象和score对象,设置学号。调用scoreDAO的delete方法删除对应学号的学生记录。

1.3.3教师端学生成绩查询查看功能:seek类

代码:

package Table;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;

import Test.scoreDAO;
import Test.score;


public class seek  {

    public void de3() {
        JFrame f = new JFrame("查找界面");
        f.setSize(400, 300);
        f.setLocation(200, 200);
        f.setLayout(new BorderLayout());

        final ModelDAO htm = new ModelDAO();

        final JTable t = new JTable(htm);

        t.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        t.getSelectionModel().setSelectionInterval(0, 0);
        JPanel p = new JPanel();

        final JLabel lnumber = new JLabel("学号");
        final JTextField tfnumber = new JTextField("");

        JButton bAdd = new JButton("查找");

        tfnumber.setPreferredSize(new Dimension(120, 30));

        JButton a5 = new JButton("返回");
        p.add(a5);
        a5.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                f.dispose();
            }
        });

        p.add(lnumber);
        p.add(tfnumber);
        p.add(bAdd);


        bAdd.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {

                String name = tfnumber.getText();
                if(0==name.length()){
                    JOptionPane.showMessageDialog(f, "输入错误!");
                    tfnumber.grabFocus();

                    return;
                }

                scoreDAO dao = new scoreDAO();

                score h = new score();
                h.number= Integer.parseInt(tfnumber.getText());

                int a = dao.seek(h.number);
                t.getSelectionModel().setSelectionInterval(a-1, a-1);

                htm.scores = dao.list();

                t.updateUI();
            }
        });

        JScrollPane sp = new JScrollPane(t);

        f.add(p, BorderLayout.NORTH);
        f.add(sp, BorderLayout.CENTER);

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.setVisible(true);
    }
}

效果图: 

查找逻辑:从文本字段获取学号。检查输入是否为空,如果为空则弹出提示框。创建 scoreDAO 对象和 score 对象,设置学号。调用 scoreDAO 的 seek 方法查找对应学号的学生记录。表格选择:如果找到学生记录,使用 setSelectionInterval 方法选中表格中的对应行。

1.3.4教师端学生成绩修改功能:update类

代码:

package Table;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

import Test.scoreDAO;
import Test.score;

public class update  {

    public void de4() {
        JFrame f = new JFrame("修改界面");
        f.setSize(800, 300);
        f.setLocation(200, 200);
        f.setLayout(new BorderLayout());

        final ModelDAO htm = new ModelDAO();

        final JTable t = new JTable(htm);

        JPanel p = new JPanel();

        final JLabel lName = new JLabel("姓名");
        final JTextField tfName = new JTextField("");
        final JLabel lmyclass = new JLabel("班级");
        final JTextField tfmyclass = new JTextField("");

        final JLabel lnumber = new JLabel("学号");
        final JTextField tfnumber = new JTextField("");
        final JLabel lChinesegrade = new JLabel("语文成绩");
        final JTextField tfChinesegrade = new JTextField("");

        final JLabel lMathgrade = new JLabel("数学成绩");
        final JTextField tfMathgrade = new JTextField("");
        final JLabel lEnglishgrade = new JLabel("英语成绩");
        final JTextField tfEnglishgrade = new JTextField("");

        JButton bAdd = new JButton("修改");
        tfName.setPreferredSize(new Dimension(40, 30));
        tfmyclass.setPreferredSize(new Dimension(40, 30));
        tfnumber.setPreferredSize(new Dimension(100, 30));
        tfChinesegrade.setPreferredSize(new Dimension(40, 30));
        tfMathgrade.setPreferredSize(new Dimension(40, 30));
        tfEnglishgrade.setPreferredSize(new Dimension(40, 30));

        p.add(lName);
        p.add(tfName);
        p.add(lmyclass);
        p.add(tfmyclass);

        p.add(lnumber);
        p.add(tfnumber);
        p.add(lChinesegrade);
        p.add(tfChinesegrade);

        p.add(lMathgrade);
        p.add(tfMathgrade);
        p.add(lEnglishgrade);
        p.add(tfEnglishgrade);
        p.add(bAdd);

        JButton a5 = new JButton("返回");
        p.add(a5);
        a5.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                f.dispose();
            }
        });


        // 为增加按钮添加监听
        bAdd.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                String name = tfName.getText();
                String name1 = tfmyclass.getText();
                String name2 = tfnumber.getText();
                String name3 = tfChinesegrade.getText();
                String name4 = tfMathgrade.getText();
                String name5 = tfEnglishgrade.getText();
                if(0==name.length()||0==name1.length()||0==name2.length()||0==name3.length()||0==name4.length()||0==name5.length()){
                    JOptionPane.showMessageDialog(f, "输入错误!");
                    tfnumber.grabFocus();

                    return;
                }
                scoreDAO dao = new scoreDAO();


                score h = new score();
                h.name = tfName.getText();
                h.myclass= tfmyclass.getText();
                h.number= Integer.parseInt(tfnumber.getText());
                h.Chinesegrade= Integer.parseInt(tfChinesegrade.getText());
                h.Mathgrade= Integer.parseInt(tfMathgrade.getText());
                h.Englishgrade= Integer.parseInt(tfEnglishgrade.getText());



                dao.update(h);


                htm.scores = dao.list();


                t.updateUI();
            }
        });

        JScrollPane sp = new JScrollPane(t);

        f.add(p, BorderLayout.NORTH);
        f.add(sp, BorderLayout.CENTER);

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.setVisible(true);
    }
}

效果图 

修改逻辑:从文本字段获取用户输入的数据。检查输入是否为空,如果为空则弹出提示框。创建 score 对象并填充数据。使用 scoreDAO 的 update 方法更新数据。更新UI:修改操作后,调用 dao.list() 更新 ModelDAO 中的数据,并使用 t.updateUI() 刷新表格视图。

1.3.5学生端学生成绩查询查看功能:seek2类

代码:

package Table;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

import Test.scoreDAO;
import Test.score;


public class seek2  {

    public void de3() {


        JFrame f = new JFrame("查找界面");
        f.setSize(400, 300);
        f.setLocation(200, 200);
        f.setLayout(new BorderLayout());


        JPanel p = new JPanel();

        final JLabel lnumber = new JLabel("学号");
        final JTextField tfnumber = new JTextField("");

        JButton bAdd = new JButton("查找");
        JButton a5 = new JButton("返回");

        tfnumber.setPreferredSize(new Dimension(100, 30));

        p.add(lnumber);
        p.add(tfnumber);
        p.add(bAdd);
        p.add(a5);
        a5.addActionListener(new ActionListener() {


            public void actionPerformed(ActionEvent e) {
                f.dispose();
            }
        });
        // 为增加按钮添加监听
        bAdd.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                String name = tfnumber.getText();
                if(0==name.length()){
                    JOptionPane.showMessageDialog(f, "输入错误!");
                    tfnumber.grabFocus();

                    return;
                }

                scoreDAO dao = new scoreDAO();


                score h = new score();
                h.number= Integer.parseInt(tfnumber.getText());

                h = dao.get(h.number);
                String a = h.name;
                String b = h.myclass;
                String c="";
                c=String.valueOf(h.number);
                String d="";
                d=String.valueOf(h.Chinesegrade);
                String m="";
                m=String.valueOf(h.Mathgrade);
                String g="";
                g=String.valueOf(h.Englishgrade);

                String[] columnNames = new String[] { "姓名", "班级", "学号", "语文成绩", "数学成绩", "英语成绩" };
                String[][] heros = new String[][] { { "a", "b", "c", "d", "m", "g" } };
                heros[0][0]=a;
                heros[0][1]=b;
                heros[0][2]=c;
                heros[0][3]=d;
                heros[0][4]=m;
                heros[0][5]=g;
                JTable t = new JTable(heros, columnNames);

                // 根据t创建 JScrollPane  垂直滚动视图
                JScrollPane sp = new JScrollPane(t);
                f.add(sp, BorderLayout.CENTER);
                f.setVisible(true);

            }
        });



        f.add(p, BorderLayout.NORTH);


        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.setVisible(true);
    }
}

实现效果:

查找逻辑:从文本字段获取输入的学号。检查输入是否为空,如果为空则弹出提示框。使用 scoreDAO 的 get 方法根据学号查找学生对象。显示结果:如果找到学生,创建一个 JTable 来显示学生的详细信息,并将其添加到 JScrollPane 中。

1.3.6基本数据模型实现功能:ModelDAO类

ModelDAO是一个自定义数据模型,实现代码如下:

package Table;

import java.util.List;

import javax.swing.table.AbstractTableModel;

import Test.scoreDAO;
import Test.score;

public class ModelDAO extends AbstractTableModel {

    String[] columnNames = new String[] { "姓名", "班级", "学号", "语文成绩", "数学成绩", "英语成绩" };

    public List<score> scores = new scoreDAO().list();

    public int getRowCount() {

        return scores.size();
    }

    public int getColumnCount() {

        return columnNames.length;
    }

    public String getColumnName(int columnIndex) {

        return columnNames[columnIndex];
    }

    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        score h = scores.get(rowIndex);
        if (0 == columnIndex)
            return h.name;
        if (1 == columnIndex)
            return h.myclass;
        if (2 == columnIndex)
            return h.number;
        if (3 == columnIndex)
            return h.Chinesegrade;
        if (4 == columnIndex)
            return h.Mathgrade;
        if (5 == columnIndex)
            return h.Englishgrade;
        return null;
    }

}

实现效果图:

 这一部分,导入了 java.util.List 和 javax.swing.table.AbstractTableModel,分别用于列表操作和表格模型。 ModelDAO 继承AbstractTableModel。public List<score> scores 定义了一个 score 类型的列表,用于存储分数数据。初始值是通过调用 new scoreDAO().list() 获取的分数列表。getRowCount() 返回表格的行数,即分数列表的大小。

getColumnCount() 返回表格的列数,即列名数组的长度。

getColumnName(int columnIndex) 返回指定列索引的列名。

isCellEditable(int rowIndex, int columnIndex) 返回 false,表示表格单元格不可编辑。getValueAt(int rowIndex, int columnIndex) 根据行索引和列索引返回单元格的值。使用 if 语句确定列,并返回相应的 score 对象的属性。

getValueAt 方法通过 scores.get(rowIndex) 获取指定行的 score 对象,并根据列索引返回相应的值。

在整个功能实现过程中,使用MVC模式思想,创建一个自定义数据模型ModelDAO ,它继承自 AbstractTableModel,自定义了表格的数据模型。用于提供表格显示的数据ModelDAO 类似于模型层,负责数据和业务逻辑;JTable 和相关组件属于视图层,显示数据;事件监听器则充当控制器的角色,响应用户操作。

1.4成绩类及功能接口

定义学生成绩类:

package Test;
public class score {
    public String name;
    public String myclass;
    public int number;
    public int Chinesegrade;
    public int Mathgrade;
    public int Englishgrade;
}

增、删、改、查功能实现接口:

package Test;

import java.util.List;

public interface DAO{
    //增加
    public void add(score score1);
    //修改
    public void update(score score1);
    //删除
    public void delete(int number);
    //获取
    public score get(int number);
    //查询
    public List<score> list();
    //分页查询
    public List<score> list(int start, int count);
}

2.数据库部分

2.1数据库设计

用户登录表

Field

Type    

Collation

 Null

 Key

Default

name

char(20)

gbk_chinese_ci

 NO

 PRI

(NULL)   

password

varchar(30)

gbk_chinese_ci

YES

     

(NULL)

实现代码如下:

CREATE TABLE `user_` (
  `name` char(20) NOT NULL,
  `password` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk

创建成功如下图所示:

学生成绩表

Field    

Type   

Collation   

 Null  

Key

Default

name  

char(20)

gbk_chinese_ci

 NO  

PRI   

 (NULL)

myclass  

 char(20)

gbk_chinese_ci

YES

(NULL)

number

int  

(NULL)     

NO  

PRI  

(NULL)

Chinesegrade

int  

(NULL)     

YES

(NULL)

mathgrade   

int  

(NULL)     

YES

(NULL)

Englishgrade

int  

(NULL)     

YES

(NULL)

实现代码如下:

 CREATE TABLE `score` (
  `name` char(20) NOT NULL,
  `myclass` char(20) DEFAULT NULL,
  `number` int NOT NULL AUTO_INCREMENT,
  `Chinesegrade` int DEFAULT NULL,
  `mathgrade` int DEFAULT NULL,
  `Englishgrade` int DEFAULT NULL,
  PRIMARY KEY (`name`,`number`),
  KEY `number` (`number`)
) ENGINE=InnoDB AUTO_INCREMENT=2215 DEFAULT CHARSET=gbk 

创建成功界面:

1.2连接数据库

这里是将MySQL数据库连接到idea上。

(1) 调用Class.forName()方法加载驱动程序。

(2) 调用DriverManager对象的getConnection()方法,获得一个Connection对象。

(3) 创建一个Statement对象,准备一个SQL语句,这个SQL语句可以是Statement对象(立即执行的的语句)、PreparedStatement语句(预编译的语句)或CallableStatement对象(存储过程调用的语句)。

(4) 调用excuteQuery()等方法执行SQL语句,并将结果保存在ResultSet对象;或者调用executeUpdate()等方法执行SQL语句,不返回ResultSet对象的结果。

(5)对返回的ResultSet对象进行显示等相当的处理。

(6)释放资源。

将数据库连接 与学生成绩信息增删查改结合。

实现从MySQL数据库中根据学号(number)查询学生的成绩信息,代码如下:

package Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class idear {

    public static score get(int number) {
        score score1 = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        try (Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/ideajava?user=root&password=chdyyds&characterEncoding=gbk&useSSL=true","root","chdyyds");
             Statement s = c.createStatement();) {

            String sql = "select * from score where number = " + number;

            ResultSet rs = s.executeQuery(sql);

            // 因为number是唯一的,ResultSet最多只能有一条
            if (rs.next()) {
                score1 = new score();

                String name = rs.getString("NAME");
                String myclass = rs.getString("class");
                int Chinesegrade = rs.getInt("chinesecore");
                int Mathgrade = rs.getInt("mathscore");
                int Englishgrade= rs.getInt("englishscore");

                score1.name = name;
                score1.myclass = myclass;
                score1.Chinesegrade = Chinesegrade;
                score1.Mathgrade = Mathgrade;
                score1.Englishgrade = Englishgrade;
                score1.number = number;
            }

        } catch (SQLException e) {

            e.printStackTrace();
        }
        return score1;

    }

    public static void main(String[] args) {

        score h = get(2016403211);
        System.out.println(h.name);
        System.out.println(h.myclass );
        System.out.println(h.number );
        System.out.println(h.Chinesegrade );
        System.out.println(h.Mathgrade );
        System.out.println(h.Englishgrade );

    }
}

通过实现数据访问对象(DAO)模式,用于操作和管理学生成绩数据的数据库交互。 代码如下:

package Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;


public class scoreDAO implements DAO{

    public scoreDAO() {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public Connection getConnection() throws SQLException {
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/ideajava?user=root&password=chdyyds&characterEncoding=gbk&useSSL=true",
                "root", "chdyyds");
    }

    public int getTotal() {
        int total = 0;
        try (Connection c = getConnection(); Statement s = c.createStatement();) {

            String sql = "select count(*) from score";

            ResultSet rs = s.executeQuery(sql);
            while (rs.next()) {
                total = rs.getInt(1);
            }

            System.out.println("total:" + total);

        } catch (SQLException e) {

            e.printStackTrace();
        }
        return total;
    }

    public void add(score score1) {

        String sql = "insert into score values(?,?,?,?,?,?)";
        try (Connection c = getConnection();
             PreparedStatement ps = c.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);) {

            ps.setString(1, score1.name);
            ps.setString(2, score1.myclass);
            ps.setInt(3, score1.number);
            ps.setInt(4,score1.Chinesegrade);
            ps.setInt(5,score1.Mathgrade);
            ps.setInt(6,score1.Englishgrade);

            ps.execute();

            ResultSet rs = ps.getGeneratedKeys();
            if (rs.next()) {
                int number = rs.getInt(1);
                score1.number = number;
            }
        } catch (SQLException e) {

            e.printStackTrace();
        }
    }
    public void add2(String m ,int n) {

        String sql = "insert into user_ values(?,?)";
        try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {

            ps.setString(1, m);
            ps.setInt(2, n);

            ResultSet rs = ps.getGeneratedKeys();
            if (rs.next()) {
                int number = rs.getInt(1);
                n = number;
            }
        } catch (SQLException e) {

            e.printStackTrace();
        }
    }

    public void update(score score1) {


        String sql = "update score set Name= ?, myclass = ? , Chinesegrade = ? , Mathgrade = ?, Englishgrade = ? where number = ?";
        try (Connection c = getConnection();
             PreparedStatement ps = c.prepareStatement(sql);) {

            ps.setString(1, score1.name);
            ps.setString(2, score1.myclass);
            ps.setInt(3,score1.Chinesegrade);
            ps.setInt(4,score1.Mathgrade);
            ps.setInt(5,score1.Englishgrade);
            ps.setInt(6, score1.number);

            ps.execute();

        } catch (SQLException e) {

            e.printStackTrace();
        }

    }

    public void delete(int number) {

        try (Connection c = getConnection(); Statement s = c.createStatement();) {

            String sql = "delete from score where number = " + number;

            s.execute(sql);

        } catch (SQLException e) {

            e.printStackTrace();
        }
    }

    public score get(int number) {
        score score1 = null;

        try (Connection c = getConnection(); Statement s = c.createStatement();) {

            String sql = "select * from score where number = " + number;

            ResultSet rs = s.executeQuery(sql);

            if (rs.next()) {
                score1 = new score();
                String name = rs.getString("name");
                String myclass = rs.getString("myclass");
                int Chinesegrade = rs.getInt("Chinesegrade");
                int Mathgrade = rs.getInt("Mathgrade");
                int Englishgrade= rs.getInt("Englishgrade");

                score1.name = name;
                score1.myclass = myclass;
                score1.Chinesegrade = Chinesegrade;
                score1.Mathgrade = Mathgrade;
                score1.Englishgrade = Englishgrade;
                score1.number = number;
            }

        } catch (SQLException e) {

            e.printStackTrace();
        }
        return score1;
    }
    public int seek(int number) {
        score score1 = null;

        try (Connection c = getConnection(); Statement s = c.createStatement();) {

            String sql = "SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY `number`) AS `x` FROM `score`) AS `asd` WHERE `number` = " + number;

            ResultSet rs = s.executeQuery(sql);

            if (rs.next()) {
                score1 = new score();

                int Chinesegrade = rs.getInt("x");
                score1.number = Chinesegrade;

            }

        } catch (SQLException e) {

            e.printStackTrace();
        }
        return score1.number;
    }

    public List<score> list() {
        return list(0, Short.MAX_VALUE);
    }

    public List<score> list(int start, int count) {
        List<score> scores = new ArrayList<score>();

        String sql = "SELECT * FROM score ORDER BY number LIMIT ?, ?";

        try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql);) {

            ps.setInt(1, start);
            ps.setInt(2, count);

            ResultSet rs = ps.executeQuery();

            while (rs.next()) {
                score score1 = new score();
                String name = rs.getString("name");
                String myclass = rs.getString("myclass");
                int number= rs.getInt("number");
                int Chinesegrade = rs.getInt("Chinesegrade");
                int Mathgrade = rs.getInt("Mathgrade");
                int Englishgrade= rs.getInt("Englishgrade");

                score1.name = name;
                score1.myclass = myclass;
                score1.Chinesegrade = Chinesegrade;
                score1.Mathgrade = Mathgrade;
                score1.Englishgrade = Englishgrade;
                score1.number = number;
                scores.add(score1);
            }
        } catch (SQLException e) {

            e.printStackTrace();
        }
        return scores;
    }

}

总结 

本项目还有许多不足的地方需要完善。

1.缺少全局搜索功能,只能在明确知道学号的前提下,进行信息查询,不支持在其中输入任意关键词进行搜索。后续考虑加入全局搜索功能,实现模糊搜索。

2.自定义数据模型,此数据模型有局限性,当前的数据模型不支持动态更新。如果 scores 列表发生变化,需要一种方法来通知 ModelDAO 更新视图。后续考虑修改成如果 score 对象的属性发生变化,调用 fireTableCellUpdated 方法来更新表格视图。

3.关于线程安全,如果 ModelDAO 的 scores 列表在多线程环境下被修改,需要确保线程安全。后续考虑使用线程封闭(Thread Confinement)原则,来确保每个线程都有自己的ScoreDAO实例,避免多线程访问同一个实例的问题。

总之,课程设计可以反映解决问题的逻辑思维和创新能力,只有在实际设计中才会发现,书本上理论性的东西与在实际运用中的还是有一定的出入的,所以有些问题不但要深入地理解,而且要不断地更正以前的错误思维。一切问题必须要靠自己一点一滴的解决,而在解决的过程当中会发现自己在飞速的提升。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值