一、实验目的及要求
1.1实验目的
- · 掌握Java GUI编程技术,了解Swing框架的使用。
- · 掌握MySQL数据库的基本操作,了解如何在Java中连接和操作数据库。
- · 掌握用户权限管理的基本概念和实现方法。
- · 提升综合运用所学知识设计和实现一个完整应用系统的能力。
- · 掌握用户权限管理的基本概念和实现方法。
- · 掌握MySQL数据库的基本操作,了解如何在Java中连接和操作数据库。
1.2实验要求
- · 设计并实现一个学生管理系统,包含学生信息的录入、修改、删除、查询和统计功能。
- · 实现用户权限管理,只有经过身份验证的用户才能进行操作。
- · 提供友好的人机界面,包括登录界面和功能菜单。
- · 使用MySQL数据库存储和管理学生信息。
- · 界面美观,操作简便。
二、系统设计
2.1系统总体设计
主要功能模块:
- 用户登录与注册
- 学生信息管理(录入、修改、删除、查询)
- 信息统计
- 用户权限管理
2.2 系统详细设计
2.2.1 数据库设计
使用MySQL数据库,包含两个主要表:
-
users
表:存储用户信息(用户ID、用户名、密码等)。 -
students
表:存储学生信息(学生ID、姓名、年龄、性别、班级等)。2.2.2 用户界面设计
使用Java Swing框架,设计主要界面如下:
-
1.登录界面
-
包含用户名和密码输入框,登录按钮。
-
2.主界面
- 包含功能菜单(信息录入、信息修改、信息删除、信息查询、信息统计),显示学生信息的表格。
3.信息录入界面:
包含学生信息输入框(姓名、年龄、性别、班级),提交按钮。
4.信息修改界面:
显示所有学生信息的表格,点击某一条记录弹出详细信息修改窗口
5.信息删除界面:
显示所有学生信息的表格,选择并删除指定记录。
6.信息查询界面:
包含查询输入框和按钮,显示查询结果的表格。
7.信息统计界面:
显示学生人数统计信息。
2.2.3 控制器设计
控制器负责处理用户操作,并与模型进行交互,实现各项功能:
1.登录功能:
验证用户身份。
如果如果输入的账号密码在数据库的user表中存在,就可以登录进去
反之
2.注册功能:
添加用户
会将注册成功的用户直接添加到数据库的表格中
3.信息录入功能:
获取用户输入并存储到数据库。
4.信息修改功能:
获取用户选择的记录,弹出修改窗口,更新数据库。
5.信息删除功能:
获取用户选择的记录,删除数据库中的记录。
6.信息查询功能:
根据用户输入的关键词查询数据库,更新表格显示。
7.信息统计功能:
查询数据库中的学生人数,并显示结果。
三、实验结果
· 实现了学生管理系统的主要功能,包括用户登录、学生信息录入、修改、删除、查询和统计。
· 界面美观友好,操作简便。
· 系统能够根据用户输入的关键词查询学生信息,并在表格中显示结果。
· 系统在操作过程中能够正确处理用户输入,并与数据库进行交互,确保数据的一致性和完整性。
四、总结分析
通过本次实验,掌握了Java GUI编程和MySQL数据库操作的基本技能,了解了如何将两者结合起来实现一个完整的应用系统。在实现过程中,遇到了一些问题,比如界面布局调整、事件处理等,通过查阅资料和调试,最终得以解决。整体来说,本次实验达到了预期的目的和要求,提高了综合运用所学知识解决实际问题的能力。
五、附录代码
Student类
public class Student {
private int id;
private String name;
private int age;
private String gender;
private String studentClass;
public Student(int id, String name, int age, String gender,String studentClass) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.studentClass=studentClass;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getStudentClass() {
return studentClass;
}
public void setStudentClass(String studentClass) {
this.studentClass = studentClass;
}
}
Database类
public class Database {
private Connection connection;
public Connection getConnection() {
return connection;
}
public List<Student> getAllStudents() {
List<Student> students = new ArrayList<>();
String query = "SELECT * FROM students";
try {
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
String gender = resultSet.getString("gender");
String studentClass = resultSet.getString("class");
students.add(new Student(id, name, age, gender, studentClass));
}
} catch (SQLException e) {
e.printStackTrace();
}
return students;
}
public int getStudentCount() {
String query = "SELECT COUNT(*) AS count FROM students";
try {
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
return resultSet.getInt("count");
}
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
// 连接数据库
public Database() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/studentdb", "root", "a123");
} catch (Exception e) {
e.printStackTrace();
}
}
// 关闭数据库连接
public void close() {
try {
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
// 添加学生信息
public void addStudent(Student student) {
String query = "INSERT INTO students (id, name, age, gender, class) VALUES (?, ?, ?, ?, ?)";
try {
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setInt(1, student.getId());
preparedStatement.setString(2, student.getName());
preparedStatement.setInt(3, student.getAge());
preparedStatement.setString(4, student.getGender());
preparedStatement.setString(5, student.getStudentClass());
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 删除学生信息
public void deleteStudent(int studentId) {
String query = "DELETE FROM students WHERE id = ?";
try {
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setInt(1, studentId);
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 查询学生信息
public Student getStudent(int id) {
String query = "SELECT * FROM students WHERE id = ?";
try {
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setInt(1, id);
ResultSet resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
String gender = resultSet.getString("gender");
String studentClass = resultSet.getString("class");
return new Student(id, name, age, gender, studentClass);
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
// 修改学生信息
public void updateStudent(Student student) {
String query = "UPDATE students SET name = ?, age = ?, gender = ?, class = ? WHERE id = ?";
try {
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, student.getName());
preparedStatement.setInt(2, student.getAge());
preparedStatement.setString(3, student.getGender());
preparedStatement.setString(4, student.getStudentClass());
preparedStatement.setInt(5, student.getId());
preparedStatement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 用户登录
public boolean authenticateUser(String username, String password) {
String query = "SELECT * FROM users WHERE username = ? AND password = ?";
try {
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
ResultSet resultSet = preparedStatement.executeQuery();
return resultSet.next();
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
//用户注册
public boolean registerUser(String username, String password) {
String query = "INSERT INTO users (username, password, role) VALUES (?, ?, 'admin')";
try {
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, username);
preparedStatement.setString(2, password);
int rowsInserted = preparedStatement.executeUpdate();
return rowsInserted > 0;
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
}
LoginGUI类:
public class LoginGUI extends JFrame {
private JLabel usernameLabel, passwordLabel;
private JTextField usernameField;
private JPasswordField passwordField;
private JButton loginButton;
private Database db;
private JButton registerButton;
Font font = new Font("Serif", Font.BOLD, 20);
public LoginGUI() {
db = new Database();
setTitle("学生管理系统 - 登录");
setSize(600, 400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(null);
int i=110,j=50;
usernameLabel = new JLabel("用户名:");
usernameLabel.setBounds(35+i, 30+j, 80, 25);
add(usernameLabel);
usernameLabel.setFont(font);
usernameField = new JTextField(20);
usernameField.setBounds(110+i, 30+j, 200, 25);
add(usernameField);
passwordLabel = new JLabel("密码:");
passwordLabel.setBounds(55+i, 70+j, 80, 25);
add(passwordLabel);
passwordLabel.setFont(font);
passwordField = new JPasswordField(20);
passwordField.setBounds(110+i, 70+j, 200, 25);
add(passwordField);
loginButton = new JButton("Login");
loginButton.setBounds(130+i, 110+j, 150, 30);
add(loginButton);
loginButton.setFont(font);
loginButton.setBackground(new Color(110, 150, 250));
loginButton.setForeground(Color.WHITE);
loginButton.setBorder(null);
registerButton = new JButton("注册");
registerButton.setBounds(130+i, 150+j, 150, 30);
add(registerButton);
registerButton.setFont(font);
registerButton.setBorder(null);
ImageIcon image = new ImageIcon("image/m_Loginimage.jpg");
// 创建一个标签来展示图片
JLabel label = new JLabel(image);
// 将标签的布局设置为null,这样我们可以手动设置图片的位置
label.setLayout(null);
// 设置标签的大小,使其覆盖整个窗口
label.setBounds(0, 0, 600, 400);
// 将标签添加到窗口的内容面板中
this.getContentPane().add(label);
// 设置窗口的其他属性,如大小、位置等
this.setSize(image.getIconWidth(), image.getIconHeight());
this.setVisible(true);
loginButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String username = usernameField.getText();
String password = new String(passwordField.getPassword());
if (db.authenticateUser(username, password)) {
new MainGUI();
dispose();
} else {
JOptionPane.showMessageDialog(null, "用户名或密码错误");
}
}
});
registerButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new RegisterDialog(LoginGUI.this);
}
});
setVisible(true);
setLocationRelativeTo(null);
}
public static void main(String[] args) {
new LoginGUI();
}
}
RegisterDialog类:
public class RegisterDialog extends JDialog {
private JTextField usernameField;
private JPasswordField passwordField;
private JButton registerButton;
private Database db;
public RegisterDialog(JFrame parent) {
super(parent, "注册", true);
db = new Database();
setSize(300, 200);
setLocationRelativeTo(parent);
setLayout(null);
JLabel usernameLabel = new JLabel("用户名:");
usernameLabel.setBounds(30, 30, 80, 25);
add(usernameLabel);
usernameField = new JTextField(20);
usernameField.setBounds(110, 30, 150, 25);
add(usernameField);
JLabel passwordLabel = new JLabel("密码:");
passwordLabel.setBounds(30, 70, 80, 25);
add(passwordLabel);
passwordField = new JPasswordField(20);
passwordField.setBounds(110, 70, 150, 25);
add(passwordField);
registerButton = new JButton("注册");
registerButton.setBounds(110, 110, 80, 25);
add(registerButton);
registerButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String username = usernameField.getText();
String password = new String(passwordField.getPassword());
if (username.isEmpty() || password.isEmpty()) {
JOptionPane.showMessageDialog(RegisterDialog.this, "请输入用户名和密码");
} else {
boolean success = db.registerUser(username, password);
if (success) {
JOptionPane.showMessageDialog(RegisterDialog.this, "注册成功");
dispose();
} else {
JOptionPane.showMessageDialog(RegisterDialog.this, "注册失败,请重试");
}
}
}
});
setVisible(true);
}
}
MainGUI类:
public class MainGUI extends JFrame {
private JMenuBar menuBar;
private JMenu fileMenu, editMenu;
private JMenuItem addMenuItem, editMenuItem, deleteMenuItem, searchMenuItem, statsMenuItem, logoutMenuItem;
private JTable table;
private DefaultTableModel tableModel;
private JScrollPane scrollPane;
private Database db;
private void loadStudentData(DefaultTableModel tableModel) {
tableModel.setRowCount(0); // 清空表格数据
List<Student> students = db.getAllStudents();
for (Student student : students) {
Object[] row = {student.getId(), student.getName(), student.getAge(), student.getGender(), student.getStudentClass()};
tableModel.addRow(row);
}
}
private void showEditStudentWindow(DefaultTableModel tableModel) {
JFrame editFrame = new JFrame("修改学生信息");
editFrame.setSize(600, 400);
editFrame.setLocationRelativeTo(null);
editFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
JPanel editPanel = new JPanel(new BorderLayout());
JTable editTable = new JTable();
editTable.setModel(tableModel);
JScrollPane scrollPane = new JScrollPane(editTable);
editPanel.add(scrollPane, BorderLayout.CENTER);
JPanel searchPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
JTextField searchField = new JTextField(15);
JButton searchButton = new JButton("查询");
searchButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String keyword = searchField.getText();
if (!keyword.isEmpty()) {
List<Student> searchResult = searchStudents(keyword);
updateTable(tableModel, searchResult);
} else {
loadStudentData(tableModel);
}
}
});
searchPanel.add(new JLabel("关键词:"));
searchPanel.add(searchField);
searchPanel.add(searchButton);
editPanel.add(searchPanel, BorderLayout.SOUTH);
editTable.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
int selectedRow = editTable.getSelectedRow();
int studentId = (int) editTable.getValueAt(selectedRow, 0);
Student student = db.getStudent(studentId);
if (student != null) {
showEditStudentDetailWindow(student, tableModel);
}
}
});
editFrame.add(editPanel);
editFrame.setVisible(true);
}
六、创建数据库说明
JDK:17
数据库需要自己创建:
创建方法:点击右上角有一个数据库
点击+号新建
找到MySQL
点击驱动程序,然后在左边这一列找到mysql
点击右边这个版本,找到8.0以上的版本,然后会自动下载
然后再点击上面的数据源
密码自己设置,其他按照下面的来,然后点击确定
先点击刚刚创建的数据源,然后再点击查询控制台也就是下面那个QL的图标,打开默认控制台就行了
然后输入代码
CREATE DATABASE studentdb;
USE studentdb;
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL, age INT NOT NULL,
gender VARCHAR(10) NOT NULL,
class VARCHAR(50) NOT NULL
);
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL
);
以下是数据创建(把之前的SQL代码删除在输入下面的)
INSERT INTO students (name, age, gender, class) VALUES
('Alice', 20, 'Female', 'Class 1'),
('Bob', 21, 'Male', 'Class 1'),
('Charlie', 22, 'Male', 'Class 2'),
('Diana', 20, 'Female', 'Class 2'),
('Eve', 23, 'Female', 'Class 3'),
('Frank', 21, 'Male', 'Class 3');
下面这个是账号和密码,需要写进数据库才能登录
INSERT INTO users (username, password) VALUES
('admin', 'admin123'),
('user1', 'password1');
比如账号是admin,密码是admin123