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

本文是MySQL+java: 实现学生成绩管理系统(2.0版本),是基于MySQL+java: 实现学生成绩管理系统(1.0版本)进行修改优化的版本 。在此感谢读者对1.0版本提出的宝贵意见。您可以在github上查看本项目的完整代码,包括JDBC配置文件等内容。

任务

在这里插入图片描述

代码功能介绍

代码 功能
StuScore.java 建立和stu_score表相同的字段
JDBCUtils.java 封装数据库的连接与关闭
CRUDUtils.java 封装增删改查SQL语句
StuScoreOperation.java 使用SQL语句实现具体业务操作
StuMenu.java 实现学生成绩管理系统菜单
Main.java 主函数

环境

  • JDK 1.8
  • MySQL 5.5.15
  • JDBC 5.1.49

实现

使用MySQL生成表

包括 学号,姓名,成绩,班级四个字段。

USE db58;

DROP TABLE IF EXISTS stu_score;
CREATE TABLE IF NOT EXISTS stu_score(
	NO VARCHAR(10),
	NAME VARCHAR(20),
	score FLOAT,
	className INT
);

DESC stu_score;

在这里插入图片描述

本文的java代码部分基于Java 实现学生信息管理系统。本文连接MySQL数据库。
本文在原文的增删改查基础上,增加了班级字段和成绩字段,增加了排序和统计的功能,实现分组统计各班的人数及成绩信息并输出。

建立和stu_score表相同的字段

/**
 * 本类功能:建立和student表相同的字段
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| no        | varchar(10) | YES  |     | NULL    |       |
| name      | varchar(20) | YES  |     | NULL    |       |
| score     | float       | YES  |     | NULL    |       |
| className | int(11)     | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
 * @author AsajuHuishi
 *
 */
public class StuScore {
    
    
	@Override
	public String toString() {
    
    
		return "StuScore [no=" + no + ", name=" + name + ", score=" + score + ", className=" + className + "]";
	}
	private String no;
	private String name;
	private float score;
	private int className;
	public StuScore(String no, String name, float score, int className) {
    
    
		super();
		this.no = no;
		this.name = name;
		this.score = score;
		this.className = className;
	}
	public StuScore(){
    
     //缺省构造函数
		super();
	}
	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;
	}
	public int getClassName() {
    
    
		return className;
	}
	public void setClassName(int className) {
    
    
		this.className = className;
	}
}

封装数据库的连接与关闭

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import javax.print.DocFlavor.STRING;

import sun.security.util.Password;

/**
 * 功能:封装数据库的连接与关闭。
 * @author AsajuHuishi
 *
 */
public class JDBCUtils {
    
    
	private static String user;
	private static String password;
	private static String url;
	private static String driver;
	static{
    
    
		try {
    
     
			Properties properties = new Properties();
			properties.load(new FileInputStream("src\\jdbc.properties"));
			user = properties.getProperty("user");
			password = properties.getProperty("password");
			url = properties.getProperty("url");
			driver = properties.getProperty("driver");
			Class.forName(driver);
		} catch (FileNotFoundException e) {
    
    
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
    
    
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
    
    
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 建立连接
	 * @return
	 * @throws Exception
	 */
	public static Connection getConnection() throws Exception {
    
    
		Connection connection = DriverManager.getConnection(url, user, password);
		return connection;
	}
	/**
	 * 关闭
	 * @param set
	 * @param preparedStatement
	 * @param connection
	 * @throws SQLException
	 */
	public static void close(ResultSet set, Statement statement, Connection connection){
    
    //通用
		try {
    
    
			if (set != null) {
    
    
				set.close();
			}
			if (statement != null) {
    
    
				statement.close();
			}
			if (connection != null) {
    
    
				connection.close();
			} 
		} catch (Exception e) {
    
    
			// TODO: handle exception
			throw new RuntimeException(e);
		}
	}
}

封装增删改查SQL语句

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 功能:封装增删改查
 * @author AsajuHuishi
 *
 */
public class CRUDUtils {
    
    
	/**
	 * 增删改 通用
	 * 针对任何表任何增删改
	 * @return
	 */
	public static int update(String sql,Object...params){
    
    //不确定个数 不确定类型
		//获取链接
		PreparedStatement preparedStatement = null;
		Connection connection = null;
		try {
    
    
			connection = JDBCUtils.getConnection();
			preparedStatement = connection.prepareStatement(sql);
			for (int i=0;i<params.length;i++){
    
    
				preparedStatement.setObject(i+1, params[i]);
			}
			int update = preparedStatement.executeUpdate();
			return update;
		} catch (Exception e) {
    
    
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		} finally {
    
    
			JDBCUtils.close(null, preparedStatement, connection);
		}
	}
	/**
	 * 单条查询StuScore表
	 * 
	 * @param sql
	 * @param params
	 * @return
	 */
	public static StuScore querySingle(String sql,Object...params){
    
    
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet set = null;
		try {
    
    
			//获取连接
			connection = JDBCUtils.getConnection();
			//执行查询
			preparedStatement = connection.prepareStatement(sql);
			for (int i=0;i<params.length;i++){
    
    
				preparedStatement.setObject(i+1, params[i]);
			}
			set = preparedStatement.executeQuery();
			
			if(set.next()){
    
    //只有一行
				String no = set.getString("no");
				String name = set.getString("name");
				Float score = set.getFloat("score");
				int className = set.getInt("className");
				StuScore stu = new StuScore(no,name,score,className);
				return stu;
			}
			return null;
		} catch (Exception e) {
    
    
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		} finally {
    
    
			JDBCUtils.close(set, preparedStatement, connection);
		}		
	}
	public static List<StuScore> queryMulti(String sql,Object...params){
    
    
		Connection connection = null;
		PreparedStatement preparedStatement = null;
		ResultSet set = null;
		try {
    
    
			//获取连接
			connection = JDBCUtils.getConnection();
			//执行查询
			preparedStatement = connection.prepareStatement(sql);
			for (int i=0;i<params.length;i++){
    
    
				preparedStatement.setObject(i+1, params[i]);
			}
			set = preparedStatement.executeQuery();
			List list = new ArrayList<>();
			while(set.next()){
    
    //只有一行
				String no = set.getString("no");
				String name = set.getString("name");
				Float score = set.getFloat("score");
				int className = set.getInt("className");
				StuScore stu = new StuScore(no,name,score,className);
				list.add(stu);
			}
			return list;
		} catch (Exception e) {
    
    
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		} finally {
    
    
			JDBCUtils.close(set, preparedStatement, connection);
		}		
	}
	
	public static List<Map<String,Object>> statistics() {
    
    
		Connection connection = null;
		ResultSet set = null;
		PreparedStatement preparedStatement = null;
		try {
    
    
			connection = JDBCUtils.getConnection();
			preparedStatement = connection.prepareStatement("select count(*),max(score),min(score),round(avg(score),4) from stu_score group by className order by avg(score) desc");
			List<Map<String,Object>> list = new ArrayList<>();
			set = preparedStatement.executeQuery();
			while (set.next()) {
    
    
				Map<String,Object> record = new HashMap<>();//保存于字典
				record.put("count", set.getObject(1));
				record.put("max_score", set.getObject(2));
				record.put("min_score", set.getObject(3));
				record.put("avg_score", set.getObject(4));
				list.add(record);	
			}
			return list;
		} catch (Exception e) {
    
    
			throw new RuntimeException(e);
		} finally {
    
    
			JDBCUtils.close(set, preparedStatement, connection);
		}
	}
	
}

实现对数据库具体业务操作

import java.util.*;
/**
 * 功能:实现对数据库具体业务操作:增删改查
 * @author AsajuHuishi
 *
 */
public class StuScoreOperation {
    
    
	/**
	 * 增加学生记录
	 * @param 
	 */
	public static void add(StuScore stu){
    
    
		System.out.println("增加学生记录...");
//		System.out.println(stu.getNo()+stu.getName()+stu.getScore()+stu.getClassName());
		int update = CRUDUtils.update("insert into stu_score(no,name,score,className) values(?,?,?,?)", stu.getNo(),stu.getName(),stu.getScore(),stu.getClassName());
		System.out.println(update>0?"添加成功":"添加失败");
	}
	/**
	 * 按照学号修改学生记录
	 * @param 
	 */
	public static void update(StuScore stu){
    
    
		System.out.println("按照学号修改学生记录...");
		int update = CRUDUtils.update("update stu_score set name=?,score=?,className=? where no=?",stu.getName(),stu.getScore(),stu.getClassName(), stu.getNo());
		System.out.println(update>0?"修改成功":"修改失败");
	}	
	/**
	 * 按照学号删除学生记录
	 * @param 
	 */
	public static void delete(String no){
    
    
		System.out.println("按照学号删除学生记录...");
		int update = CRUDUtils.update("delete from stu_score where no=?",no);
		System.out.println(update>0?"删除成功":"删除失败");
	}		
	/**
	 * 按照姓名查学生记录
	 * @param 
	 * @return float grade
	 */
	public static StuScore QueryByName(String name){
    
    
		System.out.println("按照姓名查学生记录...");
		StuScore stu = CRUDUtils.querySingle("select * from stu_score where name=?", name);
		if (stu != null){
    
    
			System.out.println("该学生的信息如下:");
			System.out.println("学生学号:"+stu.getNo());
			System.out.println("学生班级:"+stu.getClassName());
			System.out.println("学生姓名:"+stu.getName());
			System.out.println("学生成绩:"+stu.getScore());
			return stu;
		}else{
    
    
			System.out.println("未找到此姓名:"+name);
			return null;
		}
	}
	/**
	 * 按照学号查学生记录
	 * @param 
	 * @return float grade 
	 */
	public static StuScore QueryByNo(String no){
    
    
		System.out.println("按照学号查学生记录...");
		StuScore stu = CRUDUtils.querySingle("select * from stu_score where no=?", no);
		if (stu != null){
    
    
			System.out.println("该学生的信息如下:");
			System.out.println("学生学号:"+stu.getNo());
			System.out.println("学生班级:"+stu.getClassName());
			System.out.println("学生姓名:"+stu.getName());
			System.out.println("学生成绩:"+stu.getScore());
			return stu;
		}else{
    
    
			System.out.println("未找到此学号:"+no);
			return null;
		}
	}	
	/**
	 * 按成绩排序
	 * @return List<StuScore> list
	 */
	public static List<StuScore> showBySortScore() {
    
    
		System.out.println("按成绩排序...");
		List<StuScore> list = CRUDUtils.queryMulti("select * from stu_score order by score");
		return list;
	}
	/**
	 * 统计
	 * @return List<Map<String,Object>> list
	 */
	public static List<Map<String,Object>> statistics() {
    
    
		System.out.println("统计(分班级统计学生数量,最高分,最低分,平均值)...");
		List<Map<String,Object>>  list = CRUDUtils.statistics();
		return list;
	}
}

实现学生成绩管理系统菜单


import java.util.*;
/**
 * 实现学生成绩管理系统菜单功能
 * @author AsajuHuishi
 *
 */
public class StuMenu {
    
    
	private static Scanner s;
	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 static void myAdd() {
    
    
		String continute;
		do {
    
    
			s = new Scanner(System.in);
			String no, name;
			float score;
			int className;
			System.out.println("====新增学生====");
			System.out.println("学号(长度不超过10):");
			no = s.next();
			System.out.println("班级(整数):");
			className = s.nextInt();
			System.out.println("姓名:");
			name = s.next();
			System.out.println("成绩:");
			score = s.nextFloat();    
			//调用StuScoreOperation
			StuScoreOperation.add(new StuScore(no, name, score, className));
			System.out.println("是否继续添加(y/n):");
			s = new Scanner(System.in);
			continute = s.next();
		} while (continute.equals("y"));
	}
	//修改学生信息
	public static void myUpdate(){
    
    
		s = new Scanner(System.in);
		String no;
		System.out.println("====修改学生====");
		System.out.println("请输入要修改的学生学号:");
		no = s.next();
		StuScoreOperation.QueryByNo(no);

		System.out.println("请输入新的学生信息:");
		s = new Scanner(System.in);
		String name;
		float score;
		int className;
		System.out.println("学生班级:");
		className = s.nextInt();
		System.out.println("学生姓名:");
		name = s.next();
		System.out.println("学生成绩:");
		score = s.nextFloat();		
		StuScoreOperation.update(new StuScore(no, name, score, className));
	}  
	//删除学生信息
	public static void myDel(){
    
    
		s = new Scanner(System.in);
		String no;
		System.out.println("====删除学生====");
		System.out.println("请输入要删除的学生学号:");
		no = s.next();   
		StuScoreOperation.QueryByNo(no);
    
		System.out.println("是否真的删除(y/n):");
		s = new Scanner(System.in);
		String x = s.next();
		if (x.equals("y")) {
    
    
			StuScoreOperation.delete(no);
		}
	}	
	//按姓名查询学生信息
	public static void myListByName(){
    
    
		s = new Scanner(System.in);
		System.out.println("====查询学生====");
		System.out.println("请输入要查看的学生姓名:");
		StuScoreOperation.QueryByName(s.next());	
	}	
	//按学号查询学生信息
	public static void myListByNo(){
    
    
		s = new Scanner(System.in);
		System.out.println("====查询学生====");
		System.out.println("请输入要查看的学生学号:");
		StuScoreOperation.QueryByNo(s.next());	
	}
	//排序
	public static void mySort() {
    
    
		System.out.println("按成绩升序显示");
		System.out.println("学号\t\t班级\t姓名\t成绩");
		List<StuScore> list = StuScoreOperation.showBySortScore();
		for (StuScore stuList:list) {
    
    
			System.out.println(stuList.getNo()+"\t"+stuList.getClassName()+"\t"+stuList.getName()+"\t"+stuList.getScore());
		}
	}
	//统计
	public static void myStatistic() {
    
    
		System.out.println("统计(分班级统计学生数量,最高分,最低分,平均值)");
		List<Map<String,Object>> list = StuScoreOperation.statistics();
		System.out.println(list);
		System.out.println("count\tmax_score\tmin_score\tavg_score");
		for (Map<String,Object> m: list) {
    
    
			System.out.println(m.get("count")+"\t"+m.get("max_score")+"\t\t"+m.get("min_score")+"\t\t"+m.get("avg_score"));
		}
	}	
}

主函数


/**
 * 功能:主函数
 * @author AsajuHuishi
 *
 */
public class Main {
    
    
	public static void main(String[] args) {
    
    
		StuMenu stuMenu = new StuMenu();
		stuMenu.menu();		
	}
}

结果

=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
1
******************************
====新增学生====
学号(长度不超过10):
201
班级(整数):
1
姓名:
M7
成绩:
82
增加学生记录...
添加成功
是否继续添加(y/n):
y
====新增学生====
学号(长度不超过10):
202
班级(整数):
2
姓名:
4D
成绩:
81
增加学生记录...
添加成功
是否继续添加(y/n):
y
====新增学生====
学号(长度不超过10):
203
班级(整数):
3
姓名:
A20
成绩:
84
增加学生记录...
添加成功
是否继续添加(y/n):
y
====新增学生====
学号(长度不超过10):
213
班级(整数):
3
姓名:
A32
成绩:
85
增加学生记录...
添加成功
是否继续添加(y/n):
y
====新增学生====
学号(长度不超过10):
212
班级(整数):
2
姓名:
38tnA
成绩:
86
增加学生记录...
添加成功
是否继续添加(y/n):
n
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
2
******************************
====修改学生====
请输入要修改的学生学号:
202
按照学号查学生记录...
该学生的信息如下:
学生学号:202
学生班级:2
学生姓名:4D
学生成绩:81.0
请输入新的学生信息:
学生班级:
2
学生姓名:
4D
学生成绩:
82
按照学号修改学生记录...
修改成功
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
3
******************************
====删除学生====
请输入要删除的学生学号:
213
按照学号查学生记录...
该学生的信息如下:
学生学号:213
学生班级:3
学生姓名:A32
学生成绩:85.0
是否真的删除(y/n):
y
按照学号删除学生记录...
删除成功
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
4
******************************
请选择按姓名查询还是按照学号查询(1姓名 2学号):1
====查询学生====
请输入要查看的学生姓名:
M7
按照姓名查学生记录...
该学生的信息如下:
学生学号:201
学生班级:1
学生姓名:M7
学生成绩:82.0
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
4
******************************
请选择按姓名查询还是按照学号查询(1姓名 2学号):2
====查询学生====
请输入要查看的学生学号:
201
按照学号查学生记录...
该学生的信息如下:
学生学号:201
学生班级:1
学生姓名:M7
学生成绩:82.0
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
5
******************************
按成绩降序显示
学号		班级	姓名	成绩
按成绩排序...
201	1	M7	82.0
202	2	4D	82.0
203	3	A20	84.0
212	2	38tnA	86.0
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
6
******************************
统计(分班级统计学生数量,最高分,最低分,平均值)
统计(分班级统计学生数量,最高分,最低分,平均值)...
[{
    
    max_score=86.0, count=2, min_score=82.0, avg_score=84.0}, {
    
    max_score=84.0, count=1, min_score=84.0, avg_score=84.0}, {
    
    max_score=82.0, count=1, min_score=82.0, avg_score=82.0}]
count	max_score	min_score	avg_score
2	86.0		82.0		84.0
1	84.0		84.0		84.0
1	82.0		82.0		82.0
=======欢迎进入学生成绩管理系统=======
1.新增学生记录
2.修改学生记录
3.删除学生记录
4.按姓名或学号查询学生记录
5.按成绩排序
6.分班级统计
7.退出
请选择(1-7):
7
******************************
您选择了退出系统,确定要退出吗?(y/n)
y

参考
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

猜你喜欢

转载自blog.csdn.net/qq_36937684/article/details/112502793