本文目录导读:

虽然“Derby”这个术语在不同的技术语境中可能有不同含义(比如Apache Derby数据库、赛马运动、地名等),但在编程与数据处理领域,最著名的无疑是 Apache Derby(一个轻量级的、纯Java的关系型数据库)。
下面我将为您提供几个典型的 Apache Derby 数据库案例,涵盖嵌入模式、网络模式以及Java开发中的常见应用场景。
嵌入式模式(单机桌面应用)
场景: 一个本地记事本应用(Java Swing/JavaFX),用户数据(标题、内容、时间)存储在本地文件中,无需安装数据库服务。
核心原理: Derby作为JAR包内嵌在应用里,应用启动即启动数据库,应用关闭数据库即关闭。
实现步骤:
- 引入依赖:
derby.jar - 启动数据库:
// 连接数据库时,如果数据库不存在则自动创建 Connection conn = DriverManager.getConnection("jdbc:derby:MyNotesDB;create=true"); - 创建表:
Statement stmt = conn.createStatement(); stmt.execute("CREATE TABLE Notes (ID INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, Title VARCHAR(255), Content CLOB, CreateTime TIMESTAMP)"); `` - 增删改查(标准JDBC操作):
// 插入 PreparedStatement pstmt = conn.prepareStatement("INSERT INTO Notes (Title, Content, CreateTime) VALUES (?, ?, ?)"); pstmt.setString(1, "工作日志"); pstmt.setString(2, "今天完成了系统设计文档"); pstmt.setTimestamp(3, new Timestamp(System.currentTimeMillis())); pstmt.executeUpdate(); - 关闭数据库:
// 在应用退出时,关闭数据库,释放资源 DriverManager.getConnection("jdbc:derby:MyNotesDB;shutdown=true");
优点: 部署简单,用户无需配置数据库服务器。 缺点: 只允许单进程访问,不适用于Web应用。
客户端/服务器模式(小型Web应用)
场景: 一个使用Tomcat的Java Web应用,多人同时访问,需要对用户数据进行持久化存储,Derby作为独立的网络服务器运行。
核心原理: Derby以服务进程(NetworkServerControl)启动,所有客户端通过JDBC网络驱动连接。
服务器启动命令(命令行):
java -jar derbyrun.jar server start
或者通过API:
NetworkServerControl server = new NetworkServerControl(); server.start(null);
客户端JDBC连接:
// 应用层通过URL连接网络上的Derby服务器
Connection conn = DriverManager.getConnection("jdbc:derby://localhost:1527/MyWebDB;create=true");
典型Web操作:
// Servlet中查询用户列表
ResultSet rs = stmt.executeQuery("SELECT * FROM Users WHERE Status='Active'");
while(rs.next()){
System.out.println("用户: " + rs.getString("Username"));
}
优点: 支持多用户并发访问,标准JDBC兼容性好,适合中小型项目。 缺点: 性能不如MySQL/PostgreSQL等大型数据库,不适合高并发大数据场景。
单元测试环境
场景: 开发一个数据访问层(DAO),需要在不需要安装数据库的情况下进行单元测试,验证SQL语句是否正确。
核心原理: 利用Derby的内存模式和自动创建特性,测试结束自动销毁。
@Before
public void setUp() throws Exception {
// 使用内存数据库,不产生磁盘文件
// 每次测试都连接一个独立的库,避免冲突
conn = DriverManager.getConnection("jdbc:derby:memory:testDB;create=true");
// 创建表结构
conn.createStatement().execute("CREATE TABLE Employee (ID INT, Name VARCHAR(50))");
}
@After
public void tearDown() throws Exception {
// 关闭并删除内存数据库
DriverManager.getConnection("jdbc:derby:memory:testDB;drop=true");
}
@Test
public void testInsertAndQuery() {
Statement stmt = conn.createStatement();
stmt.execute("INSERT INTO Employee VALUES (1, '张三')");
ResultSet rs = stmt.executeQuery("SELECT * FROM Employee WHERE ID=1");
assertTrue(rs.next());
assertEquals("张三", rs.getString("Name"));
}
适用场景: Spring Boot项目单元测试、Hibernate/MyBatis集成测试。 优点: 零配置、快速启动、内存执行、测试隔离性好。
常见报错与解决方案(避坑指南)
-
问题:
java.sql.SQLException: Database 'MyDB' not found.原因: 连接时未启用自动创建。 解决: 在JDBC URL末尾添加;create=true。 -
问题:
java.sql.SQLSyntaxErrorException: Table/View 'MYTABLE' does not exist.原因: Derby默认对表名区分大小写(除非用双引号括起来)。 解决: 统一的SQL中使用大写表名,或者创建时用引号CREATE TABLE "myTable" (...)。 -
问题:
XJ015: Derby system shutdown.原因: 数据库实例已被关闭。 解决: 确认只有一个数据库实例在运行;重启应用时重新获取连接。
Derby适合做什么?
| 场景 | 推荐模式 | 说明 |
|---|---|---|
| 桌面单机应用 | 嵌入式 | 像SQLite一样,零配置,打包即用 |
| 小型内网系统 | 网络模式 | 避免安装MySQL/Oracle的繁琐流程 |
| 单元测试 | 内存模式 | 快速、无状态、自动化 |
| 教学/学习JDBC | 嵌入式 | 超级简单,只需添加一个jar包 |
不适合: 生产环境的高并发电商网站、数据量超过几百GB的场景。
如果您需要针对具体的开发场景(比如Spring Boot集成、Eclipse环境等)的详细步骤,或者遇到了特定的报错信息,欢迎继续提问。