Bootstrap

MySQL+java: 实现学生成绩管理系统(1.0版本)

在这里插入图片描述
本文是MySQL+java: 实现学生成绩管理系统(1.0版本)


我的学生成绩管理系统系列相关文章:

此项目在 本文 代码基础上进行改进:

  • 使用配置文件方式封装实现数据库的连接与关闭
  • 封装通用增删改查SQL语句,方便扩展功能
  • 避免菜单重复创建Scanner对象
  • 提高代码可读性

Service+Dao(两层)

此项目在 学生成绩管理系统2.0 版本基础上进行改进:

  • 将结构分成Sevice和Dao两层,对冗余代码进行简化
  • 使用Druid数据库连接池技术
  • 应用Spring JdbcTemplate模板封装增删改查SQL语句
  • 使用xml方式和注解方式实现IOC的bean管理

此项目在 Spring 实现学生成绩管理系统 版本基础上进行改进:

  • 在Dao层使用Mybatis注解方式实现CRUD,不再需要接口实现类;
  • 封装统计功能返回结果的实体类;
  • 在Service层使用注解方式获取bean;
  • 优化了菜单的返回确认功能。

此项目在 Spring实现学生成绩管理系统Mybatis 基于注解方式实现学生成绩管理系统 版本基础上进行改进:

  • 基于mybatis-spring整合SpringMybatis
  • 使用xml文件方式实现CRUD和获取bean;
  • 使用Druid数据库连接池

JavaWeb项目(三层)

此项目在 学生成绩管理系统2.0版本 基础上进行改进:

  • 使用Servlet+JSP实现Web层,完整实现B/S三层架构;
  • 使用Druid数据库连接池技术;
  • 应用DBUtils封装数据库增删改查;
  • 增加了用户注册和登录功能

此项目基于 JavaWeb+MySQL实现学生成绩管理系统(3.0版本) 进行改进。主要改进内容有:

  • 使用Spring+SpringMVC+Mybatis框架实现,代替原生Servlet处理请求转发;
  • 使用SpringMVC拦截器判断用户是否登录,在注册页面使用验证码;
  • 使用SpringMVCControllerAdvice 实现全局异常处理;
  • 使用Spring注解式事务管理;
  • 使用分页模型显示所有学生信息,在主页基础上实现增加、删除、修改、统计功能,在前端页面上增加更多交互功能和提示。

本项目基于SSM 实现学生成绩管理系统(完整代码)进行改进。主要改进内容有:

  • 使用SpringBoot一站式框架实现,代替Spring+SpringMVC+Mybatis多个框架,减少配置文件数量;
  • 使用SpringBoot的自定义错误页面、使用拦截器判断用户是否登录、使用注解式事务管理;
  • 前端使用HTML+Thymeleaf模板引擎,不再使用jsp;
  • 在注册页面使用Kaptcha验证码;
  • 使用Redis实现用户注册、登录功能;
  • 使用MyBatisPlus实现分页模型显示所有学生信息;
  • 使用Echarts对统计结果实现可视化;
  • 使用Slf4j实现日志功能。

本项目基于 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

;