本次实训要求使用Java面向对象、MySQL数据库和Swing图形组件简单实现xxxx系统的增删改查操作(比如学生信息管理系统)。
实训目标
- 掌握面向对象编程的基本概念:类、对象、继承、封装和多态。
- 学习使用Java进行数据库操作。
- 熟悉MySQL数据库的使用和管理。
- 学习使用Swing组件构建图形用户界面。
实训环境
- Java开发环境(JDK和IDE,如Eclipse或IntelliJ IDEA)。
- MySQL数据库服务器(5.x,8.x)。
实训内容
第1部分:需求分析
- 确定系统功能:添加、查询、修改、删除书籍信息。
- 确定用户界面需求。
第2部分:系统设计
- 数据库设计 E-R模型:
- 设计用户信息表结构。
用户(编号,名称,密码)
- 设计书籍信息表结构。
书籍(编号,书名,作者,年份)
- 面向对象设计:
- 定义数据库操作类(DatabaseConnection10),封装数据库连接和SQL操作。
- 创建用户登录类,使其登录进行一切操作。
- 创建dao10包,包括图形用户界面的增删改查方法,在其中创建UserDAO10类和BookDAO10类,分别用于处理用户和图书相关的数据库操作。
第3部分:数据库实现
- 使用MySQL创建数据库和用户表和书籍信息表。
- SQL脚本
-- 创建数据库 CREATE DATABASE IF NOT EXISTS bookmanagement10; -- 选择数据库 USE bookmanagement10; -- 创建表 -- 插入用户数据 -- 插入图书数据 INSERT INTO books (title, author, year) VALUES ('稻草人', '叶圣陶', 1922); |
第4部分:Java类实现
1、数据库操作类(DatabaseConnection10):
- 连接数据库。
package utils10; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * * author liyating * */ public class DatabaseConnection10 { private static final String URL = "jdbc:mysql://localhost:3306/bookmanagement10"; private static final String USER = "root"; private static final String PASSWORD = "lyt6661314520"; public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } } |
- 用户登录类(LoginFrame10)
- 使其登录进行一切操作。
package JFrame10; import dao10.UserDAO10; /** * author liyating */ import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class LoginFrame10 extends JFrame { private JTextField usernameField; // 用户名输入框 private JPasswordField passwordField; // 密码输入框 public LoginFrame10() { // 设置窗口标题、大小和关闭操作 setTitle("Login"); setSize(300, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); // 窗口居中 JPanel panel = new JPanel(); add(panel); placeComponents(panel); // 添加组件到面板 setVisible(true); // 显示窗口 } private void placeComponents(JPanel panel) { panel.setLayout(null); // 用户名标签和输入框 JLabel userLabel = new JLabel("User:"); userLabel.setBounds(10, 20, 80, 25); panel.add(userLabel); usernameField = new JTextField(20); usernameField.setBounds(100, 20, 165, 25); panel.add(usernameField); // 密码标签和输入框 JLabel passwordLabel = new JLabel("Password:"); passwordLabel.setBounds(10, 50, 80, 25); panel.add(passwordLabel); passwordField = new JPasswordField(20); passwordField.setBounds(100, 50, 165, 25); panel.add(passwordField); // 登录按钮 JButton loginButton = new JButton("Login"); loginButton.setBounds(10, 80, 80, 25); panel.add(loginButton); // 登录按钮的事件处理 loginButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { UserDAO10 userDAO10 = new UserDAO10(); boolean isValidUser = userDAO10.validateUser(usernameField.getText(), new String(passwordField.getPassword())); if (isValidUser) { dispose(); new MainFrame10(); } else { JOptionPane.showMessageDialog(null, "Invalid username or password"); } } }); } public static void main(String[] args) { new LoginFrame10(); // 启动登录界面 } } |
3、UserDAO10类:
- 处理用户相关的数据库操作。
package dao10; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import utils10.DatabaseConnection10; /** * * @author liyating * */ public class UserDAO10 { // 验证用户登录的方法 public boolean validateUser(String username, String password) { try { Connection connection = DatabaseConnection10.getConnection(); String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1, username); statement.setString(2, password); ResultSet resultSet = statement.executeQuery(); return resultSet.next(); } catch (SQLException e) { e.printStackTrace(); return false; } } } |
- BookDAO10类:
- 处理图书相关的数据库操作。
package dao10; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Vector; /** * author liyating */ import utils10.DatabaseConnection10; public class BookDAO10 { // 插入图书的方法 public void insertBook(String title, String author, int year) { try { Connection connection = DatabaseConnection10.getConnection(); String sql = "INSERT INTO books (title, author, year) VALUES (?, ?, ?)"; PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1, title); statement.setString(2, author); statement.setInt(3, year); statement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } // 查询所有图书的方法 public Vector<Vector<Object>> getAllBooks() { Vector<Vector<Object>> books = new Vector<>(); try { Connection connection = DatabaseConnection10.getConnection(); String sql = "SELECT * FROM books"; PreparedStatement statement = connection.prepareStatement(sql); ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { Vector<Object> book = new Vector<>(); book.add(resultSet.getInt("id")); book.add(resultSet.getString("title")); book.add(resultSet.getString("author")); book.add(resultSet.getInt("year")); books.add(book); } } catch (SQLException e) { e.printStackTrace(); } return books; } // 更新图书的方法 public void updateBook(int id, String title, String author, int year) { try { Connection connection = DatabaseConnection10.getConnection(); String sql = "UPDATE books SET title = ?, author = ?, year = ? WHERE id = ?"; PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1, title); statement.setString(2, author); statement.setInt(3, year); statement.setInt(4, id); statement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } // 删除图书的方法 public void deleteBook(int id) { try { Connection connection = DatabaseConnection10.getConnection(); String sql = "DELETE FROM books WHERE id = ?"; PreparedStatement statement = connection.prepareStatement(sql); statement.setInt(1, id); statement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } // 根据条件查询图书的方法 public Vector<Vector<Object>> searchBooks(String title, String author, String year) { Vector<Vector<Object>> books = new Vector<>(); try { Connection connection = DatabaseConnection10.getConnection(); String sql = "SELECT * FROM books WHERE title LIKE ? AND author LIKE ? AND year LIKE ?"; PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1, "%" + title + "%"); statement.setString(2, "%" + author + "%"); statement.setString(3, "%" + year + "%"); ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { Vector<Object> book = new Vector<>(); book.add(resultSet.getInt("id")); book.add(resultSet.getString("title")); book.add(resultSet.getString("author")); book.add(resultSet.getInt("year")); books.add(book); } } catch (SQLException e) { e.printStackTrace(); } return books; } } |
第5部分:用户界面实现:使用Swing组件实现以下界面:
- 主界面:包含菜单或按钮,用于访问其他界面。
package JFrame10; import dao10.BookDAO10; /** * author liyating */ import javax.swing.*; import javax.swing.table.DefaultTableModel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Vector; public class MainFrame10 extends JFrame { private JTable table; // 显示图书信息的表格 private DefaultTableModel model; // 表格模型 public MainFrame10() { // 设置窗口标题、大小和关闭操作 setTitle("Book Management"); setSize(600, 400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); // 窗口居中 JPanel panel = new JPanel(); add(panel); placeComponents(panel); // 添加组件到面板 setVisible(true); // 显示窗口 } private void placeComponents(JPanel panel) { panel.setLayout(null); // 添加图书按钮 JButton addButton = new JButton("Add Book"); addButton.setBounds(10, 10, 120, 25); panel.add(addButton); // 删除图书按钮 JButton deleteButton = new JButton("Delete Book"); deleteButton.setBounds(140, 10, 120, 25); panel.add(deleteButton); // 修改图书按钮 JButton editButton = new JButton("Edit Book"); editButton.setBounds(270, 10, 120, 25); panel.add(editButton); // 查询图书按钮 JButton searchButton = new JButton("Search Book"); searchButton.setBounds(400, 10, 120, 25); panel.add(searchButton); // 表格模型和表格 model = new DefaultTableModel(); table = new JTable(model); model.addColumn("ID"); model.addColumn("Title"); model.addColumn("Author"); model.addColumn("Year"); // 滚动面板,包含表格 JScrollPane scrollPane = new JScrollPane(table); scrollPane.setBounds(10, 50, 560, 300); panel.add(scrollPane); loadBooks(); // 加载图书信息 // 添加图书按钮的事件处理 addButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new AddBookFrame10(MainFrame10.this); // 打开添加图书界面 } }); // 删除图书按钮的事件处理 deleteButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int selectedRow = table.getSelectedRow(); if (selectedRow != -1) { int id = (int) model.getValueAt(selectedRow, 0); BookDAO10 bookDAO10 = new BookDAO10(); bookDAO10.deleteBook(id); // 删除选中的图书 loadBooks(); // 重新加载图书信息 } else { JOptionPane.showMessageDialog(null, "Please select a book to delete"); } } }); // 修改图书按钮的事件处理 editButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int selectedRow = table.getSelectedRow(); if (selectedRow != -1) { int id = (int) model.getValueAt(selectedRow, 0); String title = (String) model.getValueAt(selectedRow, 1); String author = (String) model.getValueAt(selectedRow, 2); int year = (int) model.getValueAt(selectedRow, 3); new EditBookFrame10(MainFrame10.this, id, title, author, year); // 打开修改图书界面 } else { JOptionPane.showMessageDialog(null, "Please select a book to edit"); } } }); // 查询图书按钮的事件处理 searchButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new SearchBookFrame10(); // 打开查询图书界面 } }); } // 加载图书信息的方法 public void loadBooks() { BookDAO10 bookDAO10 = new BookDAO10(); Vector<Vector<Object>> books = bookDAO10.getAllBooks(); model.setRowCount(0); // 清空表格 for (Vector<Object> book : books) { model.addRow(book); // 添加行到表格模型 } } } |
- 添加书籍页面:添加书籍相关信息。
package JFrame10; import dao10.BookDAO10; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * author liyating */ public class AddBookFrame10 extends JFrame { private JTextField titleField; // 图书标题输入框 private JTextField authorField; // 图书作者输入框 private JTextField yearField; // 出版年份输入框 private MainFrame10 mainFrame10; // 主界面引用 public AddBookFrame10(MainFrame10 mainFrame10) { this.mainFrame10 = mainFrame10; // 设置窗口标题、大小和关闭操作 setTitle("Add Book"); setSize(300, 200); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setLocationRelativeTo(null); // 窗口居中 JPanel panel = new JPanel(); add(panel); placeComponents(panel); // 添加组件到面板 setVisible(true); // 显示窗口 } private void placeComponents(JPanel panel) { panel.setLayout(null); // 图书标题标签和输入框 JLabel titleLabel = new JLabel("Title:"); titleLabel.setBounds(10, 20, 80, 25); panel.add(titleLabel); titleField = new JTextField(20); titleField.setBounds(100, 20, 165, 25); panel.add(titleField); // 图书作者标签和输入框 JLabel authorLabel = new JLabel("Author:"); authorLabel.setBounds(10, 50, 80, 25); panel.add(authorLabel); authorField = new JTextField(20); authorField.setBounds(100, 50, 165, 25); panel.add(authorField); // 出版年份标签和输入框 JLabel yearLabel = new JLabel("Year:"); yearLabel.setBounds(10, 80, 80, 25); panel.add(yearLabel); yearField = new JTextField(20); yearField.setBounds(100, 80, 165, 25); panel.add(yearField); // 添加图书按钮 JButton addButton = new JButton("Add"); addButton.setBounds(10, 110, 80, 25); panel.add(addButton); // 添加图书按钮的事件处理 addButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { addBook(); // 调用添加图书的方法 } }); } // 添加图书的方法 private void addBook() { try { String title = titleField.getText(); String author = authorField.getText(); int year = Integer.parseInt(yearField.getText()); BookDAO10 bookDAO10 = new BookDAO10(); bookDAO10.insertBook(title, author, year); // 更新主界面的图书列表 mainFrame10.loadBooks(); dispose(); // 关闭添加图书窗口 } catch (Exception ex) { ex.printStackTrace(); } } } |
- 查询书籍界面:输入查询条件,显示查询结果。
package JFrame10; import javax.swing.*; import javax.swing.table.DefaultTableModel; import utils10.DatabaseConnection10; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Vector; /** * * @author liyating * */ public class SearchBookFrame10 extends JFrame { private JTextField titleField; // 图书标题输入框 private JTextField authorField; // 图书作者输入框 private JTextField yearField; // 出版年份输入框 private JTable table; // 显示查询结果的表格 private DefaultTableModel model; // 表格模型 public SearchBookFrame10() { // 设置窗口标题、大小和关闭操作 setTitle("Search Book"); setSize(600, 400); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setLocationRelativeTo(null); // 窗口居中 JPanel panel = new JPanel(); add(panel); placeComponents(panel); // 添加组件到面板 setVisible(true); // 显示窗口 } private void placeComponents(JPanel panel) { panel.setLayout(null); // 图书标题标签和输入框 JLabel titleLabel = new JLabel("Title:"); titleLabel.setBounds(10, 20, 80, 25); panel.add(titleLabel); titleField = new JTextField(20); titleField.setBounds(100, 20, 165, 25); panel.add(titleField); // 图书作者标签和输入框 JLabel authorLabel = new JLabel("Author:"); authorLabel.setBounds(10, 50, 80, 25); panel.add(authorLabel); authorField = new JTextField(20); authorField.setBounds(100, 50, 165, 25); panel.add(authorField); // 出版年份标签和输入框 JLabel yearLabel = new JLabel("Year:"); yearLabel.setBounds(10, 80, 80, 25); panel.add(yearLabel); yearField = new JTextField(20); yearField.setBounds(100, 80, 165, 25); panel.add(yearField); // 查询按钮 JButton searchButton = new JButton("Search"); searchButton.setBounds(10, 110, 80, 25); panel.add(searchButton); // 表格模型和表格 model = new DefaultTableModel(); table = new JTable(model); model.addColumn("ID"); model.addColumn("Title"); model.addColumn("Author"); model.addColumn("Year"); // 滚动面板,包含表格 JScrollPane scrollPane = new JScrollPane(table); scrollPane.setBounds(10, 150, 560, 200); panel.add(scrollPane); // 查询按钮的事件处理 searchButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { searchBooks(); // 调用查询图书的方法 } }); } // 查询图书的方法 private void searchBooks() { try { // 获取数据库连接 Connection connection = DatabaseConnection10.getConnection(); // 构建查询SQL语句 String sql = "SELECT * FROM books WHERE title LIKE ? AND author LIKE ? AND year LIKE ?"; PreparedStatement statement = connection.prepareStatement(sql); statement.setString(1, "%" + titleField.getText() + "%"); statement.setString(2, "%" + authorField.getText() + "%"); statement.setString(3, "%" + yearField.getText() + "%"); ResultSet resultSet = statement.executeQuery(); model.setRowCount(0); // 清空表格 while (resultSet.next()) { Vector<Object> row = new Vector<>(); row.add(resultSet.getInt("id")); row.add(resultSet.getString("title")); row.add(resultSet.getString("author")); row.add(resultSet.getInt("year")); model.addRow(row); // 添加行到表格模型 } } catch (Exception ex) { ex.printStackTrace(); } } } |
- 修改书籍界面:选择书籍并修改其信息。
package JFrame10; import dao10.BookDAO10; /** * author liyating */ import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class EditBookFrame10 extends JFrame { private JTextField titleField; // 图书标题输入框 private JTextField authorField; // 图书作者输入框 private JTextField yearField; // 出版年份输入框 private int bookId; // 图书ID private MainFrame10 mainFrame10; // 主界面引用 public EditBookFrame10(MainFrame10 mainFrame10, int bookId, String title, String author, int year) { this.mainFrame10 = mainFrame10; this.bookId = bookId; // 设置窗口标题、大小和关闭操作 setTitle("Edit Book"); setSize(300, 200); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setLocationRelativeTo(null); // 窗口居中 JPanel panel = new JPanel(); add(panel); placeComponents(panel, title, author, year); // 添加组件到面板 setVisible(true); // 显示窗口 } private void placeComponents(JPanel panel, String title, String author, int year) { panel.setLayout(null); // 图书标题标签和输入框 JLabel titleLabel = new JLabel("Title:"); titleLabel.setBounds(10, 20, 80, 25); panel.add(titleLabel); titleField = new JTextField(20); titleField.setBounds(100, 20, 165, 25); titleField.setText(title); // 设置初始值 panel.add(titleField); // 图书作者标签和输入框 JLabel authorLabel = new JLabel("Author:"); authorLabel.setBounds(10, 50, 80, 25); panel.add(authorLabel); authorField = new JTextField(20); authorField.setBounds(100, 50, 165, 25); authorField.setText(author); // 设置初始值 panel.add(authorField); // 出版年份标签和输入框 JLabel yearLabel = new JLabel("Year:"); yearLabel.setBounds(10, 80, 80, 25); panel.add(yearLabel); yearField = new JTextField(20); yearField.setBounds(100, 80, 165, 25); yearField.setText(String.valueOf(year)); // 设置初始值 panel.add(yearField); // 修改图书按钮 JButton editButton = new JButton("Edit"); editButton.setBounds(10, 110, 80, 25); panel.add(editButton); // 修改图书按钮的事件处理 editButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { editBook(); // 调用修改图书的方法 } }); } // 修改图书的方法 private void editBook() { try { String title = titleField.getText(); String author = authorField.getText(); int year = Integer.parseInt(yearField.getText()); BookDAO10 bookDAO10 = new BookDAO10(); bookDAO10.updateBook(bookId, title, author, year); // 更新主界面的图书列表 mainFrame10.loadBooks(); dispose(); // 关闭修改图书窗口 } catch (Exception ex) { ex.printStackTrace(); } } } |
- 删除书籍界面:选择书籍并进行删除操作。
package JFrame10; import dao10.BookDAO10; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * * @author liyating * */ public class DeleteBookFrame10 extends JFrame { private JTextField idField; // 图书ID输入框 private MainFrame10 mainFrame; // 主界面引用 public DeleteBookFrame10(MainFrame10 mainFrame) { this.mainFrame = mainFrame; // 设置窗口标题、大小和关闭操作 setTitle("Delete Book"); setSize(300, 150); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setLocationRelativeTo(null); // 窗口居中 JPanel panel = new JPanel(); add(panel); placeComponents(panel); // 添加组件到面板 setVisible(true); // 显示窗口 } private void placeComponents(JPanel panel) { panel.setLayout(null); // 图书ID标签和输入框 JLabel idLabel = new JLabel("Book ID:"); idLabel.setBounds(10, 20, 80, 25); panel.add(idLabel); idField = new JTextField(20); idField.setBounds(100, 20, 165, 25); panel.add(idField); // 删除图书按钮 JButton deleteButton = new JButton("Delete"); deleteButton.setBounds(10, 60, 80, 25); panel.add(deleteButton); // 删除图书按钮的事件处理 deleteButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { deleteBook(); // 调用删除图书的方法 } }); } // 删除图书的方法 private void deleteBook() { try { int id = Integer.parseInt(idField.getText()); BookDAO10 bookDAO = new BookDAO10(); bookDAO.deleteBook(id); // 更新主界面的图书列表 mainFrame.loadBooks(); dispose(); // 关闭删除图书窗口 } catch (Exception ex) { ex.printStackTrace(); } } } |
第6部分:功能实现
- 实现各个界面的功能逻辑,包括事件监听和数据库交互。
// 添加图书按钮的事件处理 addButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new AddBookFrame10(MainFrame10.this); // 打开添加图书界面 } }); // 删除图书按钮的事件处理 deleteButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int selectedRow = table.getSelectedRow(); if (selectedRow != -1) { int id = (int) model.getValueAt(selectedRow, 0); BookDAO10 bookDAO10 = new BookDAO10(); bookDAO10.deleteBook(id); // 删除选中的图书 loadBooks(); // 重新加载图书信息 } else { JOptionPane.showMessageDialog(null, "Please select a book to delete"); } } }); // 修改图书按钮的事件处理 editButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int selectedRow = table.getSelectedRow(); if (selectedRow != -1) { int id = (int) model.getValueAt(selectedRow, 0); String title = (String) model.getValueAt(selectedRow, 1); String author = (String) model.getValueAt(selectedRow, 2); int year = (int) model.getValueAt(selectedRow, 3); new EditBookFrame10(MainFrame10.this, id, title, author, year); // 打开修改图书界面 } else { JOptionPane.showMessageDialog(null, "Please select a book to edit"); } } }); // 查询图书按钮的事件处理 searchButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { new SearchBookFrame10(); // 打开查询图书界面 } }); } |
第7部分:系统测试
- 对每个功能进行测试,确保系统稳定运行。
项目提交
- 提交按前面的7个部分编写的实训文档docx。
- 项目源码
- 数据库脚本
- 全部资料发送到邮箱:171031011@qq.com
- 邮件标题:学号+姓名+项目名