在这篇博客中,我们将构建一个简单的图书管理系统。这个系统将包含图书的增、删、改、查(CRUD)功能,旨在帮助大家通过一个小项目来巩固 Java 基础知识,并实践常见的开发技术。
这个项目会使用 Java SE 来实现,使用 Swing 作为图形用户界面(GUI),以及 MySQL 数据库来存储图书信息。通过本项目,你将了解如何进行数据库操作、构建简单的 GUI、管理用户输入、以及处理常见的异常。
项目目标
- 图书管理功能:提供基本的图书信息管理,包括增加、删除、修改、查询等操作。
- 数据库操作:使用 JDBC 连接数据库进行数据存取。
- 图形界面:使用 Java Swing 设计用户界面,展示和操作图书信息。
技术栈
- 后端:Java SE、JDBC
- 数据库:MySQL
- 界面:Swing
1. 创建 MySQL 数据库
1.1 创建数据库与表
首先,在 MySQL 中创建一个数据库和表来存储图书信息。
CREATE DATABASE book_management;
USE book_management;
CREATE TABLE books (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
author VARCHAR(255) NOT NULL,
year INT NOT NULL,
price DECIMAL(10, 2) NOT NULL
);
books
表包含了图书的 id
(自动递增),title
(书名),author
(作者),year
(出版年份)和 price
(价格)。
2. 项目结构
创建一个 Java 项目,文件结构如下:
book-management/
├── src/
│ ├── Book.java // 图书实体类
│ ├── BookDAO.java // 图书数据访问类
│ ├── BookManager.java // 图书管理逻辑类
│ ├── BookManagerGUI.java // 图书管理界面
│ └── Main.java // 启动类
├── lib/
│ └── mysql-connector-java-x.x.x.jar // MySQL JDBC 驱动
├── README.md
└── pom.xml (如果使用 Maven)
3. 数据库操作
我们使用 JDBC 连接 MySQL,进行图书的增、删、改、查操作。首先需要在项目中引入 MySQL 的 JDBC 驱动包。
3.1 添加 JDBC 驱动
下载并导入 MySQL JDBC 驱动(mysql-connector-java-x.x.x.jar
),如果使用 Maven,可以在 pom.xml
中添加如下依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
3.2 创建 Book
实体类
public class Book {
private int id;
private String title;
private String author;
private int year;
private double price;
public Book(String title, String author, int year, double price) {
this.title = title;
this.author = author;
this.year = year;
this.price = price;
}
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
3.3 创建 BookDAO
类
BookDAO
类将负责与数据库的交互,执行具体的增、删、改、查操作。
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class BookDAO {
private static final String URL = "jdbc:mysql://localhost:3306/book_management";
private static final String USER = "root";
private static final String PASSWORD = "password"; // 请替换为自己的密码
private Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
public void addBook(Book book) {
String query = "INSERT INTO books (title, author, year, price) VALUES (?, ?, ?, ?)";
try (Connection conn = getConnection();
PreparedStatement stmt = conn.prepareStatement(query)) {
stmt.setString(1, book.getTitle());
stmt.setString(2, book.getAuthor());
stmt.setInt(3, book.getYear());
stmt.setDouble(4, book.getPrice());
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public List<Book> getAllBooks() {
List<Book> books = new ArrayList<>();
String query = "SELECT * FROM books";
try (Connection conn = getConnection();
PreparedStatement stmt = conn.prepareStatement(query);
ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
Book book = new Book(rs.getString("title"), rs.getString("author"), rs.getInt("year"), rs.getDouble("price"));
book.setId(rs.getInt("id"));
books.add(book);
}
} catch (SQLException e) {
e.printStackTrace();
}
return books;
}
public void updateBook(Book book) {
String query = "UPDATE books SET title = ?, author = ?, year = ?, price = ? WHERE id = ?";
try (Connection conn = getConnection();
PreparedStatement stmt = conn.prepareStatement(query)) {
stmt.setString(1, book.getTitle());
stmt.setString(2, book.getAuthor());
stmt.setInt(3, book.getYear());
stmt.setDouble(4, book.getPrice());
stmt.setInt(5, book.getId());
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void deleteBook(int id) {
String query = "DELETE FROM books WHERE id = ?";
try (Connection conn = getConnection();
PreparedStatement stmt = conn.prepareStatement(query)) {
stmt.setInt(1, id);
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
4. 图形用户界面(GUI)
我们使用 Java Swing 来实现简单的图形用户界面,展示图书列表,并提供增、删、改功能。
4.1 创建 BookManagerGUI
类
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
public class BookManagerGUI {
private JFrame frame;
private JTextField titleField, authorField, yearField, priceField;
private JTable bookTable;
private BookDAO bookDAO;
public BookManagerGUI() {
bookDAO = new BookDAO();
frame = new JFrame("图书管理系统");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
frame.setLayout(new BorderLayout());
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(5, 2));
panel.add(new JLabel("书名:"));
titleField = new JTextField();
panel.add(titleField);
panel.add(new JLabel("作者:"));
authorField = new JTextField();
panel.add(authorField);
panel.add(new JLabel("出版年份:"));
yearField = new JTextField();
panel.add(yearField);
panel.add(new JLabel("价格:"));
priceField = new JTextField();
panel.add(priceField);
JButton addButton = new JButton("添加书籍");
panel.add(addButton);
JButton updateButton = new JButton("更新书籍");
panel.add(updateButton);
frame.add(panel, BorderLayout.NORTH);
bookTable = new JTable();
JScrollPane scrollPane = new JScrollPane(bookTable);
frame.add(scrollPane, BorderLayout.CENTER);
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String title = titleField.getText();
String author = authorField.getText();
int year = Integer.parseInt(yearField.getText());
double price = Double.parseDouble(priceField.getText());
Book book = new Book(title, author, year, price);
bookDAO.addBook(book);
refreshTable();
}
});
updateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int selectedRow = bookTable.getSelectedRow();
if (selectedRow >= 0) {
int id = (int) bookTable.getValueAt(selectedRow, 0);
String title = titleField.getText();
String author = authorField.getText();
int year = Integer.parseInt(yearField.getText());
double price = Double.parseDouble(priceField.getText());
Book book = new Book(title, author, year, price);
book.setId(id);
bookDAO.updateBook(book);
refreshTable();
}
}
});
refreshTable();
frame.setVisible(true);
}
private void refreshTable() {
List<Book> books = bookDAO.getAllBooks();
String[] columnNames = {"ID", "书名", "作者", "出版年份", "价格"};
Object[][] data = new Object[books.size()][5];
for (int i = 0; i < books.size(); i++) {
data[i][0] = books.get(i).getId();
data[i][1] = books.get(i).getTitle();
data[i][2] = books.get(i).getAuthor();
data[i][3] = books.get(i).getYear();
data[i][4] = books.get(i).getPrice();
}
bookTable.setModel(new javax.swing.table.DefaultTableModel(data, columnNames));
}
public static void main(String[] args) {
new BookManagerGUI();
}
}
5. 总结
通过本项目,我们实现了一个简单的图书管理系统,涵盖了图书的增、删、改、查(CRUD)功能。
项目使用了 Java 的 JDBC 技术与 MySQL 数据库进行数据操作,同时使用 Swing 实现了图形用户界面。这些技能在实际开发中都非常实用,尤其是对于初学者来说,通过实践这些基础功能,可以大大提高你对 Java 编程的理解和运用能力。
你可以在此基础上进行扩展,比如:
- 优化界面,使其更美观并支持更多操作。
- 实现搜索功能,根据书名、作者等信息进行查询。
- 增加错误处理与数据验证,提升系统的稳定性与可靠性。
希望这篇文章对你有所帮助。
标签:实战,Java,String,管理系统,title,stmt,book,new,public From: https://blog.csdn.net/byby0325_/article/details/144467030