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