目录
9. 学生信息管理系统(StudentInformationManageSystems)
引言
在教育机构中,学生信息管理是一项重要的工作。传统的手工记录方式不仅效率低下,而且容易出错。随着数据库技术和编程语言的发展,利用计算机来管理学生信息成为可能。本文将介绍如何使用MySQL数据库和Java语言来构建一个简单的终端学生信息管理系统,该系统能够实现学生信息的添加、查询和更新等功能。
数据库设计
1. 创建数据库
首先,我们需要创建一个数据库来存储学生信息。在这个例子中,我们创建一个名为bookstore
的数据库。
create database bookstore;
use bookstore;
CREATE TABLE `student` (
`学号` char(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`姓名` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`性别` char(2) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`出生日期` date DEFAULT NULL,
`地区` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`民族` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '汉',
`班级编号` char(6) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
PRIMARY KEY (`学号`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC;
INSERT INTO `student` VALUES ('2013110101', '张晓勇', '男', '1997-12-11', '山西', '汉', 'AC1301');
INSERT INTO `student` VALUES ('2013110103', '王一敏', '女', '1998-01-01', '河北', '汉', 'AC1301');
INSERT INTO `student` VALUES ('2013110201', '江山', '女', '1996-09-17', '内蒙古', '锡伯', 'AC1302');
INSERT INTO `student` VALUES ('2013110202', '李明', '男', '1996-01-14', '广西', '壮', 'AC1302');
INSERT INTO `student` VALUES ('2013310101', '黄菊', '女', '1995-09-30', '北京', '汉', 'IS1301');
INSERT INTO `student` VALUES ('2013310103', '吴昊', '男', '1995-11-18', '河北', '汉', 'IS1301');
INSERT INTO `student` VALUES ('2014210101', '刘涛', '男', '1997-04-03', '湖南', '侗', 'CS1401');
INSERT INTO `student` VALUES ('2014210102', '郭志坚', '男', '1997-02-21', '上海', '汉', 'CS1401');
INSERT INTO `student` VALUES ('2014310101', '王林', '男', '1996-10-09', '河南', '汉', 'IS1401');
INSERT INTO `student` VALUES ('2014310102', '李怡然', '女', '1996-12-31', '辽宁', '汉', 'IS1401');
CREATE TABLE `score` (
`学号` char(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`课程号` char(6) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`成绩` float(5,2) DEFAULT NULL,
PRIMARY KEY (`学号`,`课程号`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC;
INSERT INTO `score` VALUES ('2013110101', '11003', '90.00');
INSERT INTO `score` VALUES ('2013110101', '21001', '86.00');
INSERT INTO `score` VALUES ('2013110103', '11003', '89.00');
INSERT INTO `score` VALUES ('2013110103', '21001', '86.00');
INSERT INTO `score` VALUES ('2013110201', '11003', '78.00');
INSERT INTO `score` VALUES ('2013110201', '21001', '92.00');
INSERT INTO `score` VALUES ('2013110202', '11003', '82.00');
INSERT INTO `score` VALUES ('2013110202', '21001', '85.00');
INSERT INTO `score` VALUES ('2013310101', '21004', '83.00');
INSERT INTO `score` VALUES ('2013310101', '31002', '68.00');
INSERT INTO `score` VALUES ('2013310103', '21004', '80.00');
INSERT INTO `score` VALUES ('2013310103', '31002', '76.00');
INSERT INTO `score` VALUES ('2014210101', '21002', '93.00');
INSERT INTO `score` VALUES ('2014210101', '21004', '89.00');
INSERT INTO `score` VALUES ('2014210102', '21002', '95.00');
INSERT INTO `score` VALUES ('2014210102', '21004', '88.00');
INSERT INTO `score` VALUES ('2014310101', '21001', '79.00');
INSERT INTO `score` VALUES ('2014310101', '21004', '80.00');
INSERT INTO `score` VALUES ('2014310102', '21001', '91.00');
INSERT INTO `score` VALUES ('2014310102', '21004', '87.00');
CREATE TABLE `course` (
`课程号` char(6) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`课程名` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`学分` int NOT NULL,
`学时` int NOT NULL,
`学期` char(2) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
`前置课` char(6) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
PRIMARY KEY (`课程号`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC;
INSERT INTO `course` VALUES ('11003', '管理学', '2', '32', '2', null);
INSERT INTO `course` VALUES ('11005', '会计学', '3', '48', '2', null);
INSERT INTO `course` VALUES ('21001', '计算机基础', '3', '48', '1', null);
INSERT INTO `course` VALUES ('21002', 'OFFICE高级应用', '3', '48', '2', '21001');
INSERT INTO `course` VALUES ('21004', '程序设计', '4', '64', '2', '21001');
INSERT INTO `course` VALUES ('21005', '数据库', '4', '64', '4', '21004');
INSERT INTO `course` VALUES ('21006', '操作系统', '4', '64', '5', '21001');
INSERT INTO `course` VALUES ('31001', '管理信息系统', '3', '48', '3', '21004');
INSERT INTO `course` VALUES ('31002', '信息系统_分析与设计', '2', '32', '4', '31001');
INSERT INTO `course` VALUES ('31005', '项目管理', '3', '48', '5', '31001');
CREATE TABLE `class` (
`班级编号` char(6) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`班级名称` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`院系` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`年级` int DEFAULT NULL,
`人数` int DEFAULT NULL,
PRIMARY KEY (`班级编号`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC;
INSERT INTO `class` VALUES ('AC1301', '会计13-1班', '会计学院', '2013', '35');
INSERT INTO `class` VALUES ('AC1302', '会计13-2班', '会计学院', '2013', '35');
INSERT INTO `class` VALUES ('CS1401', '计算机14-1班', '计算机学院', '2014', '35');
INSERT INTO `class` VALUES ('IS1301', '信息系统13-1班', '信息学院', '2013', null);
INSERT INTO `class` VALUES ('IS1401', '信息系统14-1班', '信息学院', null, '30');
2. 设计表结构
接着,我们定义了四个表:student
(学生表)、score
(成绩表)、course
(课程表)和class
(班级表)。
学生表
学生表用于存储学生的基本信息,包括学号、姓名、性别、出生日期等字段。
成绩表
成绩表用于记录学生的课程成绩,包括学号和课程号作为联合主键。
课程表
课程表用于存储课程的相关信息,如课程号、课程名、学分等。
班级表
班级表用于存储班级的基本信息,如班级编号、班级名称、所属院系等。
Java操作示例
1. 添加学生信息
通过编写一个Java类StudentAdd
,我们可以实现向数据库中添加学生信息的功能。用户可以通过控制台输入学生的各项信息,然后将其保存到数据库中。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class StudentAdd {
public static void add() {
Connection connection;
try {
//1.加载和注册JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.创建数据库连接字符串
String url = "jdbc:mysql://localhost:3306/bookstore?useSSL=false";
String name = "root";
String password = "root";
//3.建立数据库连接
connection = DriverManager.getConnection(url, name, password);
//4.创建Statement对象
Statement stmt = connection.createStatement();
//5.接收用户输入的信息
Scanner input = new Scanner(System.in);
System.out.println("请输入学号:");
int id = input.nextInt();
System.out.println("请输入姓名:");
String studnetname = input.next();
System.out.println("请输入性别:");
String gender = input.next();
System.out.println("请输入出生日期:");
String brithday = input.next();
System.out.println("请输入地区:");
String area = input.next();
System.out.println("请输入民族:");
String nation = input.next();
System.out.println("请输入班级编号:");
String classId = input.next();
//6.拼接插入SQL语句
String sql = "insert into bookstore.student(学号, 姓名, 性别, 出生日期, 地区, 民族, 班级编号) " +
"values(" + id + ",'" + studnetname + "','" + gender + "','" + brithday + "','" + area + "','" + nation + "','" + classId + "') ";
//7.执行插入操作,获取操作影响的行数
stmt.executeUpdate(sql);
System.out.println("学生添加成功!");
//8.关闭连接,释放资源
stmt.close();
connection.close();
} catch (SQLException | ClassNotFoundException exception) {
// 异常处理
throw new RuntimeException(exception);
}
}
}
2. 查询学生班级信息(StudentClass
)
StudentClass
类用于查询学生的班级信息。用户输入学生的姓名,程序将返回该学生所在的班级详情。
import java.sql.*;
import java.util.Scanner;
public class StudentClass {
public static void stuclass() {
Connection connection;
try {
//1.加载和注册JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.创建数据库连接字符串
String url = "jdbc:mysql://localhost:3306/bookstore?useSSL=false";
String name = "root";
String password = "root";
//3.建立数据库连接
connection = DriverManager.getConnection(url, name, password);
//4.创建Statement对象
Statement stmt = connection.createStatement();
//5.接收用户输入的学生姓名
Scanner input = new Scanner(System.in);
System.out.println("请输入学生姓名:");
String stuname = input.next();
//6.通过学生姓名查询所在班级的详细信息
String sql = "select * from bookstore.class where 班级编号 = (select 班级编号 from bookstore.student where 姓名 = '"+stuname+"')";
//7.执行SQL查询
ResultSet resultSet = stmt.executeQuery(sql);
//8.打印表头信息
System.out.println("班级编号 | 班级名称 | 院系 | 年级 | 人数 |");
//9.遍历结果集,并将每条记录的信息打印出来
while (resultSet.next()){
String classid = resultSet.getString("班级编号");
String classname = resultSet.getString("班级名称");
String college= resultSet.getString("院系");
String grade = resultSet.getString("年级");
String popluations = resultSet.getString("人数");
System.out.println(classid+" | "+classname+" |" +
" "+college+" | "+grade+" | "+popluations+" | ");
}
//10.关闭连接,释放资源
stmt.close();
connection.close();
} catch (SQLException | ClassNotFoundException exception) {
// 异常处理
throw new RuntimeException(exception);
}
}
}
3. 查询课程信息(StudentCourse
)
StudentCourse
类可以帮助用户查询特定课程的信息,如课程号、课程名、学分等。
import java.sql.*;
import java.util.Scanner;
public class StudentCourse {
//课程查询方法
public static void course() {
Connection connection;
try {
//1.加载和注册JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.创建数据库连接字符串
String url = "jdbc:mysql://localhost:3306/bookstore?useSSL=false";
String name = "root";
String password = "root";
//3.建立数据库连接
connection = DriverManager.getConnection(url, name, password);
//4.创建Statement对象
Statement stmt = connection.createStatement();
//5.接收用户输入的学生姓名
Scanner input = new Scanner(System.in);
System.out.println("请输入学生姓名:");
String stuname = input.next();
//6.根据学生姓名查询该学生的课程信息
String sql = "select * from bookstore.course where 课程号 =" +
" any (select 课程号 from bookstore.score where 学号 = any (select 学号 from bookstore.student where 姓名 = '"+stuname+"'))";
//7.执行数据查询
ResultSet resultSet = stmt.executeQuery(sql);
//8.打印表头信息
System.out.println("课程号 | 课程名 | 学分 | 学时 | 学期 |");
//9.遍历查询的结果集,并打印到控制台上
while (resultSet.next()){
String coureid = resultSet.getString("课程号");
String courename = resultSet.getString("课程名");
String score = resultSet.getString("学分");
String time = resultSet.getString("学时");
String term = resultSet.getString("学期");
System.out.println(coureid+" | "+courename+" | "+score+" | "+time+" | "+term+" | ");
}
//10.关闭连接和释放资源
stmt.close();
connection.close();
} catch (SQLException | ClassNotFoundException exception) {
// 异常处理
throw new RuntimeException(exception);
}
}
}
4. 删除学生信息(StudentDelete
)
StudentDelete
类用于从数据库中删除学生信息。用户需要输入学生的学号,程序会删除对应的记录。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public class StudentDelete {
//删除学生的方法
public static void delete(){
Connection connection;
try {
//1.创建数据库连接字符串
String url = "jdbc:mysql://localhost:3306/bookstore?useSSL=false";
String name = "root";
String password = "root";
//2.建立数据库连接
connection = DriverManager.getConnection(url, name, password);
//3.创建Statement对象
Statement stmt = connection.createStatement();
//4.接收用户输入的学号,根据学号删除学生信息
Scanner input = new Scanner(System.in);
System.out.println("请输入要删除的学号:");
int id = input.nextInt();
//5.拼接SQL删除语句
String sql = "delete from bookstore.student where 学号 = " + id;
//6.执行删除操作
stmt.executeUpdate(sql);
//7.打印删除成功的提示信息
System.out.println("学生删除成功!");
//8.关闭连接,释放资源
stmt.close();
connection.close();
} catch (SQLException exception) {
// 异常处理
throw new RuntimeException(exception);
}
}
}
5. 主菜单(StudentMain
)
StudentMain
类充当整个系统的入口点,它提供了一个菜单供用户选择所需的功能。例如,添加学生信息、查询成绩、更新信息等。
public class StudentMain {
public static void studentmains(){
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("8.退出");
System.out.println("-------------------");
System.out.println("请输入你的选择:");
}
}
6. 查询学生信息(StudentQuery
)
StudentQuery
类用于查询学生的详细信息。用户输入学生的学号,程序将返回该学生的全部信息。
import java.sql.*;
public class StudentQuery {
//查询学生的方法
public static void query(){
Connection connection;
try {
//1.加载和注册JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.创建数据库连接字符串
String url = "jdbc:mysql://localhost:3306/bookstore?useSSL=false";
String name = "root";
String password = "root";
//3.建立数据库连接
connection = DriverManager.getConnection(url,name,password);
//4.创建Statement对象
Statement stmt = connection.createStatement();
//5.编写SQL查询语句
String sql = "select * from student";
//6.执行SQL查询语句并获取结果集
ResultSet resultSet = stmt.executeQuery(sql);
//7.遍历结果集,将结果集中的数据打印到控制台
while(resultSet.next()){
int id = resultSet.getInt("学号");
String Studentname = resultSet.getString("姓名");
String gender = resultSet.getString("性别");
String brithday = resultSet.getString("出生日期");
String area = resultSet.getString("地区");
String nation = resultSet.getString("民族");
String classId = resultSet.getString("班级编号");
System.out.println("学号:"+id+" 姓名:"+Studentname+" 性别:"+gender+" 出生日期:"
+brithday+" 地区:"+area+" 民族:"+nation+" 班级编号:"+classId);
}
//8.关闭连接和声明,释放资源
stmt.close();
connection.close();
} catch (SQLException | ClassNotFoundException ex) {
// 异常处理
throw new RuntimeException(ex);
}
}
}
7. 查询学生成绩(StudentScore
)
StudentScore
类用于查询学生的成绩。用户需要输入学生的姓名和课程名,程序将返回对应的成绩。
import java.sql.*; // 导入JDBC相关类
import java.util.Scanner; // 导入Scanner类用于从控制台读取输入
public class StudentScore {
// 定义一个静态方法,用于查询学生成绩
public static void score() {
Connection connection; // 声明一个Connection对象,用于存储与数据库的连接
try {
// 加载MySQL JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 定义数据库连接字符串
String url = "jdbc:mysql://localhost:3306/bookstore?useSSL=false";
// 定义数据库用户名和密码
String name = "root";
String password = "root";
// 通过DriverManager获取数据库连接
connection = DriverManager.getConnection(url, name, password);
// 创建一个Statement对象,用于执行SQL语句
Statement stmt = connection.createStatement();
// 创建一个Scanner对象,用于从控制台读取输入
Scanner input = new Scanner(System.in);
// 提示用户输入学生姓名
System.out.println("请输入学生姓名:");
String stuname = input.next(); // 读取用户输入的学生姓名
// 提示用户输入课程名
System.out.println("请输入课程名:");
String coursename = input.next(); // 读取用户输入的课程名
// 构造SQL查询语句,这里使用了子查询来连接三个表(score, student, course)
// 注意:SQL语句中的'and'前面缺少了一个空格,这会导致SQL语法错误
String sql = "select 成绩 from score where 学号 = any (select 学号 from student where 姓名 = '" + stuname + "') and " +
"课程号 = any (select 课程号 from course where 课程名 = '" + coursename + "')";
// 执行查询语句,并获取结果集
ResultSet resultSet = stmt.executeQuery(sql);
// 遍历结果集并输出学生成绩
while (resultSet.next()) {
int score = resultSet.getInt("成绩"); // 从结果集中获取成绩字段的值
System.out.println("----------------");
System.out.println("成绩:" + score);
System.out.println("----------------");
}
// 关闭Statement和ResultSet对象(虽然代码中没有显示关闭ResultSet,但通常应该这样做)
// stmt.close(); // 这里应该添加,但注意,如果之后还需要使用stmt,则不应该在这里关闭它
// resultSet.close(); // 这里也应该添加
// 关闭数据库连接
connection.close();
} catch (SQLException | ClassNotFoundException exception) {
// 捕获SQLException或ClassNotFoundException异常,并抛出一个运行时异常
throw new RuntimeException(exception);
}
}
}
8. 更新学生信息(StudentUpdate
)
StudentUpdate
类用于更新学生的某些信息。用户输入需要修改的学生学号以及具体的列名和新值,程序会执行相应的更新操作。
import java.sql.Connection; // 导入java.sql包中的Connection接口,用于与数据库建立连接
import java.sql.DriverManager; // 导入java.sql包中的DriverManager类,用于管理JDBC驱动程序
import java.sql.SQLException; // 导入java.sql包中的SQLException类,表示在数据库操作中遇到的错误
import java.sql.Statement; // 导入java.sql包中的Statement接口,用于执行静态SQL语句
import java.util.Scanner; // 导入java.util包中的Scanner类,用于从控制台读取输入
public class StudentUpdate {
// 定义一个静态方法,用于更新学生信息
public static void update(){
Connection connection; // 声明一个Connection对象,用于存储与数据库的连接
try {
// 加载MySQL JDBC驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 定义数据库连接字符串
String url = "jdbc:mysql://localhost:3306/bookstore?useSSL=false";
// 定义数据库用户名和密码
String name = "root";
String password = "root";
// 通过DriverManager获取数据库连接
connection = DriverManager.getConnection(url, name, password);
// 创建一个Statement对象,用于执行SQL语句
Statement stmt = connection.createStatement();
// 创建一个Scanner对象,用于从控制台读取输入
Scanner input = new Scanner(System.in);
// 提示用户输入要修改学生的学号
System.out.println("请输入要修改学生的学号:");
int id = input.nextInt(); // 读取用户输入的学号
// 提示用户输入要修改的列名
System.out.println("请输入要修改的列:");
String colum = input.next(); // 读取用户输入的列名
// 提示用户输入要修改的值
System.out.println("请输入要修改的值:");
String value = input.next(); // 读取用户输入的值
// 构造SQL更新语句,注意这里的SQL语句可能存在SQL注入风险
String sql = "UPDATE bookstore.student SET " + colum + " = '" + value + "' WHERE 学号 = " + id;
// 执行更新操作
stmt.executeUpdate(sql);
// 输出更新成功的提示信息
System.out.println("学生修改成功!");
// 关闭Statement和Connection对象,释放资源
stmt.close();
connection.close();
} catch (SQLException | ClassNotFoundException e) {
// 捕获SQLException或ClassNotFoundException异常,并抛出一个运行时异常
throw new RuntimeException(e);
}
}
}
9. 学生信息管理系统(StudentInformationManageSystems
)
StudentInformationManageSystems
类可能是整合了上述功能的一个综合管理类,提供了一个统一的界面来管理所有的学生信息操作。
import java.util.Scanner;
public class StudentInformationManageSystems {
public static void main(String[] args) {
//打印欢迎语句
System.out.println("-------------欢迎来到学生信息管理系统---------");
//调用学生主菜单的方法
StudentMain.studentmains();
//使用while真循环使菜单可以反复显示
while (true){
//创建一个Scanner对象来获取用户的输入
Scanner input = new Scanner(System.in);
int scan = input.nextInt();
//使用switch-case结构来实现多选项
switch (scan){
case 1:
//增加学生信息
StudentAdd.add();
System.out.println("-----------------------");
StudentMain.studentmains();
break;
case 2:
//查询学生信息
StudentQuery.query();
System.out.println("-----------------------");
StudentMain.studentmains();
break;
case 3:
//更新学生信息
StudentUpdate.update();
System.out.println("-----------------------");
StudentMain.studentmains();
break;
case 4:
//删除学生信息
StudentDelete.delete();
System.out.println("-----------------------");
StudentMain.studentmains();
break;
case 5:
//查询学生班级
StudentClass.stuclass();
System.out.println("-----------------------");
StudentMain.studentmains();
break;
case 6:
//查询学生课程
StudentCourse.course();
System.out.println("-----------------------");
StudentMain.studentmains();
break;
case 7:
//查询学生成绩
StudentScore.score();
System.out.println("-----------------------");
StudentMain.studentmains();
break;
case 8:
//退出系统
System.exit(0);
default:
//输入错误时,打印错误信息并退出程序
System.out.println("无效的输入!");
System.exit(0);
}
}
}
}
运行结果如下所示
实现步骤
- 加载数据库驱动:在Java程序中加载MySQL JDBC驱动。
- 建立数据库连接:使用用户名和密码连接到数据库。
- 执行SQL语句:根据功能需求构造并执行相应的SQL语句。
- 处理结果:对于查询操作,处理查询结果;对于更新操作,检查是否成功。
- 关闭连接:完成操作后关闭数据库连接,释放资源。
结论
通过本文的介绍,我们了解了如何使用MySQL数据库和Java语言来实现一个简单的学生信息管理系统。这种系统不仅提高了管理效率,还减少了人为错误。对于学习数据库管理和Java编程的同学来说,这是一个很好的实践项目。