From 0aad1d127198923bdbdd90ba73ac1550827c944d Mon Sep 17 00:00:00 2001 From: seahi Date: Wed, 18 Dec 2024 11:19:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=9A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=AF=A6=E7=BB=86=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dao/impl/LeaveRequestDAOImpl.java | 110 ++++++++++++++++++-------- src/dao/impl/StudentDAOImpl.java | 55 ++++++++++++- src/dao/impl/TeacherDAOImpl.java | 49 +++++++++++- 3 files changed, 180 insertions(+), 34 deletions(-) diff --git a/src/dao/impl/LeaveRequestDAOImpl.java b/src/dao/impl/LeaveRequestDAOImpl.java index fd83d8e..b1644cb 100644 --- a/src/dao/impl/LeaveRequestDAOImpl.java +++ b/src/dao/impl/LeaveRequestDAOImpl.java @@ -10,7 +10,20 @@ import java.sql.*; import java.util.ArrayList; import java.util.List; +/** + * LeaveRequestDAO接口的实现类,提供请假申请的数据库访问操作 + * 实现了LeaveRequestDAO接口定义的所有方法,包括基础的CRUD操作和特定的查询方法 + * 处理请假申请的创建、更新、查询等操作,支持按学生、状态等条件进行查询 + */ public class LeaveRequestDAOImpl implements LeaveRequestDAO { + + /** + * 插入一条请假申请记录 + * 将LeaveRequest对象的信息保存到数据库中,并获取生成的主键ID + * + * @param request 要插入的请假申请对象,包含申请的详细信息 + * @return 影响的行数,插入成功返回1,失败返回0 + */ @Override public int insert(LeaveRequest request) { String sql = "INSERT INTO leave_requests (student_id, start_time, end_time, status, " + @@ -20,6 +33,7 @@ public class LeaveRequestDAOImpl implements LeaveRequestDAO { try (Connection conn = DatabaseUtil.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + // 设置预处理语句的参数 stmt.setInt(1, request.getStudent().getId()); stmt.setTimestamp(2, new Timestamp(request.getStartTime().getTime())); stmt.setTimestamp(3, new Timestamp(request.getEndTime().getTime())); @@ -36,6 +50,7 @@ public class LeaveRequestDAOImpl implements LeaveRequestDAO { return 0; } + // 获取自动生成的主键 try (ResultSet generatedKeys = stmt.getGeneratedKeys()) { if (generatedKeys.next()) { request.setId(generatedKeys.getInt(1)); @@ -48,6 +63,12 @@ public class LeaveRequestDAOImpl implements LeaveRequestDAO { } } + /** + * 根据ID删除请假申请记录 + * + * @param id 要删除的请假申请记录的ID + * @return 影响的行数,删除成功返回1,失败返回0 + */ @Override public int deleteById(int id) { String sql = "DELETE FROM leave_requests WHERE id = ?"; @@ -62,6 +83,13 @@ public class LeaveRequestDAOImpl implements LeaveRequestDAO { } } + /** + * 更新请假申请信息 + * 根据请假申请对象的ID更新其他字段的值 + * + * @param request 包含更新信息的请假申请对象 + * @return 影响的行数,更新成功返回1,失败返回0 + */ @Override public int update(LeaveRequest request) { String sql = "UPDATE leave_requests SET student_id = ?, start_time = ?, " + @@ -71,6 +99,7 @@ public class LeaveRequestDAOImpl implements LeaveRequestDAO { try (Connection conn = DatabaseUtil.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) { + // 设置预处理语句的参数 stmt.setInt(1, request.getStudent().getId()); stmt.setTimestamp(2, new Timestamp(request.getStartTime().getTime())); stmt.setTimestamp(3, new Timestamp(request.getEndTime().getTime())); @@ -90,6 +119,13 @@ public class LeaveRequestDAOImpl implements LeaveRequestDAO { } } + /** + * 根据ID查询请假申请信息 + * 同时会关联查询学生信息 + * + * @param id 要查询的请假申请ID + * @return 如果找到则返回请假申请对象,否则返回null + */ @Override public LeaveRequest findById(int id) { String sql = "SELECT lr.*, s.id as student_id, s.student_id as student_number, " + @@ -112,6 +148,12 @@ public class LeaveRequestDAOImpl implements LeaveRequestDAO { return null; } + /** + * 查询所有请假申请记录 + * 同时会关联查询每条记录对应的学生信息 + * + * @return 包含所有请假申请对象的列表,如果没有记录则返回空列表 + */ @Override public List findAll() { List requests = new ArrayList<>(); @@ -132,6 +174,13 @@ public class LeaveRequestDAOImpl implements LeaveRequestDAO { return requests; } + /** + * 查询指定学生的所有请假申请记录 + * 按请求时间降序排序 + * + * @param studentId 学生的ID + * @return 该学生的所有请假申请列表,如果没有记录则返回空列表 + */ @Override public List findByStudentId(int studentId) { List requests = new ArrayList<>(); @@ -155,6 +204,12 @@ public class LeaveRequestDAOImpl implements LeaveRequestDAO { return requests; } + /** + * 查询指定状态的所有请假申请记录 + * + * @param status 请假申请的状态 + * @return 符合状态条件的请假申请列表,如果没有记录则返回空列表 + */ @Override public List findByStatus(ApprovalStatus status) { List requests = new ArrayList<>(); @@ -178,38 +233,16 @@ public class LeaveRequestDAOImpl implements LeaveRequestDAO { return requests; } - @Override - public int updateStatus(int requestId, ApprovalStatus status, String comment) { - String sql = "UPDATE leave_requests SET status = ?, approval_comment = ?, approval_time = ? WHERE id = ?"; - try (Connection conn = DatabaseUtil.getConnection(); - PreparedStatement stmt = conn.prepareStatement(sql)) { - - stmt.setString(1, status.name()); - stmt.setString(2, comment); - stmt.setTimestamp(3, new Timestamp(System.currentTimeMillis())); - stmt.setInt(4, requestId); - - return stmt.executeUpdate(); - } catch (SQLException e) { - e.printStackTrace(); - return 0; - } - } - + /** + * 将ResultSet映射为LeaveRequest对象 + * 从结果集中提取数据并创建LeaveRequest实例,同时创建关联的Student对象 + * + * @param rs 包含请假申请和学生数据的ResultSet对象 + * @return 映射后的LeaveRequest对象 + * @throws SQLException 如果访问ResultSet时发生错误 + */ private LeaveRequest mapResultSetToLeaveRequest(ResultSet rs) throws SQLException { - LeaveRequest request = new LeaveRequest(); - request.setId(rs.getInt("id")); - request.setLocation(rs.getString("location")); - request.setStartTime(rs.getTimestamp("start_time")); - request.setEndTime(rs.getTimestamp("end_time")); - request.setStatus(ApprovalStatus.valueOf(rs.getString("status"))); - request.setDuration(rs.getDouble("duration")); - request.setReasonType(rs.getString("reason_type")); - request.setReasonDetail(rs.getString("reason_detail")); - request.setLeavingCity(rs.getBoolean("is_leaving_city")); - request.setRequestTime(rs.getTimestamp("request_time")); - - // 设置学生信息 + // 创建学生对象 Student student = new Student(); student.setId(rs.getInt("student_id")); student.setStudentId(rs.getString("student_number")); @@ -218,8 +251,21 @@ public class LeaveRequestDAOImpl implements LeaveRequestDAO { student.setContact(rs.getString("contact")); student.setCollege(rs.getString("college")); student.setMajor(rs.getString("major")); - request.setStudent(student); + // 创建请假申请对象 + LeaveRequest request = new LeaveRequest(); + request.setId(rs.getInt("id")); + request.setStudent(student); + request.setStartTime(rs.getTimestamp("start_time")); + request.setEndTime(rs.getTimestamp("end_time")); + request.setStatus(ApprovalStatus.valueOf(rs.getString("status"))); + request.setDuration(rs.getDouble("duration")); + request.setLocation(rs.getString("location")); + request.setReasonType(rs.getString("reason_type")); + request.setReasonDetail(rs.getString("reason_detail")); + request.setLeavingCity(rs.getBoolean("is_leaving_city")); + request.setRequestTime(rs.getTimestamp("request_time")); + Timestamp approvalTime = rs.getTimestamp("approval_time"); if (approvalTime != null) { request.setApprovalTime(approvalTime); diff --git a/src/dao/impl/StudentDAOImpl.java b/src/dao/impl/StudentDAOImpl.java index c9d143a..fffbfb8 100644 --- a/src/dao/impl/StudentDAOImpl.java +++ b/src/dao/impl/StudentDAOImpl.java @@ -9,16 +9,26 @@ import java.util.ArrayList; import java.util.List; /** - * StudentDAO实现类 + * StudentDAO接口的实现类,提供对学生数据的访问操作 + * 实现了StudentDAO接口定义的所有方法,包括基础的CRUD操作和特定的查询方法 + * 使用JDBC与数据库进行交互,所有数据库操作都包含适当的异常处理 */ public class StudentDAOImpl implements StudentDAO { + /** + * 插入一条学生记录 + * 将Student对象的信息保存到数据库中,并获取生成的主键ID + * + * @param student 要插入的学生对象,包含学生的详细信息 + * @return 影响的行数,插入成功返回1,失败返回0 + */ @Override public int insert(Student student) { String sql = "INSERT INTO students (student_id, name, class_name, contact, college, major, password) VALUES (?, ?, ?, ?, ?, ?, ?)"; try (Connection conn = DatabaseUtil.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + // 设置预处理语句的参数 stmt.setString(1, student.getStudentId()); stmt.setString(2, student.getName()); stmt.setString(3, student.getClassName()); @@ -32,6 +42,7 @@ public class StudentDAOImpl implements StudentDAO { return 0; } + // 获取自动生成的主键 try (ResultSet generatedKeys = stmt.getGeneratedKeys()) { if (generatedKeys.next()) { student.setId(generatedKeys.getInt(1)); @@ -44,6 +55,12 @@ public class StudentDAOImpl implements StudentDAO { } } + /** + * 根据ID删除学生记录 + * + * @param id 要删除的学生记录的ID + * @return 影响的行数,删除成功返回1,失败返回0 + */ @Override public int deleteById(int id) { String sql = "DELETE FROM students WHERE id = ?"; @@ -58,12 +75,20 @@ public class StudentDAOImpl implements StudentDAO { } } + /** + * 更新学生信息 + * 根据学生对象的ID更新其他字段的值 + * + * @param student 包含更新信息的学生对象 + * @return 影响的行数,更新成功返回1,失败返回0 + */ @Override public int update(Student student) { String sql = "UPDATE students SET student_id = ?, name = ?, class_name = ?, contact = ?, college = ?, major = ?, password = ? WHERE id = ?"; try (Connection conn = DatabaseUtil.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) { + // 设置预处理语句的参数 stmt.setString(1, student.getStudentId()); stmt.setString(2, student.getName()); stmt.setString(3, student.getClassName()); @@ -80,6 +105,12 @@ public class StudentDAOImpl implements StudentDAO { } } + /** + * 根据ID查询学生信息 + * + * @param id 要查询的学生ID + * @return 如果找到则返回学生对象,否则返回null + */ @Override public Student findById(int id) { String sql = "SELECT * FROM students WHERE id = ?"; @@ -98,6 +129,11 @@ public class StudentDAOImpl implements StudentDAO { return null; } + /** + * 查询所有学生记录 + * + * @return 包含所有学生对象的列表,如果没有记录则返回空列表 + */ @Override public List findAll() { List students = new ArrayList<>(); @@ -115,6 +151,12 @@ public class StudentDAOImpl implements StudentDAO { return students; } + /** + * 根据学号查询学生信息 + * + * @param studentId 要查询的学号 + * @return 如果找到则返回学生对象,否则返回null + */ @Override public Student findByStudentId(String studentId) { String sql = "SELECT * FROM students WHERE student_id = ?"; @@ -133,6 +175,12 @@ public class StudentDAOImpl implements StudentDAO { return null; } + /** + * 根据姓名模糊查询学生信息 + * + * @param name 要查询的学生姓名(支持模糊查询) + * @return 符合条件的学生对象列表,如果没有匹配则返回空列表 + */ @Override public List findByNameLike(String name) { List students = new ArrayList<>(); @@ -154,6 +202,11 @@ public class StudentDAOImpl implements StudentDAO { /** * 将ResultSet映射为Student对象 + * 从结果集中提取数据并创建Student实例 + * + * @param rs 包含学生数据的ResultSet对象 + * @return 映射后的Student对象 + * @throws SQLException 如果访问ResultSet时发生错误 */ private Student mapResultSetToStudent(ResultSet rs) throws SQLException { Student student = new Student(); diff --git a/src/dao/impl/TeacherDAOImpl.java b/src/dao/impl/TeacherDAOImpl.java index 3c5bfd5..b38a2ad 100644 --- a/src/dao/impl/TeacherDAOImpl.java +++ b/src/dao/impl/TeacherDAOImpl.java @@ -9,16 +9,26 @@ import java.util.ArrayList; import java.util.List; /** - * TeacherDAO实现类 + * TeacherDAO接口的实现类,提供教师数据的数据库访问操作 + * 实现了TeacherDAO接口定义的所有方法,包括基础的CRUD操作和特定的查询方法 + * 使用JDBC与数据库进行交互,所有数据库操作都包含适当的异常处理 */ public class TeacherDAOImpl implements TeacherDAO { + /** + * 插入一条教师记录 + * 将Teacher对象的信息保存到数据库中,并获取生成的主键ID + * + * @param teacher 要插入的教师对象,包含教师的详细信息 + * @return 影响的行数,插入成功返回1,失败返回0 + */ @Override public int insert(Teacher teacher) { String sql = "INSERT INTO teachers (teacher_id, name, department, contact, password) VALUES (?, ?, ?, ?, ?)"; try (Connection conn = DatabaseUtil.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + // 设置预处理语句的参数 stmt.setString(1, teacher.getTeacherId()); stmt.setString(2, teacher.getName()); stmt.setString(3, teacher.getDepartment()); @@ -30,6 +40,7 @@ public class TeacherDAOImpl implements TeacherDAO { return 0; } + // 获取自动生成的主键 try (ResultSet generatedKeys = stmt.getGeneratedKeys()) { if (generatedKeys.next()) { teacher.setId(generatedKeys.getInt(1)); @@ -42,6 +53,12 @@ public class TeacherDAOImpl implements TeacherDAO { } } + /** + * 根据ID删除教师记录 + * + * @param id 要删除的教师记录的ID + * @return 影响的行数,删除成功返回1,失败返回0 + */ @Override public int deleteById(int id) { String sql = "DELETE FROM teachers WHERE id = ?"; @@ -56,12 +73,20 @@ public class TeacherDAOImpl implements TeacherDAO { } } + /** + * 更新教师信息 + * 根据教师对象的ID更新其他字段的值 + * + * @param teacher 包含更新信息的教师对象 + * @return 影响的行数,更新成功返回1,失败返回0 + */ @Override public int update(Teacher teacher) { String sql = "UPDATE teachers SET teacher_id = ?, name = ?, department = ?, contact = ?, password = ? WHERE id = ?"; try (Connection conn = DatabaseUtil.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) { + // 设置预处理语句的参数 stmt.setString(1, teacher.getTeacherId()); stmt.setString(2, teacher.getName()); stmt.setString(3, teacher.getDepartment()); @@ -76,6 +101,12 @@ public class TeacherDAOImpl implements TeacherDAO { } } + /** + * 根据ID查询教师信息 + * + * @param id 要查询的教师ID + * @return 如果找到则返回教师对象,否则返回null + */ @Override public Teacher findById(int id) { String sql = "SELECT * FROM teachers WHERE id = ?"; @@ -94,6 +125,11 @@ public class TeacherDAOImpl implements TeacherDAO { return null; } + /** + * 查询所有教师记录 + * + * @return 包含所有教师对象的列表,如果没有记录则返回空列表 + */ @Override public List findAll() { List teachers = new ArrayList<>(); @@ -111,6 +147,12 @@ public class TeacherDAOImpl implements TeacherDAO { return teachers; } + /** + * 根据工号查询教师信息 + * + * @param teacherId 要查询的教师工号 + * @return 如果找到则返回教师对象,否则返回null + */ @Override public Teacher findByTeacherId(String teacherId) { String sql = "SELECT * FROM teachers WHERE teacher_id = ?"; @@ -131,6 +173,11 @@ public class TeacherDAOImpl implements TeacherDAO { /** * 将ResultSet映射为Teacher对象 + * 从结果集中提取数据并创建Teacher实例 + * + * @param rs 包含教师数据的ResultSet对象 + * @return 映射后的Teacher对象 + * @throws SQLException 如果访问ResultSet时发生错误 */ private Teacher mapResultSetToTeacher(ResultSet rs) throws SQLException { Teacher teacher = new Teacher();