♥数据库课程设计之《学生成绩管理系统》♥

Posted 生命是有光的

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了♥数据库课程设计之《学生成绩管理系统》♥相关的知识,希望对你有一定的参考价值。

0.写在前面

  1. 展示的是很常规的《学生成绩管理系统》,但是可修改为任何管理系统,只需要改些字段即可,具备java基础即可
  2. 简单的增删改查均可实现,本来很简单的几页文档就能交了,老师非得让详细介绍,前前后后做了几个PPT,什么开题报告,结题报告,文档详细,视频录制说明等等面子工程。
  3. 交了两个版本,第一个是javaswing,第二个是一个小型的javaweb
  4. 下面的是javaswing部分,有些截图和介绍显得很多余(纯粹是为了凑作业文档页数)
  5. 成品和打包源码等考完试上传!

1、技术类型

2、搭建环境

  • windows10
  • maven 3.6.1
  • IDEA 2021.1
  • mysql 5.7.19
  • Sqlyog (也可采用sql server 、Navicat等数据库管理工具,当然在IDEA中也可进行配置mysql驱动进行管理,以上方式均可)

以上只是我的开发环境,不用刻意关注版本问题,基本都可运行。

3、数据库准备

字段

在这里插入图片描述

准备两个数据库表,一个用于登录验证,一个用于学生信息展示

  • 将下列代码在sqlyog中运行即可
-- 创建数据库
CREATE DATABASE `student_gui`;
-- 管理表
CREATE TABLE `manage`(
	`id` INT(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
	`user_name` VARCHAR(50) NOT NULL DEFAULT 'admin' COMMENT '用户名',
	`pwd` VARCHAR(50) NOT NULL DEFAULT '123456' COMMENT '密码',
	PRIMARY KEY (`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;


-- 学生表
CREATE TABLE `student`(
	`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT '主键',
	`name` VARCHAR(50) NOT NULL DEFAULT '林小秦' COMMENT '姓名',
	`no` VARCHAR(50) NOT NULL DEFAULT '2019101014' COMMENT '学号',
	`home_town` VARCHAR(50) NOT NULL DEFAULT '菏泽曹县' COMMENT '家庭地址',
	`cn_score` DOUBLE NOT NULL DEFAULT '150' COMMENT '语文成绩',
	`en_score` DOUBLE NOT NULL DEFAULT '150' COMMENT '英语成绩',
	`math_score` DOUBLE NOT NULL DEFAULT '150' COMMENT '数学成绩',
	PRIMARY KEY (`id`)

)ENGINE=INNODB DEFAULT CHARSET=utf8;

登录验证表 manage

在这里插入图片描述

注:这里的 user_name 就是登录用户名

pwd 就是登录密码

大家可以独立设置自己的用户名和密码,之后登录需要用到。

学生信息表 student

在这里插入图片描述

这里我就不放具体数据了,大家自己可以用sql语句插入,或者在sqlyog里面进行插入数据,这里我以自己创建的信息为例!

-v- 这样数据库表就创建完成了,下面进行IDEA操作

4、快速介绍

4.1、登录页面

在这里插入图片描述

设计思路

  1. 检测用户名与密码输入,无论正确与否都会输出至控制台,实时打印日志,友好报错提示

在这里插入图片描述


  1. 检测用户名与密码正确与否,以下情况均不通过
    • 只输入用户名
    • 只输入密码
    • 用户名错误
    • 密码错误
    • 用户名、密码均错误

在这里插入图片描述

在这里插入图片描述

这里没有输出密码,应该是以用户名为准进行输入,如用户名为空则不输出

在这里插入图片描述


  1. 重置,清除用户名和密码输入数据,思路是将这两个输入框的数值设为空

在这里插入图片描述

  1. 登录按钮按键绑定,绑定为人为习惯性的回车键,即点击登录 = 按下 Enter

  2. 登录页面大小锁定,无法进行最大化与页面拉伸,这是因为所有组件按钮输入框以及文本框都有计算好屏幕位置,如可拉伸会影响美观,如图:

在这里插入图片描述

如果想进行页面拉伸,只需将LoginView 类下的

setResizable(false);

参数改为true 即可!(下方有源码展示)


4.2、主页面

输入正确的用户名与密码,即我们创建的数据库表manage中的 user_namepwd字段,即可进入主页面

  1. 登录自动销毁登录页面,并动态计算屏幕尺寸,不占用任务栏的情况下全屏铺满主页面,并进行数据排序(根据数据库id主键由大到小)

在这里插入图片描述

为了演示我们不占用任务栏位置特色,我们将任务栏换位置进行再次测试如图

在这里插入图片描述

注意:这里的动态是指每次程序启动时动态计算屏幕尺寸并铺满屏幕,如果在程序启动途中进行任务栏的改变是无效的,这也是后期需要改进的一点!


  1. 主界面可动态拉伸,不会影响表格,表格会随着鼠标拖动响应式展示

在这里插入图片描述

当然你也可以极限拖动,显示如下,默认以点显示!缺点是按钮只能进行隐藏,不能进行按钮的缩放,后期看可否改进。

在这里插入图片描述


  1. 基于上述拖动,设置滚动条,如图

在这里插入图片描述


  1. 分页功能实现,增添上一页,下一页按钮,且进行数据列表检测,当位于第一页时,无法进行上一页翻页,则隐藏上一页按钮,如上图,当无法进行最后一页翻页时,隐藏下一页按钮

在这里插入图片描述

在这里插入图片描述


4.3、增加

  1. 点击增加按钮,进行增加学生信息

在这里插入图片描述

  1. 增添成功,显示消息弹窗,之后在数据库进行查看

在这里插入图片描述

在solyog里面查看,数据添加成功

在这里插入图片描述


4.4、修改

  1. 当不选择行,或者选择多行均提示消息弹出进行修改限制

在这里插入图片描述

在这里插入图片描述

  1. 限制只能修改一行,多行修改需要循环读取编号,这也是可以改进的点
  2. 修改不允许修改编号,设置学生编号不可编辑,因为编号对应数据库主键id,如果修改会造成数据混乱,也不会进行排序功能

在这里插入图片描述

在这里插入图片描述

在数据库这边进行查看,编号为83号
在这里插入图片描述

更新成功!

  1. 日志提示,sql语句显示

在这里插入图片描述

4.5、删除

  1. 删除误差提醒,若并没有选择相应数据进行删除,则进行提醒

在这里插入图片描述

  1. 可以进行单行、与多行删除操作,即提供单个与批量删除功能,并进行删除确认操作,防止误删

在这里插入图片描述

在这里插入图片描述

  1. 删除之后,编号重新排序,采用链表删除节点思维,重新进行排序
  2. 这里为了数据库的完整性,就不进行删除演示,可在源码中自己实验即可
  3. 控制台日志打印,打印sql语句,可以后期进行增添删除其余功能

在这里插入图片描述


4.6、查询

  1. 查询由输入框和查询按钮组件组成,只提供了姓名模糊查询功能

在这里插入图片描述

  1. 当查询结果数据不足以显示一页,自动隐藏分页按钮

在这里插入图片描述

  1. 日志提示

在这里插入图片描述

在这里插入图片描述

5、快速开始

  1. 在IDEA中新建一个普通maven项目

  2. 新建以下包

    • entity
    • handler
    • req
    • res
    • service
    • studentview
    • util

如图是我的架构图

在这里插入图片描述

6、导入依赖

pom.xml 里面导入 数据库 mysql 依赖

<dependencies>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
</dependencies>

导入之后刷新 maven

7、utils

在 utils 包下新建类 DBUtils ,封装连接数据库操作

在utils 包下新建类DimensionUtil ,保证主界面不会覆盖电脑屏幕的任务栏

DBUtils

package com.qin.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class DBUtil {
    private static final String URL = "jdbc:mysql://localhost:3306/student_gui?useUnicode=true&characterEncoding=utf-8&useSSL=false";
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String USER_NAME = "root";
    private static final String PWD = "123456";
    static {
        try {
            Class.forName(DRIVER);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 获取数据库连接
    public static Connection getConn(){
        try {
            return DriverManager.getConnection(URL,USER_NAME,PWD);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void closeConn(Connection connection) {
        if(connection != null){
            try {
                connection.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static  void closePs(PreparedStatement ps){
        if(ps != null){
            try {
                ps.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void closeRs(ResultSet rs){
        if(rs != null){
            try {
                rs.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

DimensionUtil

package com.qin.util;

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

public class DimensionUtil {
    public static Rectangle getBounds() {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        // 保证主界面不会覆盖电脑屏幕的任务栏
        Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(new JFrame().getGraphicsConfiguration());

        Rectangle rectangle = new Rectangle(screenInsets.left, screenInsets.top, screenSize.width - screenInsets.left - screenInsets.right, screenSize.height - screenInsets.top - screenInsets.bottom);

        return rectangle;
    }
}

8、res

在包 res 包下新建类 TableDTO,封装表格是数据

package com.qin.res;

import java.util.Vector;

/**
 * 表格数据传输对象
 */
public class TableDTO {
    private Vector<Vector<Object>> data;
    private int totalCount;

    public Vector<Vector<Object>> getData() {
        return data;
    }

    public void setData(Vector<Vector<Object>> data) {
        this.data = data;
    }

    public int getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }
}

9、req

在包req下新建StudentRequest

package com.qin.req;

public class StudentRequest {
    private int pageNow;
    private int pageSize;
    private int start;

    // 查询词
    private String searchKey;


    public int getStart(){
        return (pageNow - 1 )* pageSize;
    }

    public int getPageNow() {
        return pageNow;
    }

    public void setPageNow(int pageNow) {
        this.pageNow = pageNow;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public String getSearchKey() {
        return searchKey;
    }

    public void setSearchKey(String searchKey) {
        this.searchKey = searchKey;
    }
}

10、entity

在包 entity 下新建 登录用户名类AdminDO 和学生信息类 StudentDO

AdminDO

package com.qin.entity;

public class AdminDO {
    private Integer id;
    private String userName;
    private String pwd;

    public Integer getId() {
        return id;
    }

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

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
}

StudentDO

package com.qin.entity;

public class StudentDO {
    private  Integer id;
    private  String name;
    private  String no;
    private  String homeTown;
    private Double cnScore;
    private Double mathScore;
    private Double enScore;

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }

    public String getHomeTown() {
        return homeTown;
    }

    public void setHomeTown(String homeTown) {
        this.homeTown = homeTown;
    }

    public Double getCnScore() {
        return cnScore;
    }

    public void setCnScore(Double cnScore) {
        this.cnScore = cnScore;
    }

    public Double getMathScore() {
        return mathScore;
    }

    public void setMathScore(Double mathScore) {
        this.mathScore = mathScore;
    }

    public Double getEnScore() {
        return enScore;
    }

    public void setEnScore(Double enScore) {
        this.enScore = enScore;
    }
}

这里也可以用Lombok插件,导入Lombok依赖,然后在类上增加注解@Date ,作用是自动生成 getter 和 setter 方法

11、service

在包 service 下新建接口 AdminService 和 接口 StudentService ,继而创建实现类 AdminServiceImpl 和实现类 StudentServiceImpl

AdminService 接口

package com.qin.service;

import com.qin.entity.AdminDO;

public interface AdminService {
    boolean validateAdmin(AdminDO adminDO);
}

StudentService 接口

package com.qin.service;

import com.qin.entity.StudentDO;
import com.qin.req.StudentRequest;
import com.qin.res.TableDTO;

public interface StudentService {

    TableDTO retrieveStudents(StudentRequest request);

    boolean add(StudentDO studentDO);

    StudentDO getById(int selectedStudentId);

    boolean update(StudentDO studentDO);

    boolean delete(int[] selectedStudentIds);
}

AdminServiceImpl 实现类

package com.qin.service;

import com.qin.entity.AdminDO;
import com.qin.util.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class AdminServiceImpl implements AdminService{
    @Override
    public boolean validateAdmin(AdminDO adminDO) {
        String userName = adminDO.getUserName();
        String pwdParam = adminDO.getPwd();
        if(userName == null || ""以上是关于♥数据库课程设计之《学生成绩管理系统》♥的主要内容,如果未能解决你的问题,请参考以下文章

C语言课程设计:学生学籍管理系统。有谁有代码给我做个参考吗?谢谢了,C语言和C++的都可以。

设在学生成绩管理数据库中有四个表

c语言学生成绩管理系统设计

[课程设计] 学生成绩管理系统(Python版)

java课程设计 学生成绩管理

C语言程序设计学生成绩管理系统