package com.student.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.student.entity.Student;
import com.student.util.DBUtil;
public class StudentDAO {
// 插入学生
public void insertStudent(Student student) {
String sql = "INSERT INTO students (sid, name, age, score) VALUES (?, ?, ?, ?)";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, student.getSid());
pstmt.setString(2, student.getName());
pstmt.setInt(3, student.getAge());
pstmt.setDouble(4, student.getScore());
pstmt.executeUpdate();
} catch (SQLException e) {
System.err.println("插入学生信息时出现错误: " + e.getMessage());
}
}
// 获取所有学生
public List<Student> getAllStudents() {
List<Student> students = new ArrayList<>();
String sql = "SELECT * FROM students";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
students.add(extractStudentFromResultSet(rs));
}
} catch (SQLException e) {
e.printStackTrace();
}
return students;
}
// 删除学生(修改方法名)
public void deleteStudent(String sid) { // 这里修改了方法名
String sql = "DELETE FROM students WHERE sid = ?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, sid);
int rowsAffected = pstmt.executeUpdate();
if (rowsAffected == 0) {
System.err.println("未找到学号为 " + sid + " 的学生");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
// 更新学生信息
public void updateStudent(Student student) {
String sql = "UPDATE students SET name = ?, age = ?, score = ? WHERE sid = ?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, student.getName());
pstmt.setInt(2, student.getAge());
pstmt.setDouble(3, student.getScore());
pstmt.setString(4, student.getSid());
int rowsAffected = pstmt.executeUpdate();
if (rowsAffected == 0) {
System.err.println("未找到学号为 " + student.getSid() + " 的学生");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
// 搜索学生
public List<Student> searchStudents(String keyword) {
List<Student> students = new ArrayList<>();
String sql = "SELECT * FROM students WHERE sid LIKE ? OR name LIKE ?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
String searchPattern = "%" + keyword + "%";
pstmt.setString(1, searchPattern);
pstmt.setString(2, searchPattern);
try (ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
students.add(extractStudentFromResultSet(rs));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return students;
}
// 排序学生
public List<Student> getStudentsOrderBy(String field) {
List<Student> students = new ArrayList<>();
String validField = validateSortField(field);
String sql = "SELECT * FROM students ORDER BY " + validField;
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
students.add(extractStudentFromResultSet(rs));
}
} catch (SQLException e) {
e.printStackTrace();
}
return students;
}
// 根据ID获取学生
public Student getStudentById(String sid) {
String sql = "SELECT * FROM students WHERE sid = ?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, sid);
try (ResultSet rs = pstmt.executeQuery()) {
if (rs.next()) {
return extractStudentFromResultSet(rs);
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
// 验证排序字段(防止SQL注入)
private String validateSortField(String field) {
String[] validFields = {"sid", "name", "age", "score"};
for (String valid : validFields) {
if (valid.equalsIgnoreCase(field)) {
return valid;
}
}
return "sid"; // 默认值
}
// 从ResultSet提取学生对象(复用代码)
private Student extractStudentFromResultSet(ResultSet rs) throws SQLException {
String sid = rs.getString("sid");
String name = rs.getString("name");
int age = rs.getInt("age");
double score = rs.getDouble("score");
return new Student(sid, name, age, score);
}
}
package com.student.ui;
import com.student.dao.StudentDAO;
import com.student.entity.Student;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.util.List;
public class StudentGUI extends JFrame {
private JTable studentTable;
private DefaultTableModel tableModel;
private StudentDAO studentDAO = new StudentDAO();
private JTextField searchField;
private JComboBox<String> sortComboBox;
public StudentGUI() {
setTitle("学生信息管理系统");
setSize(900, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置淡蓝色背景
getContentPane().setBackground(new Color(230, 240, 255));
// 创建表格
String[] columns = {"学号", "姓名", "年龄", "成绩"};
tableModel = new DefaultTableModel(columns, 0) {
@Override
public boolean isCellEditable(int row, int column) {
return false; // 禁止表格直接编辑
}
};
studentTable = new JTable(tableModel);
studentTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// 创建功能面板
JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
controlPanel.setBackground(new Color(230, 240, 255));
// 搜索组件
searchField = new JTextField(15);
JButton searchBtn = new JButton("查找");
searchBtn.addActionListener(e -> searchStudents());
controlPanel.add(new JLabel("搜索:"));
controlPanel.add(searchField);
controlPanel.add(searchBtn);
// 排序组件
sortComboBox = new JComboBox<>(new String[]{"学号", "姓名", "年龄", "成绩"});
JButton sortBtn = new JButton("排序");
sortBtn.addActionListener(e -> sortStudents());
controlPanel.add(new JLabel("排序:"));
controlPanel.add(sortComboBox);
controlPanel.add(sortBtn);
// 操作按钮
JButton addBtn = new JButton("添加学生");
addBtn.addActionListener(e -> showAddDialog());
JButton editBtn = new JButton("修改");
editBtn.addActionListener(e -> showEditDialog());
JButton deleteBtn = new JButton("删除");
deleteBtn.addActionListener(e -> deleteStudent());
// 添加按钮到面板
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
buttonPanel.setBackground(new Color(230, 240, 255));
buttonPanel.add(addBtn);
buttonPanel.add(editBtn);
buttonPanel.add(deleteBtn);
// 主布局
JPanel mainPanel = new JPanel(new BorderLayout(10, 10));
mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
mainPanel.setBackground(new Color(230, 240, 255));
mainPanel.add(controlPanel, BorderLayout.NORTH);
mainPanel.add(new JScrollPane(studentTable), BorderLayout.CENTER);
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
setContentPane(mainPanel);
refreshTable();
}
// 添加学生对话框
private void showAddDialog() {
JDialog dialog = new JDialog(this, "添加学生", true);
dialog.setSize(300, 250);
dialog.setLayout(new BorderLayout());
dialog.getContentPane().setBackground(new Color(230, 240, 255));
JPanel formPanel = createFormPanel();
JButton saveBtn = new JButton("保存");
// 获取表单字段
JTextField sidField = (JTextField) formPanel.getComponent(1);
JTextField nameField = (JTextField) formPanel.getComponent(3);
JTextField ageField = (JTextField) formPanel.getComponent(5);
JTextField scoreField = (JTextField) formPanel.getComponent(7);
saveBtn.addActionListener(e -> {
try {
Student student = new Student(
sidField.getText(),
nameField.getText(),
Integer.parseInt(ageField.getText()),
Double.parseDouble(scoreField.getText())
);
studentDAO.insertStudent(student);
refreshTable();
dialog.dispose();
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(this, "请输入有效的数字", "错误", JOptionPane.ERROR_MESSAGE);
}
});
dialog.add(formPanel, BorderLayout.CENTER);
dialog.add(saveBtn, BorderLayout.SOUTH);
dialog.setVisible(true);
}
// 修改学生对话框
private void showEditDialog() {
int selectedRow = studentTable.getSelectedRow();
if (selectedRow == -1) {
JOptionPane.showMessageDialog(this, "请先选择要修改的学生", "提示", JOptionPane.WARNING_MESSAGE);
return;
}
String sid = (String) tableModel.getValueAt(selectedRow, 0);
Student student = studentDAO.getStudentById(sid);
JDialog dialog = new JDialog(this, "修改学生信息", true);
dialog.setSize(300, 250);
dialog.setLayout(new BorderLayout());
dialog.getContentPane().setBackground(new Color(230, 240, 255));
JPanel formPanel = createFormPanel();
// 填充当前数据
((JTextField) formPanel.getComponent(1)).setText(student.getSid());
((JTextField) formPanel.getComponent(3)).setText(student.getName());
((JTextField) formPanel.getComponent(5)).setText(String.valueOf(student.getAge()));
((JTextField) formPanel.getComponent(7)).setText(String.valueOf(student.getScore()));
// 学号不可编辑
((JTextField) formPanel.getComponent(1)).setEditable(false);
JButton saveBtn = new JButton("保存");
saveBtn.addActionListener(e -> {
try {
student.setName(((JTextField) formPanel.getComponent(3)).getText());
student.setAge(Integer.parseInt(((JTextField) formPanel.getComponent(5)).getText()));
student.setScore(Double.parseDouble(((JTextField) formPanel.getComponent(7)).getText()));
studentDAO.updateStudent(student);
refreshTable();
dialog.dispose();
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(this, "请输入有效的数字", "错误", JOptionPane.ERROR_MESSAGE);
}
});
dialog.add(formPanel, BorderLayout.CENTER);
dialog.add(saveBtn, BorderLayout.SOUTH);
dialog.setVisible(true);
}
// 创建表单面板(复用)
private JPanel createFormPanel() {
JPanel formPanel = new JPanel(new GridLayout(4, 2, 5, 10));
formPanel.setBackground(new Color(230, 240, 255));
formPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
formPanel.add(new JLabel("学号:"));
formPanel.add(new JTextField());
formPanel.add(new JLabel("姓名:"));
formPanel.add(new JTextField());
formPanel.add(new JLabel("年龄:"));
formPanel.add(new JTextField());
formPanel.add(new JLabel("成绩:"));
formPanel.add(new JTextField());
return formPanel;
}
// 删除学生
private void deleteStudent() {
int selectedRow = studentTable.getSelectedRow();
if (selectedRow == -1) {
JOptionPane.showMessageDialog(this, "请先选择要删除的学生", "提示", JOptionPane.WARNING_MESSAGE);
return;
}
int confirm = JOptionPane.showConfirmDialog(
this,
"确定要删除该学生吗?",
"确认删除",
JOptionPane.YES_NO_OPTION
);
if (confirm == JOptionPane.YES_OPTION) {
String sid = (String) tableModel.getValueAt(selectedRow, 0);
studentDAO.deleteStudent(sid);
refreshTable();
}
}
// 搜索学生
private void searchStudents() {
String keyword = searchField.getText().trim();
if (keyword.isEmpty()) {
refreshTable();
return;
}
List<Student> students = studentDAO.searchStudents(keyword);
updateTable(students);
}
// 排序学生
private void sortStudents() {
String sortBy = (String) sortComboBox.getSelectedItem();
String sortField = "";
switch (sortBy) {
case "学号": sortField = "sid"; break;
case "姓名": sortField = "name"; break;
case "年龄": sortField = "age"; break;
case "成绩": sortField = "score"; break;
}
List<Student> students = studentDAO.getStudentsOrderBy(sortField);
updateTable(students);
}
// 刷新表格
private void refreshTable() {
List<Student> students = studentDAO.getAllStudents();
updateTable(students);
}
// 更新表格数据
private void updateTable(List<Student> students) {
tableModel.setRowCount(0);
for (Student s : students) {
tableModel.addRow(new Object[]{s.getSid(), s.getName(), s.getAge(), s.getScore()});
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
StudentGUI gui = new StudentGUI();
gui.setVisible(true);
});
}
}
请根据这两个代码修改
最新发布