信息技术 代码编写 Java Java初学实践-基础的学生信息管理系统 John Tao 2023-05-22 2024-05-04 一、任务说明
使用 Java 编写一个基础的学生信息管理系统
可以连接到 MySQL 数据库,并支持以下功能:
增加学生记录
删除学生记录
修改学生记录
查询学生记录
退出程序
二、代码实现
源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 import java.sql.*;import java.util.Scanner;public class Student { private String name; private int age; private String gender; private String studentId; public Student (String name, int age, String gender, String studentId) { this .name = name; this .age = age; this .gender = gender; this .studentId = studentId; } public String getName () { return name; } public int getAge () { return age; } public String getGender () { return gender; } public String getStudentId () { return studentId; } } class StudentManager { private static final String DB_URL = "jdbc:mysql://localhost:3306/mydatabase" ; private static final String DB_USER = "root" ; private static final String DB_PASSWORD = "#####" ; public static void main (String[] args) { Connection conn = null ; Statement stmt = null ; ResultSet rs = null ; try { conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD); stmt = conn.createStatement(); Scanner scanner = new Scanner (System.in); while (true ) { System.out.println("请选择要执行的操作:" ); System.out.println("1. 增加学生记录" ); System.out.println("2. 删除学生记录" ); System.out.println("3. 修改学生记录" ); System.out.println("4. 查询学生记录" ); System.out.println("5. 退出程序" ); int choice = scanner.nextInt(); if (choice == 1 ) { System.out.println("请输入学生姓名:" ); String name = scanner.next(); if (!isValidName(name)) { System.out.println("输入的姓名不合法,请重新输入!" ); continue ; } System.out.println("请输入学生年龄:" ); int age = scanner.nextInt(); if (!isValidAge(age)) { System.out.println("输入的年龄不合法,请重新输入!" ); continue ; } System.out.println("请输入学生性别(男/女):" ); String gender = scanner.next(); if (!isValidGender(gender)) { System.out.println("输入的性别不合法,请重新输入!" ); continue ; } System.out.println("请输入学生学号:(学号应为10位纯数字)" ); String studentId = scanner.next(); if (!isValidStudentId(studentId)) { System.out.println("输入的学号不合法,请重新输入!" ); continue ; } Student student = new Student (name, age, gender, studentId); String sql = "INSERT INTO students (name, age, gender, student_id) VALUES (?, ?, ?, ?)" ; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1 , student.getName()); pstmt.setInt(2 , student.getAge()); pstmt.setString(3 , student.getGender()); pstmt.setString(4 , student.getStudentId()); pstmt.executeUpdate(); System.out.println("学生记录已成功插入!" ); } else if (choice == 2 ) { System.out.println("请输入要删除的学生姓名:" ); String name = scanner.next(); String sql = "DELETE FROM students WHERE name = ?" ; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1 , name); int count = pstmt.executeUpdate(); if (count == 0 ) { System.out.println("数据库中不存在该学生记录,请重新输入!" ); } else { System.out.println("学生记录已成功删除!" ); } } else if (choice == 3 ) { System.out.println("请输入要修改的学生姓名:" ); String name = scanner.next(); String sql = "SELECT * FROM students WHERE name = ?" ; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1 , name); rs = pstmt.executeQuery(); if (!rs.next()) { System.out.println("数据库中不存在该学生记录,请重新输入!" ); } else { int age = rs.getInt("age" ); System.out.println("请输入学生新的年龄:" ); age = scanner.nextInt(); if (!isValidAge(age)) { System.out.println("输入的年龄不合法,请重新输入!" ); continue ; } sql = "UPDATE students SET age = ? WHERE name = ?" ; pstmt = conn.prepareStatement(sql); pstmt.setInt(1 , age); pstmt.setString(2 , name); pstmt.executeUpdate(); System.out.println("学生记录已成功修改!" ); } } else if (choice == 4 ) { String sql = "SELECT * FROM students" ; rs = stmt.executeQuery(sql); while (rs.next()) { String name = rs.getString("name" ); int age = rs.getInt("age" ); String gender = rs.getString("gender" ); String studentId = rs.getString("student_id" ); Student s = new Student (name, age, gender, studentId); System.out.println("姓名:" + s.getName() + ",年龄:" + s.getAge() + ",性别:" + s.getGender() + ",学号:" + s.getStudentId()); } } else if (choice == 5 ) { break ; } else { System.out.println("无效的选择,请重新输入!" ); } } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (rs != null ) { rs.close(); } if (stmt != null ) { stmt.close(); } if (conn != null ) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } private static boolean isValidName (String name) { return name.matches("[\\u4E00-\\u9FA5]+" ); } private static boolean isValidAge (int age) { return age >= 0 && age <= 150 ; } private static boolean isValidGender (String gender) { return gender.equals("男" ) || gender.equals("女" ); } private static boolean isValidStudentId (String studentId) { return studentId.matches("\\d{10}" ); } }
运行截图
(1)增加学生记录
(2)删除学生记录
(3)修改学生记录
(4)查询学生记录
(5)退出程序
(6)校验功能
三、代码解释 1.Student
类
(1)代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 public class Student { private String name; private int age; private String gender; private String studentId; public Student (String name, int age, String gender, String studentId) { this .name = name; this .age = age; this .gender = gender; this .studentId = studentId; } public String getName () { return name; } public int getAge () { return age; } public String getGender () { return gender; } public String getStudentId () { return studentId; } }
(2)解释
Student
类有以下实例变量:
name
:表示学生姓名。
age
:表示学生年龄。
gender
:表示学生性别。
studentId
:表示学生学号。
这些变量的类型分别是 String
、int
和 String
。这个类还有一个构造函数,用于初始化这些变量。此外,它还定义了以下公共方法:
getName()
:用于获取学生姓名。
getAge()
:用于获取学生年龄。
getGender()
:用于获取学生性别。
getStudentId()
:用于获取学生学号。
这些方法都返回了对应变量的值。
2.StudentManager
类
(1)代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 class StudentManager { private static final String DB_URL = "jdbc:mysql://localhost:3306/mydatabase" ; private static final String DB_USER = "root" ; private static final String DB_PASSWORD = "151505" ; public static void main (String[] args) { Connection conn = null ; Statement stmt = null ; ResultSet rs = null ; try { conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD); stmt = conn.createStatement(); Scanner scanner = new Scanner (System.in); while (true ) { System.out.println("请选择要执行的操作:" ); System.out.println("1. 增加学生记录" ); System.out.println("2. 删除学生记录" ); System.out.println("3. 修改学生记录" ); System.out.println("4. 查询学生记录" ); System.out.println("5. 退出程序" ); int choice = scanner.nextInt(); if (choice == 1 ) { System.out.println("请输入学生姓名:" ); String name = scanner.next(); if (!isValidName(name)) { System.out.println("输入的姓名不合法,请重新输入!" ); continue ; } System.out.println("请输入学生年龄:" ); int age = scanner.nextInt(); if (!isValidAge(age)) { System.out.println("输入的年龄不合法,请重新输入!" ); continue ; } System.out.println("请输入学生性别(男/女):" ); String gender = scanner.next(); if (!isValidGender(gender)) { System.out.println("输入的性别不合法,请重新输入!" ); continue ; } System.out.println("请输入学生学号:(学号应为10位纯数字)" ); String studentId = scanner.next(); if (!isValidStudentId(studentId)) { System.out.println("输入的学号不合法,请重新输入!" ); continue ; } Student student = new Student (name, age, gender, studentId); String sql = "INSERT INTO students (name, age, gender, student_id) VALUES (?, ?, ?, ?)" ; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1 , student.getName()); pstmt.setInt(2 , student.getAge()); pstmt.setString(3 , student.getGender()); pstmt.setString(4 , student.getStudentId()); pstmt.executeUpdate(); System.out.println("学生记录已成功插入!" ); } else if (choice == 2 ) { System.out.println("请输入要删除的学生姓名:" ); String name = scanner.next(); String sql = "DELETE FROM students WHERE name = ?" ; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1 , name); int count = pstmt.executeUpdate(); if (count == 0 ) { System.out.println("数据库中不存在该学生记录,请重新输入!" ); } else { System.out.println("学生记录已成功删除!" ); } } else if (choice == 3 ) { System.out.println("请输入要修改的学生姓名:" ); String name = scanner.next(); String sql = "SELECT * FROM students WHERE name = ?" ; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1 , name); rs = pstmt.executeQuery(); if (!rs.next()) { System.out.println("数据库中不存在该学生记录,请重新输入!" ); } else { int age = rs.getInt("age" ); System.out.println("请输入学生新的年龄:" ); age = scanner.nextInt(); if (!isValidAge(age)) { System.out.println("输入的年龄不合法,请重新输入!" ); continue ; } sql = "UPDATE students SET age = ? WHERE name = ?" ; pstmt = conn.prepareStatement(sql); pstmt.setInt(1 , age); pstmt.setString(2 , name); pstmt.executeUpdate(); System.out.println("学生记录已成功修改!" ); } } else if (choice == 4 ) { String sql = "SELECT * FROM students" ; rs = stmt.executeQuery(sql); while (rs.next()) { String name = rs.getString("name" ); int age = rs.getInt("age" ); String gender = rs.getString("gender" ); String studentId = rs.getString("student_id" ); Student s = new Student (name, age, gender, studentId); System.out.println("姓名:" + s.getName() + ",年龄:" + s.getAge() + ",性别:" + s.getGender() + ",学号:" + s.getStudentId()); } } else if (choice == 5 ) { break ; } else { System.out.println("无效的选择,请重新输入!" ); } } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (rs != null ) { rs.close(); } if (stmt != null ) { stmt.close(); } if (conn != null ) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } private static boolean isValidName (String name) { return name.matches("[\\u4E00-\\u9FA5]+" ); } private static boolean isValidAge (int age) { return age >= 0 && age <= 150 ; } private static boolean isValidGender (String gender) { return gender.equals("男" ) || gender.equals("女" ); } private static boolean isValidStudentId (String studentId) { return studentId.matches("\\d{10}" ); } }
(2)解释
StudentManager
类是一个包含 main
方法的类,它是学生信息管理系统的主要实现。该类首先定义了三个私有静态常量,这些常量分别表示数据库的 URL 地址、用户名和密码。这些常量在程序的其他位置都可以被访问。
在 main
方法中,它首先创建了一个 Connection
对象,该对象用于连接到 MySQL 数据库。然后,它创建了一个 Statement
对象,用于执行 SQL 语句。接下来,它使用一个 while
循环来显示菜单选项、读取用户输入并执行相应的操作。具体来说,它可以执行以下操作:
增加学生记录
删除学生记录
修改学生记录
查询学生记录
退出程序
对于每个操作,代码会提示用户输入相应的信息,并使用 PreparedStatement
将数据插入到数据库中。在查询学生记录时,代码会执行一个 SELECT
语句,并使用 ResultSet
对象来遍历结果集。最后,代码会关闭连接和资源。
此外,StudentManager
类还包含了四个私有静态方法,用于判断学生信息的合法性。这些方法分别是:
isValidName(String name)
:用于判断学生姓名是否合法。
isValidAge(int age)
:用于判断学生年龄是否合法。
isValidGender(String gender)
:用于判断学生性别是否合法。
isValidStudentId(String studentId)
:用于判断学生学号是否合法。
这些方法都返回一个布尔值,表示学生信息是否合法。这些方法的实现分别使用了正则表达式或简单的逻辑运算。
四、总结 本代码实现了基本的增加、删除、改正的功能;将学生信息的合法性判断封装成了四个静态方法,可以在不同的地方重复使用,提高代码的复用性;使用了 Connection
和 Statement
对象连接到了 MySQL 数据库,并使用了 PreparedStatement
执行 SQL 语句。
本代码的缺点也十分明显,虽然这段代码使用了 PreparedStatement
来避免 SQL 注入攻击,但是它没有对用户输入进行任何的校验。代码只实现了基本的增删改查功能,如果需要添加其他功能,如按照成绩排序等,代码结构可能需要进行较大的调整,可拓展性较差。
总体来说,这段代码仅实现了一个简单的学生信息管理系统,结构清晰,代码易于理解。但是,它还存在一些安全性和可扩展性问题,需要进一步优化。
John Tao
Stay Hungry. Stay Foolish.
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 John Tao !