本文是MySQL+java: 实现学生成绩管理系统(1.0版本)
我的学生成绩管理系统系列相关文章:
- JDBC+MySQL小练习:MySQL+java: 实现学生成绩管理系统(2.0版本)
此项目在 本文 代码基础上进行改进:
- 使用配置文件方式封装实现数据库的连接与关闭
- 封装通用增删改查SQL语句,方便扩展功能
- 避免菜单重复创建Scanner对象
- 提高代码可读性
Service+Dao(两层)
- Spring入门小练习: Spring 实现学生成绩管理系统(完整代码)
此项目在 学生成绩管理系统2.0 版本基础上进行改进:
- 将结构分成Sevice和Dao两层,对冗余代码进行简化
- 使用
Druid
数据库连接池技术- 应用
Spring JdbcTemplate
模板封装增删改查SQL语句- 使用xml方式和注解方式实现IOC的bean管理
- MyBatis入门小练习:Mybatis 基于注解方式实现学生成绩管理系统(完整代码)
此项目在 Spring 实现学生成绩管理系统 版本基础上进行改进:
- 在Dao层使用
Mybatis
注解方式实现CRUD,不再需要接口实现类;- 封装统计功能返回结果的实体类;
- 在Service层使用注解方式获取bean;
- 优化了菜单的返回确认功能。
- Spring+Mybatis小练习:整合Spring+Mybatis 学生成绩管理系统(完整代码)
此项目在 Spring实现学生成绩管理系统 和 Mybatis 基于注解方式实现学生成绩管理系统 版本基础上进行改进:
- 基于
mybatis-spring
整合Spring
和Mybatis
;- 使用xml文件方式实现CRUD和获取bean;
- 使用
Druid
数据库连接池
JavaWeb项目(三层)
- JavaWeb基础小练习:JavaWeb+MySQL实现学生成绩管理系统(3.0版本)
此项目在 学生成绩管理系统2.0版本 基础上进行改进:
- 使用
Servlet+JSP
实现Web层,完整实现B/S三层架构;- 使用
Druid
数据库连接池技术;- 应用
DBUtils
封装数据库增删改查;- 增加了用户注册和登录功能
- SSM框架整合练习:SSM 实现学生成绩管理系统(完整代码)
此项目基于 JavaWeb+MySQL实现学生成绩管理系统(3.0版本) 进行改进。主要改进内容有:
- 使用
Spring+SpringMVC+Mybatis
框架实现,代替原生Servlet
处理请求转发;- 使用
SpringMVC
拦截器判断用户是否登录,在注册页面使用验证码;- 使用
SpringMVC
的ControllerAdvice
实现全局异常处理;- 使用
Spring
注解式事务管理;- 使用分页模型显示所有学生信息,在主页基础上实现增加、删除、修改、统计功能,在前端页面上增加更多交互功能和提示。
本项目基于SSM 实现学生成绩管理系统(完整代码)进行改进。主要改进内容有:
- 使用
SpringBoot
一站式框架实现,代替Spring+SpringMVC+Mybatis
多个框架,减少配置文件数量;- 使用
SpringBoot
的自定义错误页面、使用拦截器判断用户是否登录、使用注解式事务管理;- 前端使用
HTML+Thymeleaf
模板引擎,不再使用jsp;- 在注册页面使用Kaptcha验证码;
- 使用
Redis
实现用户注册、登录功能;- 使用
MyBatisPlus
实现分页模型显示所有学生信息;- 使用
Echarts
对统计结果实现可视化;- 使用
Slf4j
实现日志功能。
- SpringBoot+分布式: SpringBoot+Redis+Consul:实现学生成绩管理系统 分布式+邮箱功能(完整代码)
本项目基于 SpringBoot+MyBatisPlus+Redis+Thymeleaf+Echarts: 实现学生成绩管理系统 进行改进。主要改进内容有:
- 应用
SpringCloud H
+SpringBoot2
目前主流的开发框架;- 项目原有部分拆分为公共模块、用户模块和学生模块三个模块部署;
- 使用自带图形界面的
Consul
作为服务注册中心;- 使用
Redis
实现不同端口的Session共享;- 增加邮箱模块,实现向指定邮箱发送学生成绩统计信息;
- 增加未登录或登录过期页面
准备
1.Java 下载
最新版Java安装教程
Eclipse下载与安装
2.MySQL
专栏-MySQL学习笔记
3.Java 连接 MySQL 需要驱动包,使用以下方法让Java和MySQL连接起来。
让Java和MySQL连接起来
实现
使用MySQL生成表
包括 学号,姓名,成绩,班级四个字段。
USE students;
DROP TABLE IF EXISTS stu_score;
CREATE TABLE IF NOT EXISTS stu_score(
NO VARCHAR(10),
NAME VARCHAR(20),
score FLOAT,
class INT
);
DESC stu_score;
本文的java代码部分基于Java 实现学生信息管理系统。本文连接MySQL数据库。
本文在原文的增删改查基础上,增加了班级字段和成绩字段,增加了排序和统计的功能,实现分组统计各班的人数及成绩信息并输出。
建立学生类
//学生姓名、班级、学号、成绩
/**
* @authorAsajuHuishi
*/
public class Stu {
private String no; //学号
private String name; //姓名
private float score; //成绩
private int klass; //班级
//构造函数
public Stu(String no, String name, float score, int klass) {
super();
this.no = no;
this.name = name;
this.score = score;
this.klass = klass;
}
public int getKlass() {//缺省构造函数
return klass;
}
public void setKlass(int klass) {
this.klass = klass;
}
public Stu() {
super();
}
//get set
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
}
连接到MySQL数据库
import java.sql.*;
//import java.sql.DriverManager;
//import java.sql.ResultSet;
//import java.sql.SQLException;
//import java.sql.Statement;
public class mySQLutil {
private static final String DRIVER_NAME = "com.mysql.jdbc.Driver";
private static final String URL = "jdbc:mysql://localhost:3306/Students";//数据库名Students
private static final String USER = "root";
private static final String PASS = "123456";
public static Connection getCon() throws ClassNotFoundException,
SQLException {
Connection con = null;
Class.forName(DRIVER_NAME);
con = DriverManager.getConnection(URL, USER, PASS);
return con;
}
public static void close(Connection con, Statement stmt, ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (con != null) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
创建一个学生管理数据访问对象
//import java.sql.Connection;
//importjava.sql.PreparedStatement;
//importjava.sql.ResultSet;
//importjava.sql.SQLException;
import java.sql.*;
import java.util.*;
public class StuOperation {
private Connection con;
private PreparedStatement pstmt;
private ResultSet rs;
//1.增加学生记录
public boolean add(Stu stu) {
String sql="insert into stu_score(no,name,score,class) values(?,?,?,?)";
try {
con = mySQLutil.getCon();//使用连接池数据源获取连接
pstmt = con.prepareStatement(sql);
pstmt.setString(1, stu.getNo());
pstmt.setString(2, stu.getName());
pstmt.setFloat(3, stu.getScore());
pstmt.setInt(4, stu.getKlass());
pstmt.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
return false;
} catch (SQLException e) {
e.printStackTrace();
return false;
} finally{
mySQLutil.close(con, pstmt, rs);
}
return true;
}
//2.修改学生记录
public boolean update(Stu stu) {
String sql="update stu_score set name=?,score=?,klass=? where no=?";
try {
con = mySQLutil.getCon();
pstmt = con.prepareStatement(sql);
pstmt.setString(4, stu.getNo());
pstmt.setString(1, stu.getName());
pstmt.setFloat(2, stu.getScore());
pstmt.setInt(3, stu.getKlass());
pstmt.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
return false;
} catch (SQLException e) {
e.printStackTrace();
return false;
} finally{
mySQLutil.close(con, pstmt, rs);
}
return true;
}
//3.删除学生信息
public boolean del(String id) {
String sql="delete from stu_score where no=?";
try {
con = mySQLutil.getCon();
pstmt = con.prepareStatement(sql);
pstmt.setString(1,id);
pstmt.executeUpdate();
} catch (ClassNotFoundException e) {
e.printStackTrace();
return false;
} catch (SQLException e) {
e.printStackTrace();
return false;
} finally{
mySQLutil.close(con, pstmt, rs);
}
return true;
}
//4.1 根据学生的学号查找学生成绩
public Stu findScoreByNo(String no) {
Stu stu = null;
String sql="select * from stu_score where no=?";
try {
con = mySQLutil.getCon();
pstmt = con.prepareStatement(sql);
//pstmt.executeUpdate();//用于增删改
pstmt.setString(1,no);
rs = pstmt.executeQuery();//用于查询
while (rs.next()) {
stu = new Stu();
stu.setNo(rs.getString("no"));//取结果集里面学号这一列的值赋给
stu.setName(rs.getString("name"));
stu.setScore(rs.getFloat("score"));
stu.setKlass(rs.getInt("class"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally{
mySQLutil.close(con, pstmt, rs);
}
return stu;
}
//4.2 根据学生的姓名查找学生成绩
public Stu findScoreByName(String name) {
Stu stu = null;
String sql="select * from stu_score where name=?";
try {
con = mySQLutil.getCon();
pstmt = con.prepareStatement(sql);
//pstmt.executeUpdate();//用于增删改
pstmt.setString(1,name);
rs = pstmt.executeQuery();//用于查询
while (rs.next()) {
stu = new Stu();
stu.setNo(rs.getString("no"));
stu.setName(rs.getString("name"));
stu.setScore(rs.getFloat("score"));
stu.setKlass(rs.getInt("class"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally{
mySQLutil.close(con, pstmt, rs);
}
return stu;
}
//5. 排序(分班级,按成绩降序排序并查看)
public List<Stu> showAll() {
List<Stu> list = new ArrayList<Stu>();
String sql = "select * from stu_score order by score desc";
try {
con = mySQLutil.getCon();
pstmt=con.prepareStatement(sql);
//pstmt.executeUpdate();//用于增删改
rs = pstmt.executeQuery();//用于查询
while (rs.next()) {
Stu stu = new Stu();
stu.setNo(rs.getString("no"));//取结果集里面学号这一列的值赋给
stu.setKlass(rs.getInt("class"));
stu.setName(rs.getString("name"));
stu.setScore(rs.getFloat("score"));
list.add(stu);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally{
mySQLutil.close(con, pstmt, rs);
}
return list;
}
//6.统计(分班级统计学生数量,最高分,最低分,平均值)
public List<Map<String,Object>> statistics() {
List<Map<String,Object>> list = new ArrayList<>();
String sql = "select count(*),max(score),min(score),round(avg(score),4) from stu_score group by class order by avg(score) desc";
try {
con = mySQLutil.getCon();
pstmt=con.prepareStatement(sql);
rs = pstmt.executeQuery();//用于查询
while (rs.next()) {
Map<String,Object> record = new HashMap<>();//保存于字典
record.put("count", rs.getObject(1));
record.put("max_score", rs.getObject(2));
record.put("min_score", rs.getObject(3));
record.put("avg_score", rs.getObject(4));
list.add(record);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally{
mySQLutil.close(con, pstmt, rs);
}
return list;
}
}
学生成绩管理系统的菜单选择实现
//学生信息管理系统的菜单选择
import java.sql.*;
import java.util.*;
import javax.print.DocFlavor.INPUT_STREAM;
//import org.apache.commons.lang3.StringUtils;
public class StuMenu {
public void menu() {
//菜单
int choose,choose2;
List<Integer> chos = new ArrayList<Integer>();
for (int i=1;i<8;i++) {
chos.add(i);
}
Set<Integer> chooseSet = new HashSet<Integer>(chos);
do {
System.out.println("=======欢迎进入学生成绩管理系统=======");
System.out.println("1.新增学生记录");
System.out.println("2.修改学生记录");
System.out.println("3.删除学生记录");
System.out.println("4.按姓名或学号查询学生记录");
System.out.println("5.按成绩排序");
System.out.println("6.分班级统计");
System.out.println("7.退出");
System.out.println("请选择(1-7):");
Scanner scanner = new Scanner(System.in);
choose = scanner.nextInt();
while (!chooseSet.contains(choose)) {
System.out.println("请选择(1-7):");
choose = scanner.nextInt();
}
System.out.println("******************************");
switch (choose) {
case 1:
myAdd(); //菜单选择1,是新增学生
break;
case 2:
myUpdate(); //菜单选择2,是修改学生
break;
case 3:
myDel(); //菜单选择3,是删除学生
break;
case 4: //菜单选择4,是查询学生
System.out.print("请选择按姓名查询还是按照学号查询(1姓名 2学号):");
Scanner sc2 = new Scanner(System.in);
choose2 = sc2.nextInt();
if (choose2==1) {
myListByName();
}else if (choose2==2) {
myListByNo();
}
break;
case 5: //菜单选择5,按成绩排序
mySort();
break;
case 6: //菜单选择6,统计
myStatistic();
break;
case 7: //菜单选择7,是退出该系统
System.out.println("您选择了退出系统,确定要退出吗?(y/n)");
Scanner sc3 = new Scanner(System.in);
String scanExit = sc3.next();
if(scanExit.equals("y")){
System.exit(-1);
System.out.println("您已成功退出系统,欢迎您再次使用!");
}
break;
default:
break;
}
} while (choose!=7);
}
//新增学生信息
public void myAdd() {
String continute;
do {
Scanner s = new Scanner(System.in);
String no, name;
float score;
int klass;
System.out.println("====新增学生====");
System.out.println("学号(长度不超过10):");
no = s.next();
System.out.println("班级(整数):");
klass = s.nextInt();
System.out.println("姓名:");
name = s.next();
System.out.println("成绩:");
score = s.nextFloat();
Stu stu = new Stu(no, name, score, klass);
StuOperation stuOp = new StuOperation();
boolean ok = stuOp.add(stu);
if (ok) {
System.out.println("保存成功!");
}else {
System.out.println("保存失败!");
}
System.out.println("是否继续添加(y/n):");
Scanner scanner2 = new Scanner(System.in);
continute = scanner2.next();
} while (continute.equals("y"));
}
//删除学生信息
public void myDel(){
Scanner s = new Scanner(System.in);
String no;
System.out.println("====删除学生====");
System.out.println("请输入要删除的学生学号:");
no = s.next();
System.out.println("该学生的信息如下:");
StuOperation stuOp = new StuOperation();
System.out.println("学生学号:"+stuOp.findScoreByNo(no).getNo());
System.out.println("学生班级:"+stuOp.findScoreByNo(no).getKlass());
System.out.println("学生姓名:"+stuOp.findScoreByNo(no).getName());
System.out.println("学生成绩:"+stuOp.findScoreByNo(no).getScore());
///921
System.out.println("是否真的删除(y/n):");
Scanner scanner3 = new Scanner(System.in);
String x=scanner3.next();
if (x.equals("y")) {
Stu stu = new Stu(no,null,0,0);
boolean ok = stuOp.del(no);
if (ok) {
System.out.println("删除成功!");
}else {
System.out.println("删除失败!");
}
}
}
//修改学生信息
public void myUpdate(){
Scanner s = new Scanner(System.in);
String no;
System.out.println("====修改学生====");
System.out.println("请输入要修改的学生学号:");
no = s.next();
System.out.println("该学生的信息如下:");
StuOperation StuOp = new StuOperation();
System.out.println("学生学号:"+StuOp.findScoreByNo(no).getNo());
System.out.println("学生班级:"+StuOp.findScoreByNo(no).getKlass());
System.out.println("学生姓名:"+StuOp.findScoreByNo(no).getName());
System.out.println("学生成绩:"+StuOp.findScoreByNo(no).getScore());
System.out.println("请输入新的学生信息:");
Scanner stuUp = new Scanner(System.in);
String name;
float score;
int klass;
System.out.println("学生班级:");
klass = stuUp.nextInt();
System.out.println("学生姓名:");
name = stuUp.next();
System.out.println("学生成绩:");
score = stuUp.nextFloat();
Stu stu = new Stu(no, name, score, klass);
StuOperation dao = new StuOperation();
boolean ok = dao.update(stu);
if (ok) {
System.out.println("保存成功!");
}else {
System.out.println("保存失败!");
}
}
//按姓名查询学生信息
public void myListByName(){
Scanner s = new Scanner(System.in);
String name;
System.out.println("====修改学生====");
System.out.println("请输入要查看的学生姓名:");
name = s.next();
System.out.println("该学生的信息如下:");
StuOperation StuOp = new StuOperation();
System.out.println("学生学号:"+StuOp.findScoreByName(name).getNo());
System.out.println("学生班级:"+StuOp.findScoreByName(name).getKlass());
System.out.println("学生姓名:"+StuOp.findScoreByName(name).getName());
System.out.println("学生成绩:"+StuOp.findScoreByName(name).getScore());
return;
}
//按学号查询学生信息
public void myListByNo(){
Scanner s = new Scanner(System.in);
String no;
System.out.println("====修改学生====");
System.out.println("请输入要查看的学生学号:");
no = s.next();
System.out.println("该学生的信息如下:");
StuOperation StuOp = new StuOperation();
System.out.println("学生学号:"+StuOp.findScoreByNo(no).getNo());
System.out.println("学生班级:"+StuOp.findScoreByNo(no).getKlass());
System.out.println("学生姓名:"+StuOp.findScoreByNo(no).getName());
System.out.println("学生成绩:"+StuOp.findScoreByNo(no).getScore());
return;
}
//排序
public void mySort() {
StuOperation StuOp = new StuOperation();
System.out.println("按成绩降序显示");
System.out.println("学号\t\t班级\t姓名\t成绩");
List<Stu> lst = StuOp.showAll();
for (Stu stuList:lst) {
System.out.println(stuList.getNo()+"\t"+stuList.getKlass()+"\t"+stuList.getName()+"\t"+stuList.getScore());
}
}
//统计
public void myStatistic() {
StuOperation StuOp = new StuOperation();
System.out.println("统计(分班级统计学生数量,最高分,最低分,平均值)");
List<Map<String,Object>> lst = StuOp.statistics();
// System.out.println(lst);
System.out.println("count\tmax_score\tmin_score\tavg_score");
for (Map<String,Object> m: lst) {
System.out.println(m.get("count")+"\t"+m.get("max_score")+"\t\t"+m.get("min_score")+"\t\t"+m.get("avg_score"));
}
}
}
主函数
public class Main {
public static void main(String[] args) {
StuMenu stm = new StuMenu();
stm.menu();
}
}
结果
参考
https://blog.csdn.net/xiamin/article/details/100878256
https://www.cnblogs.com/shenxiaolin/p/5723868.html
https://blog.csdn.net/qq_38789789/article/details/101374589