学生管理系统--【Java+MySQL】--数据库系统概论综合性实验

大二上学期末零基础开始用Java写的数据库实验报告,界面做的丑丑的,函数也有很多冗余的地方。
不过当时做出来还是挺开心的
对新手应该还是挺友好的(毕竟我也是啥都不会开始写的)

实验目的

通过实验,使学生掌握数据库系统设计和开发的一般方法,能够设计并实现简单的数
据库系统。

实验要求

熟悉实验室实验环境,掌握实验预备知识,了解实验中故障排除的基本方法。实验中
根据实验内容和步骤完成相应的任务,并独立完成实验报告。

实验内容和步骤

假设有“教师”、“学生”、“课程”三个实体,教师的基本信息包括:工号、姓名、职
称、工资,课程的基本信息包括:课程号、课程名、学分数,学生的基本信息包括:学
号、姓名、性别、年龄。系统必须满足以下要求:
(1) 一门课程只能有一个教师任课,一个教师可以上多门课程;
(2) 一个学生可以选修多门课程,一门课程可以由多个学生来选修,记录不同学生选
修不同课程的成绩;
(3) 设置一个管理员,用于维护(添加、删除和修改等基本任务)学生基本信息、教
师基本信息和教师所授课程等工作,此外,管理员添加学生时,为其设置初始密
码;当学生选修了某门课程,课程成绩由管理员录入;
(4) 学生可以利用学号和密码登录系统,登陆系统后,可以进行选课、修改密码和个
人基本信息、查询自己的选课及总学分等操作;
(5) 能够统计不同职称的教师的数量、不同职称的教师的平均工资,可以统计每门课
程的平均成绩、最高分、最低分,统计每个学生选修课程的总学分;

根据上述描述,解答下列问题:
(1) 设计并画出E-R 图,要求标注连通词(即联系类型);
在这里插入图片描述
(2) 将E-R 图转化为关系模型,并指出各关系的主码和外码;
学生表(学号,姓名,性别,年龄,密码)学号为主码
教师表(工号,姓名,职称,工资,密码)工号为主码
课程表(课程号,课程名,选课人数,学分数,教工号),课程号为主码,教工号为外码
选修表(学号,课程号,成绩),学号和课程号为外码,两者一起构成这张表的主码
(3) 在MySql、SQL Server、Oracle 中选择一个数据库管理系统,并完成数据库的逻辑设计;

用户并赋予权限

create user dblesson identified by byd123;
grant connect,resource,unlimited tablespace to dblesson;
grant create view to dblesson;

创建学生表

create table student(
    sno varchar(10) primary key,
    sname varchar(20),
    ssex varchar(10),
    sage smallint ,
    pwd varchar(20) DEFAULT '123456' not null
);

创建教师表

create table teacher(
    tno varchar(10) primary key,
    tname varchar(20),
    tsalary smallint ,
    trank varchar(20),
    pwd varchar(20) DEFAULT '123456' not null
);

创建课程表

create table course(
    cno varchar(10) primary key,
    cpno varchar(10),
    cname varchar(20),
    ccredit smallint ,
    tno varchar(10) DEFAULT '1' not null,
    foreign key (tno) references teacher(tno)
);

创建已选课表

create table sc(
    sno varchar(10),
    cno varchar(10),
    grade smallint,
    tno varchar(10) DEFAULT '1',
    foreign key (sno) references student(sno),
    foreign key (tno) references teacher(tno),
    foreign key (cno) references course(cno) 
);

向学生表中插入数据

insert into student(sname,ssex,sno, sage, pwd) values('李勇','男','201215121',20,'123456');
insert into student(sname,ssex,sno, sage, pwd) values('刘晨','女','201215122',19,'123456');
insert into student(sname,ssex,sno, sage, pwd) values('王敏','女','201215123',18,'123456');
insert into student(sname,ssex,sno, sage, pwd) values('张立','男','201215125',19,'123456');
insert into student(sname,ssex,sno, sage, pwd) values('xx','男','1',20,'123456');
insert into student(sname,ssex,sno, sage, pwd) values('yy','女','2',19,'123456');

向教师表中插入数据

insert into teacher(tno,tname, trank, tsalary, pwd) values('1','熊大','教授',15000,'123456');
insert into teacher(tno,tname, trank, tsalary, pwd) values('2','熊二','副教授',9000,'123456');
insert into teacher(tno,tname, trank, tsalary, pwd) values('3','熊妹','副教授',10000,'123456');
insert into teacher(tno,tname, trank, tsalary, pwd) values('4','熊三','讲师',3000,'123456');

向课程表中插入数据

insert into course(cno,cname,ccredit,tno,cpno) values('6','数据处理',2,'1','2');
insert into course(cno,cname,ccredit,tno,cpno) values('2','数学',4,'2',null);
insert into course(cno,cname,ccredit,tno,cpno) values('7','PASCAL语言',4,'1',null);
insert into course(cno,cname,ccredit,tno,cpno) values('5','数据结构',4,'1','7');
insert into course(cno,cname,ccredit,tno,cpno) values('1','数据库',2,'1','5');
insert into course(cno,cname,ccredit,tno,cpno) values('3','信息系统',3,'1','1');
insert into course(cno,cname,ccredit,tno,cpno) values('4','操作系统',3,'1','1');

向已选课表中插入数据

insert into sc values('201215121','1',92,'1');
insert into sc values('201215121','2',85,'2');
insert into sc values('201215121','3',88,'1');
insert into sc values('201215122','2',90,'2');
insert into sc values('201215122','3',80,'2');
insert into sc values('1','2',65,'2');
insert into sc values('1','7',0,'1');

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验代码

数据库操作部分:

package Database;
import java.sql.*;

public class OperationMySql {
    // 定义数据库连接url
    private String dburl = "jdbc:mysql://localhost:3306/StuInfo ?characterEncoding=utf-8&rewriteBatchedStatement=true";
    // 定义数据库连接
    private Connection conn = null;
    // 定义数据库状态
    private PreparedStatement stmt = null;
    // 定义数据库返回结果集
    private ResultSet rs = null;
    // 定义数据库用户名
    private String username = null;
    // 定义数据库连接密码
    private String password = null;
    // 定义数据库驱动方式
    private String dbdriver = "com.mysql.cj.jdbc.Driver";

    // 设置数据库连接url的方法
    public void setDburl(String dburl) {
        this.dburl = dburl;
    }

    // 返回当前实例数据库连接url
    public String getDburl() {
        return dburl;
    }

    // 返回当前实例结果集的方法
    public ResultSet getRs() {
        return rs;
    }

    // 设置当前实例结果集的方法
    public void setRs(ResultSet rs) {
        this.rs = rs;
    }

    // 设置数据库用户名的方法
    public void setUsername(String username) {
        this.username = username;
    }

    // 返回当前实例化数据库用户名
    public String getUsername() {
        return username;
    }

    // 设置数据库连接的方法
    public void setPassword(String password) {
        this.password = password;
    }

    // 返回当前实例数据库连接密码
    public String getPassword() { return password; }

    // 设置数据库驱动方式的方法
    public void setDbdriver(String dbdriver) {
        this.dbdriver = dbdriver;
    }

    // 返回当前实例数据库驱动方式的方法
    public String getDbdriver() {
        return dbdriver;
    }

    // 创建数据库连接的方法
    Connection CreateConnection(String dburl, String username, String password) throws Exception {
        setDburl(dburl);
        setUsername(username);
        setPassword(password);
        Class.forName(getDbdriver());
        // 根据数据库路径、用户名和密码创建连接并返回该连接
        return DriverManager.getConnection(dburl, username, password);
    }

    // 关闭结果集的方法
    public void CloseRS() {
        try {
            rs.close();
        } catch (SQLException e) {
            System.out.println("关闭结果集时发生错误!");
        }
    }

    // 关闭状态的方法
    public void CloseStmt() {
        try {
            stmt.close();
        } catch (SQLException e) {
            System.out.println("关闭状态时发生错误!");
        }
    }
    // 关闭连接的方法
    public void CloseConnection() {
        try {
            conn.close();
        } catch (SQLException e) {
            System.out.println("关闭连接时发生错误!");
        }
    }
//查询所有学生的信息
    public ResultSet excuteQueryStuInfo() throws Exception{
        try {
            conn = CreateConnection(getDburl(), getUsername(), getPassword());
            String sql = "select * from student ";
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }
        return rs;
    }
//查询所有教师的信息
    public ResultSet excuteQueryTeaInfo()throws Exception {
        try {
            conn = CreateConnection(getDburl(), getUsername(), getPassword());
            String sql = "select * from teacher ";
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }
        return rs;
    }
//管理员查询所有课程的信息
    public ResultSet excuteCourseInfo() throws Exception{
        try {
            conn = CreateConnection(getDburl(), getUsername(), getPassword());
            String sql = "select course.cno,course.cname,course.ccredit,teacher.tname from course,teacher where(course.tno=teacher.tno); ";
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }
        return rs;

    }
//管理员查询所有学生的选课信息
    public ResultSet excuteCourseSelectInfo() throws Exception{
        try {
            conn = CreateConnection(getDburl(), getUsername(), getPassword());
            String sql = "select sc.cno,course.cname,student.sno,student.sname,sc.grade from course,sc,student where (sc.cno=course.cno)and(sc.sno=student.sno); ";
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }
        return rs;
    }
//管理员插入学生信息
    public ResultSet executeInsertStuInfo(String _name, String _age, String _sno, String _sex)throws Exception {
        try {
            conn = CreateConnection(getDburl(), getUsername(), getPassword());
            stmt = conn.prepareStatement("insert into student values(?,?,?,?,?)");
            stmt.setString(1, _sno);
            stmt.setString(2, _name);
            stmt.setString(3, _sex);
            stmt.setString(4, _age);
            stmt.setString(5, String.valueOf(123456));
            stmt.executeUpdate();
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }
        return rs;
    }
//查询自己的选课信息
    public ResultSet excutemyCourseSelect(String _sno) {
        try{
            try {
                conn = CreateConnection(getDburl(), getUsername(), getPassword());
            } catch (Exception e) {
                e.printStackTrace();
            }
            String sql = "select course.cname,course.ccredit,sc.grade from sc,course where course.cno=sc.cno and sno="+"'"+_sno+"'";
            System.out.println(sql);
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();
        } catch (SQLException ex) {
            System.err.println(ex.getMessage());
        }
        return rs;
    }
//查询个人信息
    public ResultSet excutemyInfo(String _sno) throws Exception{
        conn = CreateConnection(getDburl(), getUsername(), getPassword());
        String sql = "select * from student where sno="+"'"+_sno+"'";
        System.out.println(sql);
        stmt = conn.prepareStatement(sql);
        rs = stmt.executeQuery();
        return rs;
    }
//修改自己的密码
    public int executeInsertStuInfo(String _pwd,String _sno)throws Exception {
        conn = CreateConnection(getDburl(), getUsername(), getPassword());
        String sql = "UPDATE student SET pwd="+"'"+_pwd+"'"+"WHERE sno="+"'"+_sno+"'";
        System.out.println(sql);
        stmt = conn.prepareStatement(sql);
        int changeLine = stmt.executeUpdate();
        return changeLine;
    }
//管理员录入学生成绩
    public int executeAddScore(String _sno, String _cno, String _grade) throws Exception{
        conn = CreateConnection(getDburl(), getUsername(), getPassword());
        String sql = "INSERT INTO sc (sno, cno, grade) VALUES ("+_sno +"," +_cno + "," + _grade +")" ;
        System.out.println(sql);
        stmt = conn.prepareStatement(sql);
        int changeLine = stmt.executeUpdate();
        return changeLine;
    }
        /*INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );
         UPDATE table_name SET field1=new-value1, field2=new-value2
           [WHERE Clause]*/
//管理员为学生修改姓名
    public int executeUpdateSname(String _sno, String _sname) throws Exception{
        conn = CreateConnection(getDburl(), getUsername(), getPassword());
        String sql = "UPDATE student set sname= ' "+ _sname + " ' WHERE sno= '" +_sno + "'";
        System.out.println(sql);
        stmt = conn.prepareStatement(sql);
        int changeLine = stmt.executeUpdate();
        return changeLine;
    }
//管理员修改学生的年龄
    public int executeUpdateAge(String _sno, String _sage) throws Exception{
        conn = CreateConnection(getDburl(), getUsername(), getPassword());
        String sql = "UPDATE student set sage= '"+ _sage +" ' WHERE sno= '" +_sno + "'";
        System.out.println(sql);
        stmt = conn.prepareStatement(sql);
        int changeLine = stmt.executeUpdate();
        return changeLine;
    }
//管理员修改学生性别
    public int executeUpdateSex(String _sno, String _ssex) throws Exception{
        conn = CreateConnection(getDburl(), getUsername(), getPassword());
        String sql = "UPDATE student set ssex= ' "+ _ssex +" ' WHERE sno= '" +_sno + "'";
        System.out.println(sql);
        stmt = conn.prepareStatement(sql);
        int changeLine = stmt.executeUpdate();
        return changeLine;
    }
//管理员重置学生密码
    public int executeUpdatePwd(String _sno)  throws Exception{
        conn = CreateConnection(getDburl(), getUsername(), getPassword());
        String sql = "UPDATE student set pwd= '123456' WHERE sno  = '" +_sno + "'";
        System.out.println(sql);
        stmt = conn.prepareStatement(sql);
        int changeLine = stmt.executeUpdate();
        return changeLine;
    }
//学生选课
    public int executeSelectmycourse(String mysno,String newCourse)throws Exception {
        conn = CreateConnection(getDburl(), getUsername(), getPassword());
        String sql = "INSERT INTO sc (sno, cno, grade) VALUES ("+mysno +"," + newCourse + "," + null +")" ;
        System.out.println(sql);
        stmt = conn.prepareStatement(sql);
        int changeLine = stmt.executeUpdate();
        return changeLine;
    }
//学生查询自己所修的总学分
    public ResultSet excutemySumCredit(String mysno) throws Exception{
        conn = CreateConnection(getDburl(), getUsername(), getPassword());
        String sql = "select sum(ccredit) from course,sc  where ((sc.cno=course.cno)and sc.sno='" + mysno + " ')";
        System.out.println(sql);
        stmt = conn.prepareStatement(sql);
        rs = stmt.executeQuery();
        return rs;
    }
//统计课程的信息,最高分最低分,所修人数
    public ResultSet excuteCourseConclude() throws Exception{
        conn = CreateConnection(getDburl(), getUsername(), getPassword());
        String sql = "select course.cname,count(sc.cno),avg(sc.grade),max(sc.grade),min(sc.grade) from sc,course where sc.cno=course.cno group by sc.cno ";
        System.out.println(sql);
        stmt = conn.prepareStatement(sql);
        rs = stmt.executeQuery();
        return rs;
    }
//统计各个职称的信息,教师人数,平均薪资
    public ResultSet excuteTeacherConclude() throws Exception {
        conn = CreateConnection(getDburl(), getUsername(), getPassword());
        String sql = " select trank, count(trank), avg(tsalary) from teacher  group by trank";
        System.out.println(sql);
        stmt = conn.prepareStatement(sql);
        rs = stmt.executeQuery();
        return rs;
    }
//统计学生的信息,所修学分,课程平均分
    public ResultSet excuteStuConclude() throws Exception {
        conn = CreateConnection(getDburl(), getUsername(), getPassword());
        String sql = "select student.sname ,sum(course.ccredit), avg(sc.grade) from sc,student,course where (sc.cno=course.cno and sc.sno=student.sno) group by student.sname;";
        System.out.println(sql);
        stmt = conn.prepareStatement(sql);
        rs = stmt.executeQuery();
        return rs;
    }
    /*SELECT SUM(Quantity) AS TotalItemsOrdered FROM OrderDetails;
    * SELECT SUM(column_name) FROM table_name;
    * */

}

GUI界面

管理员界面

package Database;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.sql.*;

public class ManagerGui extends JFrame implements MouseListener {
    private JTabbedPane Base;
    private JPanel jp1, jp2, jp3, jp4, jp5, jp6, jp7,jp8;
    // 定义选项卡上的嵌板
    /*
     * jp1,  查询所有学生信息
     * jp2,  查询所有老师信息
     * jp3,  查询所有课程信息
     * jp4,  查询所有选课信息
     * jp5,  增加学生信息
     * jp6, 修改学生信息
     * jp7,
     * jp8,  统计数据(不同职称的教师的数量、不同职称的教师的平均工资,可以统计每门课
程的平均成绩、最高分、最低分,统计每个学生选修课程的总学分)
     */
    private JButton UpdateName, UpdateSex, UpdateSage, UpdatePwd, QueryStuInfo, QuerySelectCourse, QueryCourse, QueryTeaInfo, AddStu, UpdateStu, ReSet, AddScore,concludeTeacher,conculdeCourse,concludeStudent;
    private TextArea QueryStuInfoResult, QueryCourseResult, QueryTeaInfoResult, QuerySelCourseResult,concludeResult;
    private JLabel AddName, AddSno, AddSex, AddAge, ScoreNumberla, StuScorela, Stusnola, UpdateNamela, UpdateSexla, UpdateSagela, UpdateSnola;
    private JTextField nameText, snoText, ageText, sexText, ScoreNumber, StuScore, Stusno, UpdateNameText, UpdateSexText, UpdateSageText, UpdateSnoText;

    // 定义一个数据库操作的实例
    private OperationMySql db;

    public static void main(String[] args) {
        new ManagerGui();
    }

    public ManagerGui() {
        setPanel();
        setButton();
        setTextArea();
        setLable();
        setTextFiled();
        setAddStuPanel();
        setBase();
        setThis();
        setDB();
        addListener();
    }

    private void setPanel() {
        jp1 = new JPanel();
        jp2 = new JPanel();
        jp3 = new JPanel();
        jp4 = new JPanel();
        jp5 = new JPanel();
        jp6 = new JPanel();
        jp7 = new JPanel();
        jp8= new JPanel();
    }

    private void setBase() {
        Base = new JTabbedPane(JTabbedPane.TOP);
        Base.addTab("查询所有学生信息", jp1);
        Base.addTab("查询所有老师信息", jp2);
        Base.addTab("查询所有课程信息", jp3);
        Base.addTab("查询所有选课信息", jp4);
        Base.addTab("增加学生信息", jp5);
        Base.addTab("修改学生信息", jp6);
        Base.addTab("成绩录入", jp7);
        Base.addTab("情况统计",jp8);
    }

    private void setThis() {
        this.add(Base);
        this.setTitle("2006200018--管理员登入:");
        this.setSize(500, 450);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setVisible(true);
    }

    private void setButton() {
        QueryStuInfo = new JButton("查询所有学生信息");
        QueryTeaInfo = new JButton("查询所有教师信息");
        QueryCourse = new JButton("查询所有课程信息");
        QuerySelectCourse = new JButton("查询所有选课信息");
        AddStu = new JButton("新增学生");
        UpdateStu = new JButton("修改学生信息");
        UpdateSex = new JButton("性别修改");
        UpdateSage = new JButton("年龄修改");
        UpdateName = new JButton("姓名修改");
        conculdeCourse=new JButton("统计课程信息");
        concludeStudent=new JButton("统计学生信息");
        concludeTeacher=new JButton("统计老师信息");
        ReSet = new JButton("重  置");
        AddScore = new JButton("录入成绩");
        UpdatePwd=new JButton("一键重置学生密码");
        QueryStuInfo.setFont(new Font("宋体", 1, 14));
        QueryTeaInfo.setFont(new Font("宋体", 1, 14));
        QueryCourse.setFont(new Font("宋体", 1, 14));
        QuerySelectCourse.setFont(new Font("宋体", 1, 14));
        concludeTeacher.setFont(new Font("宋体", 1, 14));
        concludeStudent.setFont(new Font("宋体", 1, 14));
        conculdeCourse.setFont(new Font("宋体", 1, 14));
        AddStu.setFont(new Font("宋体", 1, 25));
        UpdateStu.setFont(new Font("宋体", 1, 25));
        ReSet.setFont(new Font("宋体", 1, 25));
        AddScore.setFont(new Font("宋体", 1, 25));
        UpdateName.setFont(new Font("宋体", 1, 25));
        UpdateSage.setFont(new Font("宋体", 1, 25));
        UpdateSex.setFont(new Font("宋体", 1, 25));
        UpdatePwd.setFont(new Font("宋体", 1, 25));
        QueryStuInfo.setBackground(Color.CYAN);
        QueryStuInfo.setMargin(new Insets(0, 0, 0, 0));
        QueryTeaInfo.setBackground(Color.CYAN);
        QueryTeaInfo.setMargin(new Insets(0, 0, 0, 0));
        QueryCourse.setBackground(Color.CYAN);
        QueryCourse.setMargin(new Insets(0, 0, 0, 0));
        QuerySelectCourse.setBackground(Color.CYAN);
        QuerySelectCourse.setMargin(new Insets(0, 0, 0, 0));
        AddStu.setBackground(Color.CYAN);
        AddStu.setMargin(new Insets(0, 0, 0, 0));
        ReSet.setBackground(Color.CYAN);
        ReSet.setMargin(new Insets(0, 0, 0, 0));
        UpdateStu.setBackground(Color.CYAN);
        UpdateStu.setMargin(new Insets(0, 0, 0, 0));
        ReSet.setBackground(Color.CYAN);
        ReSet.setMargin(new Insets(0, 0, 0, 0));
        UpdateSage.setBackground(Color.CYAN);
        UpdateSage.setMargin(new Insets(0, 0, 0, 0));
        UpdateName.setBackground(Color.CYAN);
        UpdateName.setMargin(new Insets(0, 0, 0, 0));
        UpdateSex.setBackground(Color.CYAN);
        UpdateSex.setMargin(new Insets(0, 0, 0, 0));
        conculdeCourse.setBackground(Color.CYAN);
        conculdeCourse.setMargin(new Insets(0, 0, 0, 0));
        concludeStudent.setBackground(Color.CYAN);
        concludeStudent.setMargin(new Insets(0, 0, 0, 0));
        concludeTeacher.setBackground(Color.CYAN);
        concludeTeacher.setMargin(new Insets(0, 0, 0, 0));
        jp1.add(QueryStuInfo);
        jp2.add(QueryTeaInfo);
        jp3.add(QueryCourse);
        jp4.add(QuerySelectCourse);

    }

    private void setTextArea() {
        QueryStuInfoResult = new TextArea(20, 27);
        QueryStuInfoResult.setFont(new Font("宋体", 1, 15));
        QueryTeaInfoResult = new TextArea(20, 27);
        QueryTeaInfoResult.setFont(new Font("宋体", 1, 15));
        QueryCourseResult = new TextArea(20, 27);
        QueryCourseResult.setFont(new Font("宋体", 1, 15));
        QuerySelCourseResult = new TextArea(20, 27);
        QuerySelCourseResult.setFont(new Font("宋体", 1, 15));
        concludeResult = new TextArea(20, 25);
        concludeResult.setFont(new Font("宋体", 1, 15));
        jp1.add(QueryStuInfoResult, BorderLayout.CENTER);
        jp2.add(QueryTeaInfoResult);
        jp3.add(QueryCourseResult);
        jp4.add(QuerySelCourseResult);
        QueryStuInfoResult.setEditable(false);
        QueryTeaInfoResult.setEditable(false);
        QueryStuInfoResult.setEditable(false);
        QueryCourseResult.setEditable(false);
        QuerySelCourseResult.setEditable(false);
        concludeResult.setEditable(false);
    }

    private void addListener() {
        QueryStuInfo.addMouseListener(this);
        QueryTeaInfo.addMouseListener(this);
        QueryCourse.addMouseListener(this);
        QuerySelectCourse.addMouseListener(this);
        AddStu.addMouseListener(this);
        UpdateStu.addMouseListener(this);
        ReSet.addMouseListener(this);
        AddScore.addMouseListener(this);
        UpdateSage.addMouseListener(this);
        UpdateName.addMouseListener(this);
        UpdateSex.addMouseListener(this);
        UpdatePwd.addMouseListener(this);
        conculdeCourse.addMouseListener(this);
        concludeStudent.addMouseListener(this);
        concludeTeacher.addMouseListener(this);
    }

    private void setLable() {
        AddName = new JLabel("学生姓名:");
        AddName.setBounds(20, 20, 20, 20);
        AddName.setFont(new Font("宋体", 1, 25));
        AddSno = new JLabel("学生学号:");
        AddSno.setBounds(40, 40, 20, 20);
        AddSno.setFont(new Font("宋体", 1, 25));
        AddSex = new JLabel("学生性别:");
        AddSex.setBounds(60, 60, 20, 20);
        AddSex.setFont(new Font("宋体", 1, 25));
        AddAge = new JLabel("学生年龄:");
        AddAge.setBounds(80, 80, 20, 20);
        AddAge.setFont(new Font("宋体", 1, 25));
        ScoreNumberla = new JLabel("课程编号:");
        ScoreNumberla.setBounds(80, 80, 20, 20);
        ScoreNumberla.setFont(new Font("宋体", 1, 25));
        StuScorela = new JLabel("学生成绩:");
        StuScorela.setBounds(80, 80, 20, 20);
        StuScorela.setFont(new Font("宋体", 1, 25));
        Stusnola = new JLabel("学生学号:");
        Stusnola.setBounds(80, 80, 20, 20);
        Stusnola.setFont(new Font("宋体", 1, 25));
        UpdateNamela = new JLabel("修改后学生姓名:");
        UpdateNamela.setBounds(80, 80, 20, 20);
        UpdateNamela.setFont(new Font("宋体", 1, 25));
        UpdateSexla = new JLabel("修改后学生性别:");
        UpdateSexla.setBounds(80, 80, 20, 20);
        UpdateSexla.setFont(new Font("宋体", 1, 25));
        UpdateSagela = new JLabel("修改后学生年龄:");
        UpdateSagela.setBounds(80, 80, 20, 20);
        UpdateSagela.setFont(new Font("宋体", 1, 25));
        UpdateSnola = new JLabel("待修改学生学号:");
        UpdateSnola.setBounds(80, 80, 20, 20);
        UpdateSnola.setFont(new Font("宋体", 1, 25));

    }

    private void setTextFiled() {
        nameText = new JTextField(25);
        snoText = new JTextField(25);
        ageText = new JTextField(25);
        sexText = new JTextField(25);
        StuScore = new JTextField(25);
        ScoreNumber = new JTextField(25);
        Stusno = new JTextField(25);
        UpdateNameText = new JTextField(25);
        UpdateSexText = new JTextField(25);
        UpdateSageText = new JTextField(25);
        UpdateSnoText = new JTextField(25);
    }

    private void setAddStuPanel() {
        /*jp5*/
        jp5.add(AddName);
        jp5.add(nameText);
        jp5.add(AddSno);
        jp5.add(snoText);
        jp5.add(AddSex);
        jp5.add(sexText);
        jp5.add(AddAge);
        jp5.add(ageText);
        jp5.add(AddStu);
        jp5.add(ReSet);
        /*jp6*/
        jp6.add(UpdateSnola);
        jp6.add(UpdateSnoText);
        jp6.add(UpdateNamela);
        jp6.add(UpdateNameText);
        jp6.add(UpdateSagela);
        jp6.add(UpdateSageText);
        jp6.add(UpdateSexla);
        jp6.add(UpdateSexText);
        jp6.add(UpdateName);
        jp6.add(UpdateSage);
        jp6.add(UpdateSex);
        jp6.add(UpdatePwd);
        /*jp7*/
        jp7.add(Stusnola);
        jp7.add(Stusno);
        jp7.add(ScoreNumberla);
        jp7.add(ScoreNumber);
        jp7.add(StuScorela);
        jp7.add(StuScore);
        jp7.add(AddScore);
        /*jp8*/
        jp8.add(concludeStudent);
        jp8.add(concludeTeacher);
        jp8.add(conculdeCourse);
        jp8.add(concludeResult);

    }

    private void setDB() {
        db = new OperationMySql();
        // 连接 mysql
        db.setDburl("jdbc:mysql://localhost:3306/StuInfo?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC");
        // 加载驱动
        db.setDbdriver("com.mysql.cj.jdbc.Driver");
        db.setUsername("root");
        db.setPassword("root");
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if (e.getSource().equals(QueryStuInfo)) {
            try {
                db.setRs(db.excuteQueryStuInfo());
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            int count = 0;
            QueryStuInfoResult.setText("");
            QueryStuInfoResult.setText("*****************查询结果******************* ");
            try {
                while (db.getRs().next()) {
                    count++;
                    QueryStuInfoResult.append("\r\n" + "第" + count + "条记录:" + "\r\n"
                            + "学号:" + db.getRs().getString(1) + "\r\n"
                            + "姓名:" + db.getRs().getString(2) + "\r\n"
                            + "性别:" + db.getRs().getString(3) + "\r\n"
                            + "年龄:" + db.getRs().getString(4) +
                            ("\r\n**************************************** "));
                }
                QueryStuInfoResult.append(QueryStuInfoResult.getText() +
                        "\r\n" + "共有" + count + "条学生记录");
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }

        if (e.getSource().equals(QueryTeaInfo)) {
            try {
                db.setRs(db.excuteQueryTeaInfo());
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            int count = 0;
            QueryTeaInfoResult.setText("");
            QueryTeaInfoResult.setText("*****************查询结果******************* ");
            try {
                while (db.getRs().next()) {
                    count++;
                    QueryTeaInfoResult.append("\r\n" + "第" + count + "条记录:" + "\r\n"
                            + "工号:" + db.getRs().getString(1) + "\r\n"
                            + "姓名:" + db.getRs().getString(2) + "\r\n"
                            + "工资:" + db.getRs().getString(3) + "\r\n"
                            + "职称:" + db.getRs().getString(4) +
                            ("\r\n**************************************** "));
                }
                QueryTeaInfoResult.append(QueryTeaInfoResult.getText() +
                        "\r\n" + "共有" + count + "条教师记录");
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }
        if (e.getSource().equals(QueryCourse)) {
            try {
                db.setRs(db.excuteCourseInfo());
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            int count = 0;
            QueryCourseResult.setText("");
            QueryCourseResult.setText("*****************查询结果******************* ");
            try {
                while (db.getRs().next()) {
                    count++;
                    QueryCourseResult.append("\r\n" + "第" + count + "条记录:" + "\r\n"
                            + "课程编号:" + db.getRs().getString(1) + "\r\n"
                            + "课程名称:" + db.getRs().getString(2) + "\r\n"
                            + "学分数:" + db.getRs().getString(3) + "\r\n"
                            + "授课老师:" + db.getRs().getString(4) +
                            ("\r\n**************************************** "));
                }
                QueryCourseResult.append(QueryCourseResult.getText() +
                        "\r\n" + "共有" + count + "条课程记录");
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }
        if (e.getSource().equals(QuerySelectCourse)) {
            try {
                db.setRs(db.excuteCourseSelectInfo());
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            int count = 0;
            QuerySelCourseResult.setText("");
            QuerySelCourseResult.setText("*****************查询结果******************* ");
            try {
                while (db.getRs().next()) {
                    count++;
                    QuerySelCourseResult.append("\r\n" + "第" + count + "条记录:" + "\r\n"
                            + "课程编号:" + db.getRs().getString(1) + "\r\n"
                            + "课程名称:" + db.getRs().getString(2) + "\r\n"
                            + "选课学生学号:" + db.getRs().getString(3) + "\r\n"
                            + "选课学生姓名:" + db.getRs().getString(4) + "\r\n"
                            + "课程分数" + db.getRs().getString(5) +
                            ("\r\n**************************************** "));
                }
                QuerySelCourseResult.append(QuerySelCourseResult.getText() +
                        "\r\n" + "共有" + count + "条课程记录");
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }
        if (e.getSource().equals(AddStu)) {
            String _name = nameText.getText(), _age = ageText.getText(), _sno = snoText.getText(), _sex = sexText.getText();
            try {
                db.setRs(db.executeInsertStuInfo(_name, _age, _sno, _sex));
                nameText.setText("");
                snoText.setText("");
                ageText.setText("");
                sexText.setText("");
                JOptionPane.showOptionDialog(this, "添加学生信息成功!", "数据库操作提示",
                        JOptionPane.CLOSED_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
            } catch (Exception exception) {
                JOptionPane.showOptionDialog(this, "添加失败", "温馨提示",
                        -1, 1, null, null, null);

                exception.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }
        if (e.getSource().equals(UpdatePwd)) {
            String _Sno = UpdateSnoText.getText();
            try {
                int changeline = db.executeUpdatePwd(_Sno);
                if (changeline > 0) {
                    JOptionPane.showOptionDialog(this, "学生密码重置成功!", "数据库操作提示",
                            JOptionPane.CLOSED_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
            } catch (Exception exception) {
                JOptionPane.showOptionDialog(this, "学生密码更新失败!", "温馨提示",
                        -1, 1, null, null, null);

                exception.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }
        if (e.getSource().equals(UpdateName)) {
            String _Sno = UpdateSnoText.getText(), _Sname = UpdateNameText.getText();
            try {
                int changeline = db.executeUpdateSname(_Sno, _Sname);
                if (changeline > 0) {
                    JOptionPane.showOptionDialog(this, "学生姓名更新成功!", "数据库操作提示",
                            JOptionPane.CLOSED_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
            } catch (Exception exception) {
                JOptionPane.showOptionDialog(this, "学生姓名更新失败!", "温馨提示",
                        -1, 1, null, null, null);

                exception.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }
        if (e.getSource().equals(UpdateSage)) {
            String _Sno = UpdateSnoText.getText(), _Sage = UpdateSageText.getText();
            try {
                int changeline = db.executeUpdateAge(_Sno, _Sage);
                if (changeline > 0) {
                    JOptionPane.showOptionDialog(this, "学生年龄更新成功!", "数据库操作提示",
                            JOptionPane.CLOSED_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
            } catch (Exception exception) {
                JOptionPane.showOptionDialog(this, "学生年龄更新失败!", "温馨提示",
                        -1, 1, null, null, null);

                exception.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }

        if (e.getSource().equals(UpdateSex)) {
            String _Sno = UpdateSnoText.getText(), _Ssex = UpdateSexText.getText();
            try {
                int changeline = db.executeUpdateSex(_Sno, _Ssex);
                if (changeline > 0) {
                    JOptionPane.showOptionDialog(this, "学生性别更新成功!", "数据库操作提示",
                            JOptionPane.CLOSED_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
            } catch (Exception exception) {
                JOptionPane.showOptionDialog(this, "学生性别更新失败!", "温馨提示",
                        -1, 1, null, null, null);

                exception.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }

        if (e.getSource().equals(ReSet)) {
            nameText.setText("");
            snoText.setText("");
            ageText.setText("");
            sexText.setText("");
        }
        if (e.getSource().equals(AddScore)) {
            String _Sno = Stusno.getText(), _Cno = ScoreNumber.getText(), _grade = StuScore.getText();
            try {
                int changeline = db.executeAddScore(_Sno, _Cno, _grade);
                if (changeline > 0) {
                    Stusno.setText("");
                    ScoreNumber.setText("");
                    StuScore.setText("");
                    JOptionPane.showOptionDialog(this, "学生成绩添加成功!", "数据库操作提示",
                            JOptionPane.CLOSED_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
            } catch (Exception exception) {
                JOptionPane.showOptionDialog(this, "学生成绩添加失败!", "温馨提示",
                        -1, 1, null, null, null);

                exception.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }
        if (e.getSource().equals(concludeStudent)) {
            try {
                db.setRs(db.excuteStuConclude());
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            int count = 0;
            concludeResult.setText("");
            concludeResult.setText("*****************查询结果******************* ");
            try {
                while (db.getRs().next()) {
                    count++;
                    concludeResult.append("\r\n" + "第" + count + "条记录:" + "\r\n"
                            + "学生姓名:" + db.getRs().getString(1) + "\r\n"
                            + "学生选修的总学分数:" + db.getRs().getString(2) + "\r\n"
                            + "学生的平均成绩:" + db.getRs().getString(3) +
                            ("\r\n**************************************** "));
                }
                QuerySelCourseResult.append(QuerySelCourseResult.getText() +
                        "\r\n" + "共有" + count + "条记录");
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }
        if (e.getSource().equals(concludeTeacher)) {
            try {
                db.setRs(db.excuteTeacherConclude());
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            int count = 0;
            concludeResult.setText("");
            concludeResult.setText("*****************查询结果******************* ");
            try {
                while (db.getRs().next()) {
                    count++;
                    concludeResult.append("\r\n" + "第" + count + "条记录:" + "\r\n"
                            + "职称:" + db.getRs().getString(1) + "\r\n"
                            + "该职称教师数:" + db.getRs().getString(2) + "\r\n"
                            + "该职称平均工资:" + db.getRs().getString(3) +
                            ("\r\n**************************************** "));
                }
                QuerySelCourseResult.append(QuerySelCourseResult.getText() +
                        "\r\n" + "共有" + count + "条记录");
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }
        if (e.getSource().equals(conculdeCourse)) {
            try {
                db.setRs(db.excuteCourseConclude());
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            int count = 0;
            concludeResult.setText("");
            concludeResult.setText("*****************查询结果******************* ");
            try {
                while (db.getRs().next()) {
                    count++;
                    concludeResult.append("\r\n" + "第" + count + "条记录:" + "\r\n"
                            + "课程名称:" + db.getRs().getString(1) + "\r\n"
                            + "课程选课人数:" + db.getRs().getString(2) + "\r\n"
                            + "课程最高分:" + db.getRs().getString(4) + "\r\n"
                            + "课程最低分:" + db.getRs().getString(5) + "\r\n"
                            + "课程平均分" + db.getRs().getString(3) +
                            ("\r\n**************************************** "));
                }
                QuerySelCourseResult.append(QuerySelCourseResult.getText() +
                        "\r\n" + "共有" + count + "条课程记录");
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }
        /*
        SELECT column_name, aggregate_function(column_name)
        FROM table_name
        WHERE column_name operator value
        GROUP BY column_name;
        */
    }
    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }
    
    @Override
    public void mouseExited(MouseEvent e) {

    }
    
}

学生操作界面

package Database;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.sql.SQLException;

/*学生可以利用学号和密码登录系统,登陆系统后,可以进行选课、修改密码和个人基本信息、查询自己的选课及总学分等操作;*/
public class StuGui extends JFrame implements MouseListener{
    private JTabbedPane Base;
    private JPanel jp1, jp2, jp3, jp4;
// 定义选项卡上的嵌板
    /*
     * jp1,  查询个人信息
     * jp2,  修改个人信息
     * jp3,  选课
     * jp4,  查询选课和总学分
     *
     */
    private JButton UpdateInfo,QueryInfo,SelectCourse,QueryCourse,sumCredit;
    private TextArea QuerymyInfoResult,QuerymyCourseResult,sumCreditResult;
    private JLabel UpdatePwd,SelectnewCoursela,sumCreditla;
    private TextField UpdatePwdFiled,SelectnewCourseText;

    // 定义一个数据库操作的实例
    private OperationMySql db = null;
    private String mysno=null;
    public static void main(String[] args) {
        new StuGui("1");
    }

    public StuGui(String sno){
        this.mysno=sno;
        System.out.println("INIT:"+mysno);
        setPanel();
        setBase();
        setButton();
        setUpdate();
        addListener();
        setTextArea();
        setThis();
        setDB();
    }
    private void setPanel() {
        jp1 = new JPanel();
        jp2 = new JPanel();
        jp3 = new JPanel();
        jp4 = new JPanel();
    }
    private void setBase(){
        Base=new JTabbedPane(JTabbedPane.TOP);
        Base.addTab("查询个人信息",jp1);
        Base.addTab("修改个人信息",jp2);
        Base.addTab("选课",jp3);
        Base.addTab("查询选课情况",jp4);
    }
    private void setThis(){
        this.add(Base);
        this.setTitle("2006200018--学生登入:");
        this.setLocation(300, 200);
        this.setSize(500, 400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setVisible(true);
    }
    private void setButton(){
        QueryInfo=new JButton("查询个人信息");
        UpdateInfo=new JButton("更新个人信息");
        SelectCourse=new JButton("添加课程");
        QueryCourse=new JButton("查询已选课程");
        sumCredit=new JButton("查询已选课程的总学分");
        QueryInfo.setFont(new Font("宋体", 1, 25));
        QueryInfo.setBackground(Color.CYAN);
        QueryInfo.setMargin(new Insets(0, 0, 0, 0));
        UpdateInfo.setFont(new Font("宋体", 1, 25));
        UpdateInfo.setBackground(Color.CYAN);
        UpdateInfo.setMargin(new Insets(0, 0, 0, 0));
        SelectCourse.setFont(new Font("宋体", 1, 25));
        SelectCourse.setBackground(Color.CYAN);
        SelectCourse.setMargin(new Insets(0, 0, 0, 0));
        QueryCourse.setFont(new Font("宋体", 1, 25));
        QueryCourse.setBackground(Color.CYAN);
        QueryCourse.setMargin(new Insets(0, 0, 0, 0));
        sumCredit.setFont(new Font("宋体", 1, 25));
        sumCredit.setBackground(Color.CYAN);
        sumCredit.setMargin(new Insets(0, 0, 0, 0));
        jp1.add(QueryInfo);
        jp4.add(QueryCourse);

    }
    private void setUpdate(){
        UpdatePwdFiled=new TextField(25);
        UpdatePwd=new JLabel("修改密码");
        UpdatePwd.setBounds(80, 80, 20, 20);
        UpdatePwd.setFont(new Font("宋体",1,25));
        jp2.add(UpdatePwd);
        jp2.add(UpdatePwdFiled);
        jp2.add(UpdateInfo);
        SelectnewCoursela=new JLabel("请输入你要选择的课程的编号");
        sumCreditla=new JLabel("一键查询已选课程的总学分");
        SelectnewCourseText=new TextField(15);
        SelectnewCoursela.setBounds(80, 80, 20, 20);
        SelectnewCoursela.setFont(new Font("宋体",1,25));
        SelectnewCourseText.setBounds(80, 80, 20, 20);
        SelectnewCourseText.setFont(new Font("宋体",1,25));
        sumCreditla.setBounds(80, 80, 20, 20);
        sumCreditla.setFont(new Font("宋体",1,25));
        jp3.add(SelectnewCoursela);
        jp3.add(SelectnewCourseText);
        jp3.add(SelectCourse);
    }
    private void setTextArea(){
        QuerymyInfoResult=new TextArea(20,27);
        QuerymyCourseResult=new TextArea(20,27);
        QuerymyInfoResult.setFont(new Font("宋体", 1, 15));
        QuerymyCourseResult.setFont(new Font("宋体", 1, 15));
        jp1.add(QuerymyInfoResult);
        jp4.add(QuerymyCourseResult);
        sumCreditResult=new TextArea(2,4);
        sumCreditResult.setFont(new Font("宋体", 1, 25));
        jp3.add(sumCreditla);
        jp3.add(sumCreditResult);
        jp3.add(sumCredit);

    }
    private void addListener(){
        QueryInfo.addMouseListener( this);
        UpdateInfo.addMouseListener(this);
        SelectCourse.addMouseListener(this);
        QueryCourse.addMouseListener(this);
        sumCredit.addMouseListener(this);
    }
    private void setDB() {
        db = new OperationMySql();
        // 连接 mysql
        db.setDburl("jdbc:mysql://localhost:3306/StuInfo?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC");
        // 加载驱动
        db.setDbdriver("com.mysql.cj.jdbc.Driver");
        db.setUsername("root");
        db.setPassword("root");
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if(e.getSource().equals(QueryInfo)){
            try {
                db.setRs(db.excutemyInfo(mysno));
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            QuerymyInfoResult.setText("*****************查询结果******************* ");
            try {
                while(db.getRs().next()) {
                    QuerymyInfoResult.append( "\r\n"+"你的个人信息如下:"+"\r\n"
                            + "姓名:" + db.getRs().getString(2)+ "\r\n"
                            +"学号"+db.getRs().getString(1)+"\r\n"
                            +"性别"+db.getRs().getString(3)+"\r\n"
                            + "年龄:" + db.getRs().getString(4)+
                            ("\r\n******************************************* "));
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }
        if(e.getSource().equals(UpdateInfo)){
            try {
                int changeline = db.executeUpdatePwd(mysno);
                if (changeline > 0) {
                    JOptionPane.showOptionDialog(this, "密码设置成功!", "数据库操作提示",
                            JOptionPane.CLOSED_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
            } catch (Exception exception) {
                JOptionPane.showOptionDialog(this, "密码设置失败!", "温馨提示",
                        -1, 1, null, null, null);

                exception.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }
        if(e.getSource().equals(SelectCourse)){
            try {
                String newCoures=SelectnewCourseText.getText();
                int changeline = db.executeSelectmycourse(mysno,newCoures);
                if (changeline > 0) {
                    JOptionPane.showOptionDialog(this, "选课成功!", "数据库操作提示",
                            JOptionPane.CLOSED_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
            } catch (Exception exception) {
                JOptionPane.showOptionDialog(this, "选课失败!", "温馨提示",
                        -1, 1, null, null, null);

                exception.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }
        if(e.getSource().equals(QueryCourse)){
            try {
                db.setRs(db.excutemyCourseSelect(mysno));
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            int count=0;
            QuerymyCourseResult.setText("*****************查询结果******************* ");
            try {
                while(db.getRs().next()) {
                    count++;
                    QuerymyCourseResult.append("\r\n" + "第" + count + "条记录:" + "\r\n"
                            + "课程名称:" + db.getRs().getString(1)+ "\r\n"
                            +"课程学分"+db.getRs().getString(2)+"\r\n"
                            + "成绩:" + db.getRs().getString(3)+
                            ("\r\n**************************************** "));
                }
                QuerymyCourseResult.append(QuerymyCourseResult.getText() +
                        "\r\n" + "你共有" + count + "条课程记录");
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }
        if(e.getSource().equals(sumCredit)){
            try {
                db.setRs(db.excutemySumCredit(mysno));
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            try {
                while(db.getRs().next()) {
                    sumCreditResult.append(db.getRs().getString(1));
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            db.CloseRS();
            db.CloseStmt();
            db.CloseConnection();
        }
        /*SELECT SUM(Quantity) AS TotalItemsOrdered FROM OrderDetails;*/
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
}

学生登录界面

public class myLogin implements ActionListener  {
    // 定义主窗口
    private final JFrame jf;
    // 定义输入用户名和密码的标签提示
    private final JLabel InputUserName;
    private final JLabel InputPassWord;
    // 定义输入用户名文本框
    private final JTextField UserName;
    // 定义输入密码框
    private final JPasswordField PassWord;
    // 定义登录和取消按钮
    private final JButton Login;
    private final JButton Cancel;
    private String thisno;

    public myLogin() throws Exception {
        // 各组件实例化过程
        jf = new JFrame("Login");
        InputUserName = new JLabel("        ID:    ");
        InputPassWord = new JLabel("password:");
        UserName = new JTextField();
        PassWord = new JPasswordField();
        Login = new JButton("登录");
        Cancel = new JButton("退出");
        // 设置主窗口大小、位置和布局
        jf.setSize(400, 150);
        jf.setLocation(600, 400);
        // 设置窗口流式布局
        jf.setLayout(new FlowLayout());
        // 设置用户名和密码框大小
        UserName.setPreferredSize(new Dimension(300, 30));
        PassWord.setPreferredSize(new Dimension(300, 30));
        // 依次向主窗口添加各组件
        jf.getContentPane().add(InputUserName);
        jf.getContentPane().add(UserName);
        jf.getContentPane().add(InputPassWord);
        jf.getContentPane().add(PassWord);
        jf.getContentPane().add(Login);
        jf.getContentPane().add(Cancel);
        // 设置主窗口不可调节大小
        jf.setResizable(false);
        // 设置主窗口默认关闭操作
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 给登录和取消按钮添加 Action 监听器
        Login.addActionListener(this);
        Cancel.addActionListener(this);
        // 设置主窗口可见
        jf.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        thisno=UserName.getText();
        // 如果单击【退出】按钮则程序退出
        if (e.getSource().equals(Cancel)) {
            System.exit(0);
        }
        // 如果单击【登录】按钮则检查用户名和密码是否匹配
        else if (e.getSource().equals(Login)) {
            // 如果用户名和密码匹配,则打开具体操作面板
            try {
                Class.forName("com.mysql.cj.jdbc.Driver");
            } catch (ClassNotFoundException e2) {
                e2.printStackTrace();
            }
            String _name=UserName.getText(),_pwd=new String(PassWord.getPassword());
            String url = "jdbc:mysql://localhost:3306/StuInfo ?characterEncoding=utf-8&rewriteBatchedStatement=true";
            Connection  connection=null;
            Statement statement=null;
            ResultSet resultSet=null;
            String sql="SELECT *from student where sno='"+_name+"'and pwd='"+_pwd+"'";
            System.out.println("sql:"+sql);
            System.out.println(_name);
            System.out.println(_pwd);
            try {
                connection=DriverManager.getConnection(url, "root", "root");
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                statement=connection.createStatement();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                resultSet=statement.executeQuery(sql);
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
            try {
                if(resultSet.next()){
                    jf.setVisible(false);
                    jf.dispose();
                    new StuGui(thisno);
                }
                // 如果用户名和密码不匹配,则给出提示对话框
                else {
                    JOptionPane.showOptionDialog(jf, "用户名或密码错误", "登陆失败",
                            JOptionPane.CLOSED_OPTION,
                            JOptionPane.ERROR_MESSAGE, null, null, null);
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

管理员登陆界面

public class ManagerLogin implements ActionListener {
    // 定义主窗口
    private final JFrame jf;
    // 定义输入用户名和密码的标签提示
    private final JLabel InputUserName;
    private final JLabel InputPassWord;
    // 定义输入用户名文本框
    private final JTextField UserName;
    // 定义输入密码框
    private final JPasswordField PassWord;
    // 定义登录和取消按钮
    private final JButton Login;
    private final JButton Cancel;
//    private OperationMySql db = null;

    public static void main(String[] args) {
        new ManagerLogin();
    }
    public ManagerLogin() {
        // 各组件实例化过程
        jf = new JFrame("Login");
        InputUserName = new JLabel("        ID:    ");
        InputPassWord = new JLabel("password:");
        UserName = new JTextField();
        PassWord = new JPasswordField();
        Login = new JButton("登录");
        Cancel = new JButton("退出");
        // 设置主窗口大小、位置和布局
        jf.setSize(400, 150);
        jf.setLocation(600, 400);
        // 设置窗口流式布局
        jf.setLayout(new FlowLayout());
        // 设置用户名和密码框大小
        UserName.setPreferredSize(new Dimension(300, 30));
        PassWord.setPreferredSize(new Dimension(300, 30));
        // 依次向主窗口添加各组件
        jf.getContentPane().add(InputUserName);
        jf.getContentPane().add(UserName);
        jf.getContentPane().add(InputPassWord);
        jf.getContentPane().add(PassWord);
        jf.getContentPane().add(Login);
        jf.getContentPane().add(Cancel);
        // 设置主窗口不可调节大小
        jf.setResizable(false);
        // 设置主窗口默认关闭操作
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        // 给登录和取消按钮添加 Action 监听器
        Login.addActionListener(this);
        Cancel.addActionListener(this);
        // 设置主窗口可见
        jf.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // 如果单击【退出】按钮则程序退出
        if (e.getSource().equals(Cancel)) {
            System.exit(0);
        }
        // 如果单击【登录】按钮则检查用户名和密码是否匹配
        else if (e.getSource().equals(Login)) {
            // 如果用户名和密码匹配,则打开具体操作面板
            if (UserName.getText().equals("root") && String.valueOf(PassWord.getPassword()).equals("root")) {
                new ManagerGui();
                jf.setVisible(false);
                jf.dispose();
            }
            // 如果用户名和密码不匹配,则给出提示对话框
            else {
                JOptionPane.showOptionDialog(jf, "用户名或密码错误", "登陆失败",
                        JOptionPane.CLOSED_OPTION,
                        JOptionPane.ERROR_MESSAGE, null, null, null);
            }
        }
    }
}

实验总结

总结实验过程中涉及到的知识点、实验过程中遇到的问题及解决方法。

实验结果

很多都是用我自己的学号和名字做数据的,就不放图片了。。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

实验中遇到的问题

一开始在数据库中插入数据失败,原因是编码方式的问题,不能输入中文,因此修改编码方式即可。

起初对Java中写sql语句还是很陌生,后来再每一次操作的时候都输出一次sql语句,来看哪里有问题,很有效果。下图是一开始不知道为什么登录不了,显示密码错误,后来输出发现是因为我的Java基础不大行,语法上有问题。

ng_name=UserName.getText(),_pwd=PassWord.getPassword().toString();
String _name=UserName.getText(),_pwd=new String(PassWord.getPassword());

虽然之前实验有操作表连接等一系列sql语句,但是让我写并且输出在gui上面的时候,我都很懵地只会select * from xx;完全忘记了有表连接。
于是先把大体功能都实现先,实现后再处理这些问题。等我把大体的功能弄出来后,开始改sql语句,表连接,让输出的信息更全、更好读一些。
而且,对于不确定如何正确编写sql语句,先在数据库自带的服务端中跑一遍sql语句,一点一点修改不正确的地方,其实并不难。通过实验的一整套流程下来,也能很熟悉这些sql语法。
在这里插入图片描述
错误:You have an error in your SQL syntax; 是语法上有错误

Unknown column ‘sc.cno’ in ‘where clause’
在这里插入图片描述
应更正为后一句sql语句,这里是少了一个表的名称

Subquery returns more than 1 row表示子查询返回了多行数据

重要知识点总结:

有关JDBC部分:
Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。

方法executeQuery
用于产生单个结果集的语句,例如 SELECT 语句。 被使用最多的执行 SQL 语句的方法是 executeQuery。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。

方法executeUpdate
用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。

Mysql中字符集有关知识:
MySQL 字符编码集中有两套 UTF-8 编码实现:utf8 和 utf8mb4。
如果使用 utf8 的话,存储emoji 符号和一些比较复杂的汉字、繁体字就会出错。
何为字符集?
字符是各种文字和符号的统称,包括各个国家文字、标点符号、表情、数字等等。
字符集 就是一系列字符的集合。字符集的种类较多,每个字符集可以表示的字符范围通常不同,就比如说有些字符集是无法表示汉字的。
不同的字符集可以表示的字符范围以及编码规则存在差异。这就导致了一个非常严重的问题:使用错误的编码方式查看一个包含字符的文件就会产生乱码现象。
就比如说你使用 UTF-8 编码方式打开 GB2312 编码格式的文件就会出现乱码。示例:“牛”这个汉字 GB2312 编码后的十六进制数值为 “C5A3”,而 “C5A3” 用 UTF-8 解码之后得到的却是 “ţ”。

有关数据库系统概论部分:
从本次实验中也能体会到数据库管理系统对数据管理的好处。
数据结构化:整体是结构化的,数据之间是有联系的,在设计数据库系统的时候不仅要考虑到某个应用的的数据结构,还需要考虑整个组织之间的数据结构。
数据面向整个系统,可以同时被多个用户多个应用共享使用,大大减少数据的冗余度,节约存储空间,数据共享也能避免数据之间的不相容性和不一致性(指同一数据不同副本的值不一样)。
易于扩充:可以选取整体数据的各种子集用于不同的应用,当需求改变或增加时,只需要选取不同的子集或加上一部分数据就可以满足新的需求。

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值