♥数据库课程设计之《学生成绩管理系统》♥
Posted 生命是有光的
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了♥数据库课程设计之《学生成绩管理系统》♥相关的知识,希望对你有一定的参考价值。
0.写在前面
- 展示的是很常规的《学生成绩管理系统》,但是可修改为任何管理系统,只需要改些字段即可,具备java基础即可
- 简单的增删改查均可实现,本来很简单的几页文档就能交了,老师非得让详细介绍,前前后后做了几个PPT,什么开题报告,结题报告,文档详细,视频录制说明等等面子工程。
- 交了两个版本,第一个是javaswing,第二个是一个小型的javaweb
- 下面的是javaswing部分,有些截图和介绍显得很多余(纯粹是为了凑作业文档页数)
- 成品和打包源码等考完试上传!
1、技术类型
- java
- JDBC
- swing
- mysql
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、登录页面
设计思路
- 检测用户名与密码输入,无论正确与否都会输出至控制台,实时打印日志,友好报错提示
- 检测用户名与密码正确与否,以下情况均不通过
- 只输入用户名
- 只输入密码
- 用户名错误
- 密码错误
- 用户名、密码均错误
这里没有输出密码,应该是以用户名为准进行输入,如用户名为空则不输出
- 重置,清除用户名和密码输入数据,思路是将这两个输入框的数值设为空
-
登录按钮按键绑定,绑定为人为习惯性的回车键,即点击登录 = 按下 Enter
-
登录页面大小锁定,无法进行最大化与页面拉伸,这是因为所有组件按钮输入框以及文本框都有计算好屏幕位置,如可拉伸会影响美观,如图:
如果想进行页面拉伸,只需将LoginView
类下的
setResizable(false);
参数改为true
即可!(下方有源码展示)
4.2、主页面
输入正确的用户名与密码,即我们创建的数据库表manage
中的 user_name
和pwd
字段,即可进入主页面
- 登录自动销毁登录页面,并动态计算屏幕尺寸,不占用任务栏的情况下全屏铺满主页面,并进行数据排序(根据数据库id主键由大到小)
为了演示我们不占用任务栏位置特色,我们将任务栏换位置进行再次测试如图
注意:这里的动态是指每次程序启动时动态计算屏幕尺寸并铺满屏幕,如果在程序启动途中进行任务栏的改变是无效的,这也是后期需要改进的一点!
- 主界面可动态拉伸,不会影响表格,表格会随着鼠标拖动响应式展示
当然你也可以极限拖动,显示如下,默认以点显示!缺点是按钮只能进行隐藏,不能进行按钮的缩放,后期看可否改进。
- 基于上述拖动,设置滚动条,如图
- 分页功能实现,增添上一页,下一页按钮,且进行数据列表检测,当位于第一页时,无法进行上一页翻页,则隐藏上一页按钮,如上图,当无法进行最后一页翻页时,隐藏下一页按钮
4.3、增加
- 点击增加按钮,进行增加学生信息
- 增添成功,显示消息弹窗,之后在数据库进行查看
在solyog里面查看,数据添加成功
4.4、修改
- 当不选择行,或者选择多行均提示消息弹出进行修改限制
- 限制只能修改一行,多行修改需要循环读取编号,这也是可以改进的点
- 修改不允许修改编号,设置学生编号不可编辑,因为编号对应数据库主键id,如果修改会造成数据混乱,也不会进行排序功能
在数据库这边进行查看,编号为83号
更新成功!
- 日志提示,sql语句显示
4.5、删除
- 删除误差提醒,若并没有选择相应数据进行删除,则进行提醒
- 可以进行单行、与多行删除操作,即提供单个与批量删除功能,并进行删除确认操作,防止误删
- 删除之后,编号重新排序,采用链表删除节点思维,重新进行排序
- 这里为了数据库的完整性,就不进行删除演示,可在源码中自己实验即可
- 控制台日志打印,打印sql语句,可以后期进行增添删除其余功能
4.6、查询
- 查询由输入框和查询按钮组件组成,只提供了姓名模糊查询功能
- 当查询结果数据不足以显示一页,自动隐藏分页按钮
- 日志提示
5、快速开始
-
在IDEA中新建一个普通maven项目
-
新建以下包
- 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 || ""以上是关于♥数据库课程设计之《学生成绩管理系统》♥的主要内容,如果未能解决你的问题,请参考以下文章