Derby案例

wen java案例 2

本文目录导读:

Derby案例

  1. 案例一:嵌入式模式(单机桌面应用)
  2. 案例二:客户端/服务器模式(小型Web应用)
  3. 案例三:单元测试环境
  4. 案例四:常见报错与解决方案(避坑指南)
  5. 总结:Derby适合做什么?

虽然“Derby”这个术语在不同的技术语境中可能有不同含义(比如Apache Derby数据库、赛马运动、地名等),但在编程与数据处理领域,最著名的无疑是 Apache Derby(一个轻量级的、纯Java的关系型数据库)。

下面我将为您提供几个典型的 Apache Derby 数据库案例,涵盖嵌入模式、网络模式以及Java开发中的常见应用场景。


嵌入式模式(单机桌面应用)

场景: 一个本地记事本应用(Java Swing/JavaFX),用户数据(标题、内容、时间)存储在本地文件中,无需安装数据库服务。

核心原理: Derby作为JAR包内嵌在应用里,应用启动即启动数据库,应用关闭数据库即关闭。

实现步骤:

  1. 引入依赖derby.jar
  2. 启动数据库
    // 连接数据库时,如果数据库不存在则自动创建
    Connection conn = DriverManager.getConnection("jdbc:derby:MyNotesDB;create=true");
  3. 创建表
    Statement stmt = conn.createStatement();
    stmt.execute("CREATE TABLE Notes (ID INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, Title VARCHAR(255), Content CLOB, CreateTime TIMESTAMP)");
    ``
  4. 增删改查(标准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();
  5. 关闭数据库
    // 在应用退出时,关闭数据库,释放资源
    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集成测试。 优点: 零配置、快速启动、内存执行、测试隔离性好。


常见报错与解决方案(避坑指南)

  1. 问题: java.sql.SQLException: Database 'MyDB' not found. 原因: 连接时未启用自动创建。 解决: 在JDBC URL末尾添加 ;create=true

  2. 问题: java.sql.SQLSyntaxErrorException: Table/View 'MYTABLE' does not exist. 原因: Derby默认对表名区分大小写(除非用双引号括起来)。 解决: 统一的SQL中使用大写表名,或者创建时用引号 CREATE TABLE "myTable" (...)

  3. 问题: XJ015: Derby system shutdown. 原因: 数据库实例已被关闭。 解决: 确认只有一个数据库实例在运行;重启应用时重新获取连接。


Derby适合做什么?

场景 推荐模式 说明
桌面单机应用 嵌入式 像SQLite一样,零配置,打包即用
小型内网系统 网络模式 避免安装MySQL/Oracle的繁琐流程
单元测试 内存模式 快速、无状态、自动化
教学/学习JDBC 嵌入式 超级简单,只需添加一个jar包

不适合: 生产环境的高并发电商网站、数据量超过几百GB的场景。


如果您需要针对具体的开发场景(比如Spring Boot集成、Eclipse环境等)的详细步骤,或者遇到了特定的报错信息,欢迎继续提问。

抱歉,评论功能暂时关闭!