在Java中开发笔记管理应用需要结合数据存储、界面交互、业务逻辑三个核心模块,整体流程从需求拆解开始,逐步完成技术选型、功能编码和调试优化。开发过程中可以根据目标用户场景选择桌面端或Web端技术栈,桌面端常用JavaFX或Swing实现界面,数据存储可以用轻量级的SQLite数据库,避免复杂的服务部署。

一、需求与技术选型
首先要明确笔记管理应用的基础功能,通常包括笔记的增删改查、分类管理、搜索功能,进阶功能可以加入标签、富文本编辑、数据导出等。技术选型可以参考以下方案:
- 界面层:桌面端选JavaFX(现代UI风格)或Swing(兼容性好),Web端选Spring Boot+Thymeleaf
- 数据层:轻量场景用SQLite,多用户场景用MySQL
- 工具类:用JDBC处理数据库操作,用Jackson处理JSON数据序列化
二、数据库设计
笔记管理应用的核心数据表只需要两张即可满足基础需求,分别是分类表和笔记表,表结构设计如下:
| 表名 | 字段名 | 类型 | 说明 |
|---|---|---|---|
| note_category | id | INT PRIMARY KEY AUTOINCREMENT | 分类ID |
| name | VARCHAR(50) NOT NULL | 分类名称 | |
| create_time | DATETIME DEFAULT CURRENT_TIMESTAMP | 创建时间 | |
| note | id | INT PRIMARY KEY AUTOINCREMENT | 笔记ID |
| title | VARCHAR(100) NOT NULL | 笔记标题 | |
| content | TEXT | 笔记内容 | |
| category_id | INT | 所属分类ID,外键关联note_category.id | |
| update_time | DATETIME DEFAULT CURRENT_TIMESTAMP | 更新时间 | |
| is_deleted | INT DEFAULT 0 | 删除标记,0未删除1已删除 |
三、核心功能实现
1. 数据库连接工具类
使用JDBC连接SQLite数据库,封装获取连接和关闭资源的方法:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
public class DBUtil {
// 数据库文件路径,本地开发可放在项目根目录
private static final String DB_URL = "jdbc:sqlite:note.db";
// 获取数据库连接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(DB_URL);
}
// 初始化数据库,创建表结构
public static void initDB() {
String createCategorySQL = "CREATE TABLE IF NOT EXISTS note_category (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT," +
"name VARCHAR(50) NOT NULL," +
"create_time DATETIME DEFAULT CURRENT_TIMESTAMP" +
")";
String createNoteSQL = "CREATE TABLE IF NOT EXISTS note (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT," +
"title VARCHAR(100) NOT NULL," +
"content TEXT," +
"category_id INTEGER," +
"update_time DATETIME DEFAULT CURRENT_TIMESTAMP," +
"is_deleted INTEGER DEFAULT 0," +
"FOREIGN KEY (category_id) REFERENCES note_category(id)" +
")";
try (Connection conn = getConnection();
Statement stmt = conn.createStatement()) {
stmt.execute(createCategorySQL);
stmt.execute(createNoteSQL);
} catch (SQLException e) {
e.printStackTrace();
}
}
// 关闭资源
public static void close(Connection conn, Statement stmt, ResultSet rs) {
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2. 笔记实体类
定义笔记和分类的实体类,对应数据库表结构:
// 分类实体类
public class NoteCategory {
private Integer id;
private String name;
private String createTime;
// 构造方法、getter、setter省略
}
// 笔记实体类
public class Note {
private Integer id;
private String title;
private String content;
private Integer categoryId;
private String updateTime;
private Integer isDeleted;
// 构造方法、getter、setter省略
}
3. 笔记增删改查功能
实现笔记的添加、查询、更新、删除核心业务逻辑:
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 NoteService {
// 添加笔记
public boolean addNote(String title, String content, Integer categoryId) {
String sql = "INSERT INTO note (title, content, category_id) VALUES (?, ?, ?)";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, title);
pstmt.setString(2, content);
pstmt.setInt(3, categoryId);
return pstmt.executeUpdate() > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
// 查询所有未删除的笔记
public List<Note> getAllNotes() {
List<Note> noteList = new ArrayList<>();
String sql = "SELECT id, title, content, category_id, update_time FROM note WHERE is_deleted = 0";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
Note note = new Note();
note.setId(rs.getInt("id"));
note.setTitle(rs.getString("title"));
note.setContent(rs.getString("content"));
note.setCategoryId(rs.getInt("category_id"));
note.setUpdateTime(rs.getString("update_time"));
noteList.add(note);
}
} catch (SQLException e) {
e.printStackTrace();
}
return noteList;
}
// 更新笔记内容
public boolean updateNote(Integer noteId, String title, String content) {
String sql = "UPDATE note SET title = ?, content = ?, update_time = CURRENT_TIMESTAMP WHERE id = ? AND is_deleted = 0";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, title);
pstmt.setString(2, content);
pstmt.setInt(3, noteId);
return pstmt.executeUpdate() > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
// 删除笔记(逻辑删除)
public boolean deleteNote(Integer noteId) {
String sql = "UPDATE note SET is_deleted = 1 WHERE id = ?";
try (Connection conn = DBUtil.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, noteId);
return pstmt.executeUpdate() > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
}
4. 简单界面实现(Swing示例)
用Swing实现基础的操作界面,包含笔记列表展示和操作按钮:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
public class NoteFrame extends JFrame {
private NoteService noteService = new NoteService();
private JTextArea contentArea;
private DefaultListModel<String> noteListModel;
private JList<String> noteJList;
public NoteFrame() {
setTitle("笔记管理应用");
setSize(800, 600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
// 初始化数据库
DBUtil.initDB();
// 笔记列表面板
JPanel listPanel = new JPanel(new BorderLayout());
noteListModel = new DefaultListModel<>();
noteJList = new JList<>(noteListModel);
JScrollPane listScroll = new JScrollPane(noteJList);
listPanel.add(new JLabel("笔记列表"), BorderLayout.NORTH);
listPanel.add(listScroll, BorderLayout.CENTER);
loadNoteList();
// 笔记内容面板
JPanel contentPanel = new JPanel(new BorderLayout());
contentArea = new JTextArea(10, 30);
JScrollPane contentScroll = new JScrollPane(contentArea);
contentPanel.add(new JLabel("笔记内容"), BorderLayout.NORTH);
contentPanel.add(contentScroll, BorderLayout.CENTER);
// 操作按钮面板
JPanel btnPanel = new JPanel();
JButton addBtn = new JButton("添加笔记");
JButton updateBtn = new JButton("更新选中笔记");
JButton deleteBtn = new JButton("删除选中笔记");
btnPanel.add(addBtn);
btnPanel.add(updateBtn);
btnPanel.add(deleteBtn);
// 按钮事件
addBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String title = JOptionPane.showInputDialog("请输入笔记标题");
if (title != null && !title.trim().isEmpty()) {
noteService.addNote(title, contentArea.getText(), 1);
loadNoteList();
}
}
});
updateBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int selectedIndex = noteJList.getSelectedIndex();
if (selectedIndex >= 0) {
String selectedText = noteJList.getSelectedValue();
// 这里简单处理,实际需要根据标题获取对应ID,示例中省略ID映射逻辑
JOptionPane.showMessageDialog(null, "更新功能需要完善ID映射逻辑");
}
}
});
// 布局组装
add(listPanel, BorderLayout.WEST);
add(contentPanel, BorderLayout.CENTER);
add(btnPanel, BorderLayout.SOUTH);
}
// 加载笔记列表到界面
private void loadNoteList() {
noteListModel.clear();
List<Note> notes = noteService.getAllNotes();
for (Note note : notes) {
noteListModel.addElement(note.getTitle());
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new NoteFrame().setVisible(true);
}
});
}
}
四、后续优化方向
完成基础功能后,可以从几个方面优化应用:
- 完善分类管理功能,支持添加、删除笔记分类
- 加入搜索功能,支持按标题和内容关键词检索笔记
- 替换Swing为JavaFX,实现更美观的界面效果
- 加入数据备份功能,支持将笔记导出为TXT或JSON格式
- 如果开发Web版本,可以用Spring Boot搭建后端,前端用Vue或React实现交互界面