实训第三天(学生信息管理系统)

实训第三天(学生信息管理系统)
1.创建一个实体类UserDaoImpl
在这里插入图片描述
代码如下:
package net.zxk.student.dao.impl;
import net.zxk.student.bean.User;
import net.zxk.student.dao.UserDao;
import net.zxk.student.dbutil.ConnectionManager;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**

  • 功能:用户数据访问接口实现类

  • 作者:

  • 日期:
    /
    public class UserDaoImpl implements UserDao {
    /
    *

    • 插入用户记录

    • @param user

    • @return 插入记录数
      */
      @Override
      public int insert(User user) {
      // 定义插入记录数
      int count = 0;

      // 1. 获得数据库连接
      Connection conn = ConnectionManager.getConnection();
      // 2. 定义SQL字符串
      String strSQL = “insert into t_user (username, password, telephone, register_time)”
      + " values (?, ?, ?, ?)";
      try {
      // 3. 创建预备语句对象
      PreparedStatement pstmt = conn.prepareStatement(strSQL);
      // 4. 设置占位符的值
      pstmt.setString(1, user.getUsername());
      pstmt.setString(2, user.getPassword());
      pstmt.setString(3,user.getTelephone());
      pstmt.setTimestamp(4, new Timestamp(user.getRegisterTime().getTime()));
      // 5. 执行SQL,返回插入记录数
      count = pstmt.executeUpdate();
      // 6. 关闭预备语句对象
      pstmt.close();
      } catch (SQLException e) {
      e.printStackTrace();
      } finally {
      // 关闭数据库连接
      ConnectionManager.closeConnection(conn);
      }

      // 返回插入记录数
      return count;
      }

    /**

    • 按id删除用户记录

    • @param id

    • @return 删除记录数
      */
      @Override
      public int deleteById(int id) {
      // 定义删除记录数
      int count = 0;

      // 1. 获取数据库连接
      Connection conn = ConnectionManager.getConnection();
      // 2. 定义SQL字符串
      String strSQL = “delete from t_user where id = ?”;
      try {
      // 3. 创建预备语句对象
      PreparedStatement pstmt = conn.prepareStatement(strSQL);
      // 4. 设置占位符的值
      pstmt.setInt(1, id);
      // 5. 执行SQL,返回删除记录数
      count = pstmt.executeUpdate();
      // 6. 关闭预备语句对象
      pstmt.close();
      } catch (SQLException e) {
      e.printStackTrace();
      } finally {
      // 关闭数据库连接
      ConnectionManager.closeConnection(conn);
      }

      // 返回删除记录数
      return count;
      }

    /**

    • 更新用户记录

    • @param user

    • @return 更新记录数
      */
      @Override
      public int update(User user) {
      // 定义更新记录数
      int count = 0;

      // 1. 获得数据库连接
      Connection conn = ConnectionManager.getConnection();
      // 2. 定义SQL字符串
      String strSQL = “update t_user set username = ?, password = ?, telephone = ?,”
      + " register_time = ? where id = ?";
      try {
      // 3. 创建预备语句对象
      PreparedStatement pstmt = conn.prepareStatement(strSQL);
      // 4. 设置占位符的值
      pstmt.setString(1, user.getUsername());
      pstmt.setString(2, user.getPassword());
      pstmt.setString(3, user.getTelephone());
      pstmt.setTimestamp(4, new Timestamp(user.getRegisterTime().getTime()));
      pstmt.setInt(5, user.getId());
      // 5. 执行SQL,返回更新记录数
      count = pstmt.executeUpdate();
      // 6. 关闭预备语句对象
      pstmt.close();
      } catch (SQLException e) {
      e.printStackTrace();
      } finally {
      // 关闭数据库连接
      ConnectionManager.closeConnection(conn);
      }

      // 返回更新记录数
      return count;
      }

    /**

    • 按id查询用户

    • @param id

    • @return 用户实体
      */
      @Override
      public User findById(int id) {
      // 声明用户对象
      User user = null;

      // 1. 获取数据库连接对象
      Connection conn = ConnectionManager.getConnection();
      // 2. 定义SQL字符串
      String strSQL = “select * from t_user where id = ?”;
      try {
      // 3. 创建预备语句对象
      PreparedStatement pstmt = conn.prepareStatement(strSQL);
      // 4. 设置占位符的值
      pstmt.setInt(1, id);
      // 5. 执行SQL,返回结果集
      ResultSet rs = pstmt.executeQuery();
      // 6. 判断结果集是否有记录
      if (rs.next()) {
      // 创建用户实体
      user = new User();
      // 利用当前记录各字段值设置用户实体属性
      user.setId(rs.getInt(“id”));
      user.setUsername(rs.getString(“username”));
      user.setPassword(rs.getString(“password”));
      user.setTelephone(rs.getString(“telephone”));
      user.setRegisterTime(rs.getTimestamp(“register_time”));
      }
      } catch (SQLException e) {
      e.printStackTrace();
      } finally {
      // 关闭数据库连接
      ConnectionManager.closeConnection(conn);
      }

      // 返回用户对象
      return user;
      }

    /**

    • 查询所有用户

    • @return 用户列表
      */
      @Override
      public List findAll() {
      // 声明用户列表
      List users = new ArrayList();

      // 1. 获取数据库连接对象
      Connection conn = ConnectionManager.getConnection();
      // 2. 定义SQL字符串
      String strSQL = “select * from t_user”;
      try {
      // 3. 创建语句对象
      Statement stmt = conn.createStatement();
      // 4. 执行SQL,返回结果集
      ResultSet rs = stmt.executeQuery(strSQL);
      // 5. 遍历结果集
      while (rs.next()) {
      // 创建用户实体
      User user = new User();
      // 利用当前记录各字段值设置用户实体属性
      user.setId(rs.getInt(“id”));
      user.setUsername(rs.getString(“username”));
      user.setPassword(rs.getString(“password”));
      user.setTelephone(rs.getString(“telephone”));
      user.setRegisterTime(rs.getTimestamp(“register_time”));
      // 将实体添加到用户列表
      users.add(user);
      }
      // 6. 关闭结果集
      rs.close();
      // 7. 关闭语句对象
      stmt.close();
      } catch (SQLException e) {
      e.printStackTrace();
      } finally {
      // 关闭数据库连接
      ConnectionManager.closeConnection(conn);
      }

      // 返回用户列表
      return users;
      }

    /**

    • 用户登录

    • @param username

    • @param password

    • @return 登录用户实体
      */
      @Override
      public User login(String username, String password) {
      // 声明用户对象
      User user = null;

      // 1. 获取数据库连接
      Connection conn = ConnectionManager.getConnection();
      // 2. 定义SQL字符串
      String strSQL = “select * from t_user where username = ? and password = ?”;
      try {
      // 3. 创建预备语句对象
      PreparedStatement pstmt = conn.prepareStatement(strSQL);
      // 4. 设置占位符的值
      pstmt.setString(1, username);
      pstmt.setString(2, password);
      // 5. 执行SQL,返回结果集
      ResultSet rs = pstmt.executeQuery();
      // 6. 判断结果集是否有记录
      if (rs.next()) {
      // 实例化用户
      user = new User();
      // 利用当前记录各字段值设置用户实体属性
      user.setId(rs.getInt(“id”));
      user.setUsername(rs.getString(“username”));
      user.setPassword(rs.getString(“password”));
      user.setTelephone(rs.getString(“telephone”));
      user.setRegisterTime(rs.getTimestamp(“register_time”));
      }
      } catch (SQLException e) {
      e.printStackTrace();
      } finally {
      // 关闭数据库连接
      ConnectionManager.closeConnection(conn);
      }

      // 返回用户对象
      return user;
      }
      }

2.创建一个测试类TestUserImpl
在这里插入图片描述
代码如下:

package net.zxk.student.test;
import net.zxk.student.bean.User;
import net.zxk.student.dao.UserDao;
import net.zxk.student.dao.impl.UserDaoImpl;
import org.junit.Test;

public class TestUserDaoImpl {
@Test
public void testFindById() {
UserDao dao = new UserDaoImpl();
User user = dao.findById(1);
System.out.println(user);
}

@Test
public void testLogin() {
    UserDao dao = new UserDaoImpl();
    String username, password;

    username = "admin";
    password = "12345";
    User user = dao.login(username, password);
    if (user != null) {
        System.out.println("恭喜,用户名与密码正确,登录成功!");
    } else {
        System.out.println("遗憾,用户名或密码错误,登录失败!");
    }
}
@Test
public void testDeleteById(){
    UserDao dao = new UserDaoImpl();
    String id="181010023";
    int count =dao.deleteById(1);
    if(count>0){
        System.out.println("恭喜,学生记录删除成功!");
    }else{
        System.out.println("遗憾,学生记录删除失败!");
    }
}

}

3.创建一个包 service ,在这个包下面再创建一个impl,再创建几个接口在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.代码如下

package net.zxk.student.service.impl;

import net.zxk.student.bean.College;
import net.zxk.student.dao.CollegeDao;
import net.zxk.student.dao.impl.CollegeDaoImpl;
import net.zxk.student.service.CollegeService;

public class CollegeServiceImpl implements CollegeService {
/**
* 声明学校数据访问对象
*/
private CollegeDao collegeDao = new CollegeDaoImpl();

@Override
public College findCollegeById(int id) {
    return collegeDao.findById(id);
}

@Override
public int updateCollege(College college) {
    return collegeDao.update(college);
}

}
5.再创建一个测试一下结果
在这里插入图片描述
代码如下
package net.zxk.student.test;

import net.zxk.student.bean.College;
import net.zxk.student.dao.CollegeDao;
import net.zxk.student.dao.impl.CollegeDaoImpl;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
//import org.junit.Before;
//import org.junit.Test;

/**

  • 功能:测试学校数据访问接口实现类

*/
public class TestCollegeDaoImpl {
@Before
public void beforeTest(){
System.out.println(“单元测试开始了”);
}
@Test
public void testFindByID(){
CollegeDao dao=new CollegeDaoImpl();
College college=dao.findById(1);
System.out.println(college );

}
@Test
public void testUpdate(){
    CollegeDao dao =new CollegeDaoImpl();
    College college =dao.findById(1);
    college .setPresident("王洪礼");
    dao.update(college);
    college =dao.findById(1);
    System.out.println(college);
}
@After
public void afterTest(){
    System.out.println("单元测试结束了");
}

}

6.在这里插入图片描述

在这里插入图片描述
package net.zxk.student.service.impl;

import net.zxk.student.bean.Status;
import net.zxk.student.dao.StatusDao;
import net.zxk.student.dao.impl.StatusDaoImpl;
import net.zxk.student.service.StatusService;

public class StatusServiceImpl implements StatusService {
/**
* 声明状态数据访问对象
*/
private StatusDao statusDao = new StatusDaoImpl();

@Override
public Status findStatusById(int id) {
    return statusDao.findById(id);
}

@Override
public int updateStatus(Status status) {
    return statusDao.update(status);
}

}

package net.zxk.student.test;

import net.zxk.student.bean.Status;
import net.zxk.student.service.StatusService;
import net.zxk.student.service.impl.StatusServiceImpl;
import org.junit.Test;

public class TestStatusServiceImpl {
@Test
public void testFindStatusServiceImpl(){
StatusService service=new StatusServiceImpl();
Status status=service.findStatusById(1);
System.out.println(status);
}
@Test
public void testUpsate(){
StatusService service=new StatusServiceImpl();
Status status=service.findStatusById(1);
status.setAuthor(“无心剑”);
status.setTelephone(“15265628765”);
int count=service.updateStatus(status);
if(count>0){
System.out.println(“恭喜,状态记录更新成功!”);
status=service.findStatusById(1);
System.out.println(status);
}else{
System.out.println(“遗憾,记录更新失败!”);
}
}

}

7.在这里插入图片描述

package net.zxk.student.service.impl;

import java.util.List;

import net.zxk.student.bean.User;
import net.zxk.student.dao.UserDao;
import net.zxk.student.dao.impl.UserDaoImpl;
import net.zxk.student.service.UserService;

/**

  • 功能:用户服务接口实现类

  • 作者:

  • 日期:2019年6月19日
    /
    public class UserServiceImpl implements UserService {
    /
    *

    • 声明用户数据访问对象
      */
      private UserDao userDao = new UserDaoImpl();

    @Override
    public int addUser(User user) {
    return userDao.insert(user);
    }

    @Override
    public int deleteUserById(int id) {
    return userDao.deleteById(id);
    }

    @Override
    public List findAllUsers() {
    return userDao.findAll();
    }

    @Override
    public User findUserById(int id) {
    return userDao.findById(id);
    }

    @Override
    public User login(String username, String password) {
    return userDao.login(username, password);
    }

    @Override
    public int updateUser(User user) {
    return userDao.update(user);
    }

}

在这里插入图片描述
代码如下:
package net.zxk.student.test;

import net.zxk.student.bean.College;
import net.zxk.student.bean.User;
import net.zxk.student.service.CollegeService;
import net.zxk.student.service.UserService;
import net.zxk.student.service.impl.CollegeServiceImpl;
import net.zxk.student.service.impl.UserServiceImpl;
import org.junit.Test;

public class TestUserServiceImpl {
@Test
public void testLogin(){
UserService service=new UserServiceImpl();
String username,password;

    username="12345";
    password="1234";
    User user=service.login(username,password);
    if(user !=null){
        System.out.println("恭喜,用户名与密码正确,登录成功!");

    }else{
        System.out.println("遗憾,用户名或密码错误,登录失败!");
    }
}
@Test
public void testUpdateUser(){
   UserService service=new UserServiceImpl();
    User user=service.findUserById(1);

// user.setRegisterTime();
user.setTelephone(“3152639”);
int count=service.updateUser(user );
if(count>0){
System.out.println(“恭喜,学校记录更新成功!”);

        System.out.println(user);
    }else{
        System.out.println("遗憾,学校记录更新失败!");
    }
}

}

package cn.com.dao.chivementdao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import cn.com.util.DBConnection; import cn.com.util.DBSql; import cn.com.vo.chivementvo.ChivementVo; public class ExamDao { private Connection conn = DBConnection.getConnectionOracle(); private ChivementVo examVo; public ExamDao() { } public ExamDao(ChivementVo examVo) { super(); this.examVo = examVo; } /** * 全部查询 */ public Object[][] selectAll() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_ALL); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumberAll(DBSql.SELECT_ALL_COUNT)][max]; while (rs.next()) { for (int j = 0; j < max; j++) { date[i][j] = rs.getObject(j + 1); } i++; } // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 根据学号查询 */ public Object[][] selectBySid() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_BY_S_ID); ps.setInt(1, examVo.getS_id()); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumber(DBSql.SELECT_BY_S_ID_COUNT, examVo .getS_id())][max]; while (rs.next()) { for (int j = 0; j < max; j++) { date[i][j] = rs.getObject(j + 1); } i++; } // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 根据组号查询 */ public Object[][] selectByGid() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_BY_G_ID); ps.setInt(1, examVo.getG_id()); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumber(DBSql.SELECT_BY_G_ID_COUNT, examVo .getG_id())][max]; while (rs.next()) { for (int j = 0; j < max; j++) { date[i][j] = rs.getObject(j + 1); } i++; } // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 根据课程号查询 */ public Object[][] selectByCid() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_BY_C_ID); ps.setInt(1, examVo.getC_id()); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumber(DBSql.SELECT_BY_C_ID_COUNT, examVo .getC_id())][max]; while (rs.next()) { for (int j = 0; j < max; j++) { // System.out.println( examVo.getG_id()); date[i][j] = rs.getObject(j+1); } i++; } // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 根据姓名模糊查询 * * @return */ public Object[][] selectByName() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_BY_S_NAME); ps.setString(1, examVo.getS_name()); ps.setString(2, "%" + examVo.getS_name() + "%"); ps.setString(3, "%" + examVo.getS_name()); ps.setString(4, examVo.getS_name() + "%"); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumberByName(DBSql.SELECT_BY_S_NAME_COUNT, examVo.getS_name())][max]; while (rs.next()) { for (int j = 0; j < max; j++) { date[i][j] = rs.getObject(j + 1); } i++; } } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 根据课程名称模糊查询 * * @return */ public Object[][] selectByClassName() { Object date[][] = null; int max = 0; int i = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.SELECT_BY_CLASS_NAME); ps.setString(1, examVo.getClass_name()); ps.setString(2, "%" + examVo.getClass_name() + "%"); ps.setString(3, "%" + examVo.getClass_name()); ps.setString(4, examVo.getClass_name() + "%"); rs = ps.executeQuery(); // 得到列数 max = rs.getMetaData().getColumnCount(); date = new Object[getnumberByName(DBSql.SELECT_BY_CLASS_COUNT, examVo.getClass_name())][max]; while (rs.next()) { for (int j = 0; j < max; j++) { date[i][j] = rs.getObject(j + 1); } i++; } } catch (SQLException e) { e.printStackTrace(); } return date; } /** * 修改选中学生的成绩 * */ public void updatSelectClass() { PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(DBSql.UPDATE_EXAM_BY_STUID); ps.setInt(1, examVo.getClassExamChivement()); ps.setInt(2, examVo.getS_id()); ps.setInt(3, examVo.getC_id()); ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } /** * 得到所有课程号和课程名 * * @return */ public String[] getClassNoName() { String[] classNoName = null; PreparedStatement ps = null; ResultSet rs = null; int j = 0; try { int i = getnumberAll(DBSql.SELECT_CLASS_NAME_COUNT); classNoName = new String[i + i]; ps = conn.prepareStatement(DBSql.SELECT_CLASS_NAME); rs = ps.executeQuery(); while (rs.next()) { classNoName[j] = rs.getString(1); classNoName[j + i] = rs.getString(2); j++; } } catch (SQLException e) { e.printStackTrace(); } return classNoName; } /** * 根据科目修改成绩 查询学号 姓名 成绩 * */ public void SelectClassStuName() { int i = 0; PreparedStatement ps = null; ResultSet rs = null; int j = getnumberBySelectClassName( DBSql.SELECT_CLASS_STU_SNO_SNAME_EXAM_COUNT, examVo.getC_id()); int[] sNum = new int[j]; String[] sName = new String[j]; int[] classExam = new int[j]; try { ps = conn.prepareStatement(DBSql.SELECT_CLASS_STU_SNO_SNAME_EXAM); ps.setInt(1, examVo.getC_id()); rs = ps.executeQuery(); while (rs.next()) { sNum[i] = rs.getInt(1); sName[i] = rs.getString(2); classExam[i] = rs.getInt(3); i++; } } catch (SQLException e) { e.printStackTrace(); } examVo.setSid(sNum); examVo.setSname(sName); examVo.setClassExam(classExam); } /** * 根据科目修改成绩 查询学号 姓名 成绩 后修改成绩 * */ public void UpdateClassStuName() { // int i = 0; PreparedStatement ps = null; ResultSet rs = null; int j = getnumberBySelectClassName( DBSql.SELECT_CLASS_STU_SNO_SNAME_EXAM_COUNT, examVo.getC_id()); try { ps = conn.prepareStatement(DBSql.UPDATE_CHIVEMENT_BY_CLASS); for(int i =0;i<j;i++){ ps.setInt(1, examVo.getClassExam()[i]); ps.setInt(2, examVo.getSid()[i]); ps.setInt(3, examVo.getC_id()); ps.executeUpdate(); } } catch (SQLException e) { e.printStackTrace(); } } /** * 全部查询获得行数 * * @return */ public int getnumberAll(String str) { int number = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(str); rs = ps.executeQuery(); rs.next(); number = rs.getInt(1); // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return number; } /** * 根据学号 根据组号 根据课程号查询 获得行数 * * @return */ public int getnumber(String str, int i) { int number = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(str); ps.setInt(1, i); rs = ps.executeQuery(); rs.next(); number = rs.getInt(1); // rs.close(); // ps.close(); // conn.close(); } catch (SQLException e) { e.printStackTrace(); } return number; } /** * 根据姓名 课程名 查询 获得行数 * */ public int getnumberByName(String str, String i) { int number = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(str); ps.setString(1, i); ps.setString(2, "%" + i + "%"); ps.setString(3, "%" + i); ps.setString(4, i + "%"); rs = ps.executeQuery(); rs.next(); number = rs.getInt(1); } catch (SQLException e) { e.printStackTrace(); } return number; } // /** // * 根据课程名查询 获得行数 // * // */ // // public int getnumberByClassName(String str, String i) { // int number = 0; // PreparedStatement ps = null; // ResultSet rs = null; // try { // ps = conn.prepareStatement(str); // ps.setString(1, i); // ps.setString(2, "%" + i + "%"); // ps.setString(3, "%" + i); // ps.setString(4, i + "%"); // rs = ps.executeQuery(); // rs.next(); // number = rs.getInt(1); // } catch (SQLException e) { // e.printStackTrace(); // } // return number; // } /** * * 根据课程名修改成绩获得行数 * * @param str * @param i * @return */ public int getnumberBySelectClassName(String str, int i) { int number = 0; PreparedStatement ps = null; ResultSet rs = null; try { ps = conn.prepareStatement(str); ps.setInt(1, i); rs = ps.executeQuery(); rs.next(); number = rs.getInt(1); } catch (SQLException e) { e.printStackTrace(); } return number; } }
### 学生信息管理系统 Java 实训 第三天日志 示例 #### ### 1. 系统功能扩展与优化 在学生信息管理系统的开发中,第三天的主要任务是扩展系统的功能模块并进行性能优化。新增了多用户权限管理和批量导入学生信息的功能。通过设计`RoleService`类实现了对不同角色(如管理员、教师和学生)的权限控制[^1]。代码示例如下: ```java @Service public class RoleService { @Autowired private RoleMapper roleMapper; public List<String> getPermissionsByRole(String role) { return roleMapper.selectPermissions(role); } } ``` 此外,为了支持批量导入学生信息,引入了Apache POI库来处理Excel文件的读取和解析。以下为实现批量导入的核心代码: ```java public void importStudentsFromExcel(String filePath) throws IOException { FileInputStream file = new FileInputStream(new File(filePath)); Workbook workbook = new XSSFWorkbook(file); Sheet sheet = workbook.getSheetAt(0); for (Row row : sheet) { if (row.getRowNum() == 0) continue; // 跳过表头 Student student = new Student(); student.setName(row.getCell(0).getStringCellValue()); student.setGender(row.getCell(1).getStringCellValue()); student.setMajor(row.getCell(2).getStringCellValue()); studentMapper.insertStudent(student); } workbook.close(); file.close(); } ``` #### ### 2. 数据安全与验证机制 为了提高系统的安全性,实施了输入数据的校验机制,并使用Spring Security框架增强了用户认证和授权功能。通过配置`WebSecurityConfigurerAdapter`类,确保只有经过身份验证的用户才能访问敏感操作[^2]。示例代码如下: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") // 限制管理员页面访问 .antMatchers("/teacher/**").hasRole("TEACHER") // 限制教师页面访问 .anyRequest().authenticated() .and() .formLogin().permitAll() .and() .logout().permitAll(); } } ``` #### ### 3. 用户界面改进 在前端界面的设计上,采用Swing构建了更加友好的图形化用户界面(GUI)。通过增加搜索框和分页功能,提升了用户体验。以下是实现分页查询的代码片段: ```java public List<Student> getStudentsByPage(int page, int pageSize) { int offset = (page - 1) * pageSize; return studentMapper.selectStudentsByPage(offset, pageSize); } ``` 同时,还添加了导出功能,允许用户将查询结果导出为PDF或Excel格式。使用iText库生成PDF文件的示例如下: ```java public void exportToPdf(List<Student> students, String outputPath) throws DocumentException, IOException { Document document = new Document(); PdfWriter.getInstance(document, new FileOutputStream(outputPath)); document.open(); PdfPTable table = new PdfPTable(3); // 创建表格 table.addCell("姓名"); table.addCell("性别"); table.addCell("专业"); for (Student student : students) { table.addCell(student.getName()); table.addCell(student.getGender()); table.addCell(student.getMajor()); } document.add(table); document.close(); } ``` #### ### 4. 性能优化与测试 针对系统性能进行了全面优化,包括数据库索引的创建和SQL语句的优化。通过JUnit编写了详细的单元测试用例,确保各模块的功能正确性。例如,对批量导入功能的测试代码如下: ```java @Test public void testImportStudentsFromExcel() throws IOException { String filePath = "students.xlsx"; studentService.importStudentsFromExcel(filePath); List<Student> importedStudents = studentMapper.selectAllStudents(); assertNotNull(importedStudents); assertTrue(importedStudents.size() > 0); } ``` #### ### 5. 总结与反思 通过实训第三天的工作,进一步完善了学生信息管理系统的功能模块,特别是在多用户权限管理和数据安全性方面取得了显著进展[^3]。未来的工作重点将放在系统的部署和上线准备上,同时继续优化用户体验。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值