手把手教你写一个学生成绩管理系统

温馨提示,本篇文章中所写代码非常不规范,可以根据自己的需要对代码进行更改

有任何课程设计或者是毕业设计的问题都可询问

本文章的系统直接使用控制台输出,使用Mysql数据库存储,如果有需要使用文档文本进行存储可将Dao改为用Stream读取保存,需要使用其他数据库自行将驱动换成对应的驱动。

下载并导入JDBC驱动

下载地址

image

如果速度太慢可考虑国内网站,版本号不需要在意
下载完成后解压缩,将jar包随便放在一个地方(最好是在项目中新建一个文件夹放置),然后导入jar包
eclipse导入,右键项目选择properties

idea导入,打开Project Structure
Project Structure

选择jar包

新建实体类

新建名为Student的类,代码如下

/**
 * 学生类
 * @author KartZan
 */
public class Student {

    /** 学号 */
    private int id;

    /** 姓名 */
    private String name;

    /** 语文成绩 */
    private int chnGrade;

    /** 数学成绩 */
    private int mathGrade;

    /** 英语成绩 */
    private int engGrade;

    public Student() {
    }

    public Student(String name, int chnGrade, int mathGrade, int engGrade) {
        this.name = name;
        this.chnGrade = chnGrade;
        this.mathGrade = mathGrade;
        this.engGrade = engGrade;
    }

    public Student(int id, String name, int chnGrade, int mathGrade, int engGrade) {
        this.id = id;
        this.name = name;
        this.chnGrade = chnGrade;
        this.mathGrade = mathGrade;
        this.engGrade = engGrade;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getChnGrade() {
        return chnGrade;
    }

    public void setChnGrade(int chnGrade) {
        this.chnGrade = chnGrade;
    }

    public int getMathGrade() {
        return mathGrade;
    }

    public void setMathGrade(int mathGrade) {
        this.mathGrade = mathGrade;
    }

    public int getEngGrade() {
        return engGrade;
    }

    public void setEngGrade(int engGrade) {
        this.engGrade = engGrade;
    }

    @Override
    public String toString() {
        return  "学号=" + id +
                ", 名称='" + name + '\'' +
                ", 语文成绩=" + chnGrade +
                ", 数学成绩=" + mathGrade +
                ", 英语成绩=" + engGrade
                ;
    }
}

该类的属性可根据自己的需要修改,有属性变化记得改写toString()方法

新建数据库

新建一个名为dev的数据库,在dev数据库中新建一张名为student的表

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `ID` int(0) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `CHN_GRADE` int(0) NOT NULL,
  `MATH_GRADE` int(0) NULL DEFAULT NULL,
  `ENG_GRADE` int(0) NULL DEFAULT NULL,
  PRIMARY KEY (`ID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

新建完后的数据库结构如下:


数据库

编写JDBCUtil

要操作数据库总是手动的获取Connection是很麻烦的一件事情,所以我们需要编写一个JDBCUtil可以帮助我们快速的操作Connection。

新建一个JDBCUtil类

需要更改URL和PASSWORD为自己的数据库地址和密码,数据库装在自己电脑上的话一般地址为localhost

/**
 * @author KartZan
 */
public class JDBCUtil {
    private static final String URL = "jdbc:mysql://地址:3306/dev";  //FIXME !!!需要更改
    private static final String USER = "root";
    private static final String PASSWORD = "密码"; //FIXME !!!需要更改
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";

    public static Connection getConn() {
        try {
            Class.forName(DRIVER);
            return DriverManager.getConnection(URL, USER, PASSWORD);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void close(Connection connection){
        try {
            if(connection != null ){
                connection.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException();
        }
    }
}

编写Dao层

Dao层就是操作数据库的一层,本文章只实现了简单的增删改查功能,有需要可以自己添加功能

首先编写新增(插入)

    public void insert(Student stu) {
        Connection conn = JDBCUtil.getConn();
        try {
            String sql = "insert into student (`name`, chn_grade, math_grade, eng_grade) values (?, ?, ?, ?)";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, stu.getName());
            pstmt.setInt(2, stu.getChnGrade());
            pstmt.setInt(3, stu.getMathGrade());
            pstmt.setInt(4, stu.getEngGrade());
            pstmt.execute();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.close(conn);
        }
    }

如果你的数据库字段名和我的不一样,需要改成你自己的

然后是删除

    public void delete(int id) {
        Connection conn = JDBCUtil.getConn();
        try {
            String sql = "delete from student where id = ?";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, id);
            pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.close(conn);
        }
    }

修改

    public void update(Student stu) {
        Connection conn = JDBCUtil.getConn();
        try {
            String sql = "update student set `name` = ?, chn_grade = ?, math_grade = ?, eng_grade = ? where id = ?";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, stu.getName());
            pstmt.setInt(2, stu.getChnGrade());
            pstmt.setInt(3, stu.getMathGrade());
            pstmt.setInt(4, stu.getEngGrade());
            pstmt.setInt(5, stu.getId());
            pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.close(conn);
        }
    }

最后是查询

    public List<Student> search() {
        Connection conn = JDBCUtil.getConn();
        List<Student> list = new ArrayList<Student>();
        try {
            String sql = "select * from student";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            ResultSet rs = pstmt.executeQuery();
            while(rs.next()) {
                Student stu = new Student();
                stu.setId(rs.getInt(1));
                stu.setName(rs.getString(2));
                stu.setChnGrade(rs.getInt(3));
                stu.setMathGrade(rs.getInt(4));
                stu.setEngGrade(rs.getInt(5));
                list.add(stu);
            }
            return list;
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.close(conn);
        }
        return Collections.emptyList();
    }

编写主程序入口

编写完Dao层以后,程序已经完成大半了,接下来只需要编写程序入口就完成了

新建一个Main类

如果看见在一些莫名其妙的地方出现sc.nextLine(),说明该地方需要清除回车符,nextLine()会读取回车导致我们不能正常输入数据

/**
 * @author KartZan
 */
public class Main {

    /** 程序退出标记 */
    private static volatile boolean exitFlag = false;

    /** 输入 */
    private static Scanner sc = new Scanner(System.in);

    /** Dao层 */
    private static StudentDao dao = new StudentDao();

}

接下来我们需要一个打印菜单的方法:

    private static void menu() {
        System.out.println("1.查询学生名单");
        System.out.println("2.新增学生");
        System.out.println("3.修改学生信息");
        System.out.println("4.删除学生");
        System.out.println("0.退出");
    }

以及调用Dao层方法的一个方法

private static void func(int i) {
        switch (i) {
            case 1: {
                List<Student> list = dao.search();
                for (Student stu : list) {
                    System.out.println(stu);
                }
                break;
            }
            case 2: {
                Student student = getStudent(true);
                dao.insert(student);
                break;
            }
            case 3: {
                Student student = getStudent(false);
                dao.update(student);
                break;
            }
            case 4: {
                System.out.println("输入要删除的学生学号:");
                dao.delete(sc.nextInt());
                break;
            }
            case 0 : {
                exitFlag = true;
                break;
            }
            default: {
                System.out.println("输入错误,重新输入");
                break;
            }
        }
    }

getStudent()方法为根据输入的数据生成Student实体类

    private static Student getStudent(boolean isNew) {
        int id = 0;
        Student stu = null;
        if (!isNew) {
            System.out.println("输入学生对应学号:");
            id = sc.nextInt();
        }
        sc.nextLine();
        System.out.println("输入学生的名称:");
        String name = sc.nextLine();
        System.out.println("输入学生的语文成绩:");
        int chnGrade = sc.nextInt();
        System.out.println("输入学生的数学成绩:");
        int mathGrade = sc.nextInt();
        System.out.println("输入学生的英语成绩:");
        int engGrade = sc.nextInt();
        if (!isNew) {
            stu = new Student(id, name, chnGrade, mathGrade, engGrade);
        } else {
            stu = new Student(name, chnGrade, mathGrade, engGrade);
        }
        return stu;
    }

最后编写一个main函数,就大功告成啦!

    public static void main(String[] args) {
        while (!exitFlag) {
            menu();
            int choose = sc.nextInt();
            func(choose);
        }
    }

来看一下最终的效果:


GIF 2021-8-16 22-29-41.gif
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容