swing图书管理系统+源码+讲解+ 报告

本次实训要求使用Java面向对象、MySQL数据库和Swing图形组件简单实现xxxx系统的增删改查操作(比如学生信息管理系统)。

实训目标

  • 掌握面向对象编程的基本概念:类、对象、继承、封装和多态。
  • 学习使用Java进行数据库操作。
  • 熟悉MySQL数据库的使用和管理。
  • 学习使用Swing组件构建图形用户界面。

实训环境

  • Java开发环境(JDK和IDE,如Eclipse或IntelliJ IDEA)。
  • MySQL数据库服务器(5.x,8.x)。

实训内容

1部分:需求分析

  • 确定系统功能:添加、查询、修改、删除书籍信息。
  • 确定用户界面需求。

2部分:系统设计

  1. 数据库设计 E-R模型
  • 设计用户信息表结构。

用户(编号,名称,密码)

  • 设计书籍信息表结构。

书籍(编号,书名,作者,年份)

  1. 面向对象设计:
  • 定义数据库操作类(DatabaseConnection10),封装数据库连接和SQL操作。
  • 创建用户登录类,使其登录进行一切操作。
  • 创建dao10包,包括图形用户界面的增删改查方法,在其中创建UserDAO10类和BookDAO10类,分别用于处理用户和图书相关的数据库操作。

3部分:数据库实现

  • 使用MySQL创建数据库和用户表和书籍信息表。
  • SQL脚本

-- 创建数据库

CREATE DATABASE IF NOT EXISTS bookmanagement10;

-- 选择数据库

USE bookmanagement10;

-- 创建表

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(50) NOT NULL
);

CREATE TABLE books (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(100) NOT NULL,
    author VARCHAR(100) NOT NULL,
    year INT NOT NULL
);

-- 插入用户数据
INSERT INTO users (username, password) VALUES ('admin', 'admin123');

-- 插入图书数据
INSERT INTO books (title, author, year) VALUES ('西游记', '吴承恩', 1522);
INSERT INTO `books` VALUES (2, '飞鸟集', '泰戈尔', 1998);

INSERT INTO books (title, author, year) VALUES ('稻草人', '叶圣陶', 1922);

4部分:Java类实现

1、数据库操作类(DatabaseConnection10)

  1. 连接数据库。

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);

    }

}

  1. 用户登录类(LoginFrame10)
  1. 使其登录进行一切操作。

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;

        }

    }

}

  1. 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 
  • 邮件标题:学号+姓名+项目名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3224118.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Instruct-GS2GS:通过用户指令编辑 GS 三维场景

Paper: Instruct-GS2GS: Editing 3D Gaussian Splats with Instructions Introduction: https://instruct-gs2gs.github.io/ Code: https://github.com/cvachha/instruct-gs2gs Instruct-GS2GS 复用了 Instruct-NeRF2NeRF 1 的架构&#xff0c;将基于 NeRF 的三维场景编辑方法迁…

VS Code配置Graphviz和DOT语言环境

目录 Graphviz介绍 下载并安装Graphviz 安装插件 效果展示 Graphviz介绍 Graphviz 是一款开源图形可视化软件。图形可视化是一种将结构信息表示为抽象图形和网络图的方法。它在网络、生物信息学、软件工程、数据库和网页设计、机器学习以及其他技术领域的可视化界面中有着…

展开说说:Android服务之实现AIDL跨应用通信

前面几篇总结了Service的使用和源码执行流程&#xff0c;这里再简单分析一下如果需要Service跨进程通信该怎样做。AIDL&#xff08;Android Interface Definition Language&#xff09;Android接口定义语言&#xff0c;用于实现 Android 两个进程之间进行进程间通信&#xff08…

TensorFlow系列:第二讲:准备工作

1.创建项目&#xff0c;选择虚拟环境 项目结构如下&#xff1a; data中的数据集需要提前准备好&#xff0c;数据分为测试集&#xff0c;训练集和验证集。以下是数据集的下载平台&#xff1a;kaggle 2.随便选择一个和水果相关的数据集&#xff0c;下载到本地&#xff0c;导入的项…

C# Bitmap类型与Byte[]类型相互转化详解与示例

文章目录 一、Bitmap类型转Byte[]类型使用Bitmap类的Save方法使用Bitmap类的GetBytes方法 二、Byte[]类型转Bitmap类型使用MemoryStream将Byte[]数组转换为Bitmap对象使用System.Drawing.Imaging.BitmapImage类 总结 在C#编程中&#xff0c;Bitmap类型和Byte[]类型之间的相互转…

产品原型设计:从概念到实现的完整指南

如果你是一位产品经理&#xff0c;那么你一定会和原型图打交道&#xff0c;产品原型是产品设计方案和底层逻辑的可视化表达&#xff0c;需要完整清晰地表达出产品目的及需求&#xff0c;在整个产品创造的过程中发挥着不可或缺的作用。而对于一些刚入行的产品经理来说&#xff0…

【Linux】多线程_1

文章目录 九、多线程1. 线程概念2. 线程的控制 未完待续 九、多线程 1. 线程概念 我们知道&#xff1a;进程 内核数据结构 进程代码和数据 。那什么是线程呢&#xff1f;线程是进程内部的一个执行分支。一个进程内部可以有多个执行流&#xff08;内核数据结构&#xff09;&…

量产工具一一UI系统(四)

目录 前言 一、按钮数据结构抽象 1.ui.h 二、按键处理 1.button.c 2.disp_manager.c 3.disp_manager.h 三、单元测试 1.ui_test.c 2.上机测试 前言 前面我们实现了显示系统框架&#xff0c;输入系统框架和文字系统框架&#xff0c;链接&#xff1a; 量产工具一一显…

接口测试(2)

单接口测试 CtrlD 复制 因为单接口的时候主要改变测试用例数据 自动判定响应结果 postman断言 //断言响应状态码为200 pm.test("Status code is 200", function () {pm.response.to.have.status(200); }); //断言返回数据中包括&#xff08;成功&#xff09; //预期结…

线程池案例

秒杀 需求 10个礼物20个客户抢随机10个客户获取礼物&#xff0c;另外10无法获取礼物 任务类 记得给共享资源加锁 public class MyTask implements Runnable{// 礼物列表private ArrayList<String> gifts ;// 用户名private String username;public MyTask( String user…

285个地级市出口产品质量及技术复杂度(2011-2021年)

出口产品质量与技术复杂度&#xff1a;衡量国家竞争力的关键指标 出口产品质量是衡量国内企业生产的产品在国际市场上竞争力的重要标准。它不仅要求产品符合国际标准和目标市场的法律法规&#xff0c;而且需要保证产品质量的稳定性和可靠性。而出口技术复杂度则进一步体现了一…

Spring Cloud 引入

1.单体架构&#xff1a; 定义&#xff1a;所有的功能实现都打包成一个项目 带来的后果&#xff1a; ①后端服务器的压力越来越大&#xff0c;负载越来越高&#xff0c;甚至出现无法访问的情况 ②业务越来越复杂&#xff0c;为了满足用户的需求&#xff0c;单体应用也会越来越…

IEC62056标准体系简介-2.IEC62056标准体系及对象标识系统(OBIS)

1. IEC 62056标准体系 IEC 62056标准体系目前共包括六部分&#xff0c;见图1&#xff1a; 第61部分&#xff1a;对象标识系统第62部分&#xff1a;接口类第53部分&#xff1a;COSEM应用层第46部分&#xff1a;使用HDLC&#xff08;High Level Data Link Control&#xff09;协…

HNU小学期BSP软件编程基础十道测试题

http://t.csdnimg.cn/Yv0R1 文章参考了这位大佬的代码&#xff0c;在他的基础上进行了纠错、完善等处理。 配置 编程前的准备工作按大佬的流程即可&#xff0c;稍有不同的是学习通课程网站的资料里没有头文件的整个压缩包了&#xff0c;但我们可以下载某个BSP版的工程文件&am…

X12端口配置指南:ISA ID、测试指示符与997

通过知行之桥EDI系统实现X12 & 标准XML之间的格式转换时&#xff0c;需要完善交换头ISA ID及其限定符、测试标识符以及997的相关配置。 在X12文件中有两组EDI ID对&#xff0c;分别是发送方 ID 限定符 及发送方ID &#xff0c;接收方 ID 限定符及接收方ID。 比如&#xf…

谷粒商城-个人笔记(集群部署篇三)

前言 ​学习视频&#xff1a;​Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强​学习文档&#xff1a; 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…

【linux服务器篇】-Redis-RDM远程连接redis

redis desktop manager 使用远程连接工具RDM连接redis 市面上比较常见的其中一款工具redis desktop manager 简单的说&#xff1a; Redis Desktop Manager 简单的来讲就是Redis可视化工具&#xff0c;可以让我们看到Redis中存储的内容。 redis desktop manager是一款功能强…

C++:多态(继承)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;多态》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 :maple_leaf:多态的概念:maple_leaf:继承中的多态1.:leaves:虚函数表 :…

uniapp安卓端实现语音合成播报

最初尝试使用讯飞语音合成方式,能获取到语音数据,但是数据是base64格式的,在安卓端无法播放,网上有说通过转成blob格式的url可以播放,但是uniapp不支持转换的api;于是后面又想其他办法,使用安卓插件播报原生安卓语音播报插件 - DCloud 插件市场 方案一(讯飞语音合成) 1.在讯飞…

C语言入门基础题:奇偶 ASCII 值判断(C语言版)和ASCII码表,什么是ASCII码,它的特点和应用?

1.题目描述&#xff1a; 任意输入一个字符&#xff0c;判断其 ASCII 是否是奇数&#xff0c;若是&#xff0c;输出 YES &#xff0c;否则&#xff0c;输出 NO例如&#xff0c;字符 A 的 ASCI 值是 65 &#xff0c;则输出 YES &#xff0c;若输入字符 B(ASCII 值是 66)&#xff…