在Java中开发电子书管理应用,核心需要解决图形界面展示、电子书数据存储、本地文件管理三个核心问题,通过分层设计可以让应用结构更清晰,后续维护更方便。
应用核心功能规划
电子书管理应用的基础功能包含以下几个部分:
- 电子书信息录入:支持添加书名、作者、分类、存储路径、上传时间等信息
- 信息查询与筛选:可以根据书名、作者、分类快速检索目标电子书
- 电子书删除:支持移除不需要的电子书记录,同时可选择是否删除本地文件
- 文件打开:点击记录可以直接打开本地对应的电子书文件
技术选型说明
本案例选择以下技术栈实现:
- 界面层:使用Swing框架,Java原生支持,无需额外引入依赖,跨平台兼容性好
- 数据层:使用SQLite数据库,轻量无服务,数据文件可以直接随应用打包
- 文件操作:使用Java NIO的Files类处理文件读写、路径校验等操作
数据库表结构设计
首先需要创建电子书信息存储表,表结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | INTEGER | 主键,自增 |
| book_name | TEXT | 电子书名,非空 |
| author | TEXT | 作者 |
| category | TEXT | 分类,如小说、技术、工具书 |
| file_path | TEXT | 本地文件存储路径,非空 |
| upload_time | TEXT | 录入时间 |
核心代码实现
数据库初始化工具类
首先实现SQLite数据库的连接和表创建逻辑:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.SQLException;
public class DBUtil {
// 数据库文件路径,随应用同级目录存储
private static final String DB_URL = "jdbc:sqlite:ebook_manage.db";
static {
try {
// 加载SQLite驱动
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 获取数据库连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(DB_URL);
}
// 初始化数据库,创建电子书表
public static void initDB() {
String createTableSQL = "CREATE TABLE IF NOT EXISTS ebook (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT," +
"book_name TEXT NOT NULL," +
"author TEXT," +
"category TEXT," +
"file_path TEXT NOT NULL," +
"upload_time TEXT)";
try (Connection conn = getConnection();
Statement stmt = conn.createStatement()) {
stmt.execute(createTableSQL);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
电子书实体类
定义电子书对应的Java实体,用于数据传递:
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class EBook {
private Integer id;
private String bookName;
private String author;
private String category;
private String filePath;
private String uploadTime;
// 无参构造
public EBook() {
// 默认设置当前时间为上传时间
this.uploadTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
// 有参构造
public EBook(String bookName, String author, String category, String filePath) {
this();
this.bookName = bookName;
this.author = author;
this.category = category;
this.filePath = filePath;
}
// getter和setter方法
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getUploadTime() {
return uploadTime;
}
public void setUploadTime(String uploadTime) {
this.uploadTime = uploadTime;
}
}
数据操作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;
public class EBookDAO {
// 添加电子书
public boolean addEBook(EBook ebook) {
String sql = "INSERT INTO ebook (book_name, author, category, file_path, upload_time) VALUES (?, ?, ?, ?, ?)";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, ebook.getBookName());
pstmt.setString(2, ebook.getAuthor());
pstmt.setString(3, ebook.getCategory());
pstmt.setString(4, ebook.getFilePath());
pstmt.setString(5, ebook.getUploadTime());
return pstmt.executeUpdate() > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
// 根据分类查询电子书
public List<EBook> queryByCategory(String category) {
List<EBook> list = new ArrayList<>();
String sql = "SELECT * FROM ebook WHERE category = ?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, category);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
EBook ebook = new EBook();
ebook.setId(rs.getInt("id"));
ebook.setBookName(rs.getString("book_name"));
ebook.setAuthor(rs.getString("author"));
ebook.setCategory(rs.getString("category"));
ebook.setFilePath(rs.getString("file_path"));
ebook.setUploadTime(rs.getString("upload_time"));
list.add(ebook);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
// 删除电子书记录
public boolean deleteEBook(Integer id) {
String sql = "DELETE FROM ebook WHERE id = ?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, id);
return pstmt.executeUpdate() > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
}
主界面实现
使用Swing实现简单的电子书管理主界面:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class EBookManageFrame extends JFrame {
private EBookDAO ebookDAO = new EBookDAO();
private JTextArea resultArea;
public EBookManageFrame() {
// 初始化窗口
setTitle("电子书管理应用");
setSize(800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// 初始化数据库
DBUtil.initDB();
// 创建顶部操作面板
JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
JButton addBtn = new JButton("添加电子书");
JButton queryBtn = new JButton("查询技术类书籍");
JButton deleteBtn = new JButton("删除选中书籍");
topPanel.add(addBtn);
topPanel.add(queryBtn);
topPanel.add(deleteBtn);
add(topPanel, BorderLayout.NORTH);
// 创建结果展示区域
resultArea = new JTextArea();
resultArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(resultArea);
add(scrollPane, BorderLayout.CENTER);
// 添加按钮事件
addBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 弹出添加对话框
JDialog addDialog = new JDialog(EBookManageFrame.this, "添加电子书", true);
addDialog.setLayout(new GridLayout(5, 2, 10, 10));
addDialog.setSize(400, 300);
JTextField nameField = new JTextField();
JTextField authorField = new JTextField();
JTextField categoryField = new JTextField();
JTextField pathField = new JTextField();
addDialog.add(new JLabel("书名:"));
addDialog.add(nameField);
addDialog.add(new JLabel("作者:"));
addDialog.add(authorField);
addDialog.add(new JLabel("分类:"));
addDialog.add(categoryField);
addDialog.add(new JLabel("文件路径:"));
addDialog.add(pathField);
JButton confirmBtn = new JButton("确认添加");
addDialog.add(confirmBtn);
addDialog.add(new JLabel());
confirmBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e1) {
String name = nameField.getText().trim();
String author = authorField.getText().trim();
String category = categoryField.getText().trim();
String path = pathField.getText().trim();
if (name.isEmpty() || path.isEmpty()) {
JOptionPane.showMessageDialog(addDialog, "书名和文件路径不能为空");
return;
}
// 校验文件是否存在
File file = new File(path);
if (!file.exists()) {
JOptionPane.showMessageDialog(addDialog, "文件路径不存在,请检查");
return;
}
EBook ebook = new EBook(name, author, category, path);
if (ebookDAO.addEBook(ebook)) {
JOptionPane.showMessageDialog(addDialog, "添加成功");
addDialog.dispose();
} else {
JOptionPane.showMessageDialog(addDialog, "添加失败");
}
}
});
addDialog.setLocationRelativeTo(EBookManageFrame.this);
addDialog.setVisible(true);
}
});
// 查询按钮事件
queryBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
List<EBook> list = ebookDAO.queryByCategory("技术");
resultArea.setText("");
if (list.isEmpty()) {
resultArea.append("暂无技术类电子书记录");
return;
}
for (EBook ebook : list) {
resultArea.append("ID:" + ebook.getId() + " 书名:" + ebook.getBookName() +
" 作者:" + ebook.getAuthor() + " 路径:" + ebook.getFilePath() + "n");
}
}
});
// 删除按钮事件
deleteBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String idStr = JOptionPane.showInputDialog(EBookManageFrame.this, "请输入要删除的电子书ID");
if (idStr == null || idStr.trim().isEmpty()) {
return;
}
try {
Integer id = Integer.parseInt(idStr.trim());
if (ebookDAO.deleteEBook(id)) {
JOptionPane.showMessageDialog(EBookManageFrame.this, "删除成功");
} else {
JOptionPane.showMessageDialog(EBookManageFrame.this, "删除失败,请检查ID是否正确");
}
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(EBookManageFrame.this, "请输入正确的数字ID");
}
}
});
}
public static void main(String[] args) {
// 启动应用
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new EBookManageFrame().setVisible(true);
}
});
}
}
功能扩展建议
上述示例实现了基础功能,还可以根据需求扩展更多能力:
- 增加电子书封面上传功能,将封面路径存储到数据库
- 添加模糊搜索功能,支持根据书名、作者关键字检索
- 实现文件打开功能,点击记录调用本地程序打开对应电子书
- 增加批量导入功能,扫描指定文件夹自动录入电子书信息