大家好,我是只谈技术不剪发的 Tony 老师。今天给大家介绍一款嵌入式关系型数据库:Apache Derby。

Apache Derby 简介

Derby

Apache Derby 是一个开源的嵌入式关系型数据库,完全使用 Java 语言实现,并遵循 Apache License, Version 2.0 协议。Apache Derby 是 Apache DB 的一个子项目,它的主要优势包括:

  • Derby 程序体积很小,基本的数据库引擎和嵌入式 JDBC 驱动大概只有 3.5 MB;
  • Derby 基于 Java、JDBC 以及 SQL 标准实现;
  • Derby 提供了一个嵌入式的 JDBC 驱动,可以在任何 Java 应用中嵌入 Derby 数据库;
  • Derby 支持客户端/服务器部署模式,并提供了 Derby Network Client JDBC 驱动和 Derby Network Server;
  • Derby 易于安装、部署和使用。

Derby 最早是由 IBM 于 2004 年贡献给 Apache Software Foundation,开源之前的名称叫做 Cloudscape。目前,Apache Derby 基本上保持每年一个版本更新,最新版本为 10.15.2.0;源代码可以从 GitHub 或者 Apache 官方 SVN 代码库中下载。

📝Oracle 曾经在 JDK 中打包了一个 Derby 版本,叫做 Java DB;不过现在 JDK 中已经不再默认包含这个 db 目录了。

安装配置

Apache Derby 官方网站提供了下载页面

download
最新的版本需要 Java 9 以上运行环境,点击版本链接之后选择一个下载地址镜像,打开的页面中包含了所有的 Apache Software Foundation 软件下载目录。然后打开 db/derby/ 就是各种版本的下载目录了,这里我们选择 db-derby-10.15.2.0 子目录:

derby
然后点击下载 db-derby-10.15.2.0-bin.zip 文件,下载完成后进行解压缩。

dir
解压缩之后的目录如下:

  • bin 目录包含了环境设置、服务管理以及常用工具的脚本
  • demo 目录包含了几个示例程序;
  • docs 目录包含了 Derby 官方文档;
  • javadoc 目录包含了 API 文档;
  • lib 目录包含了 Derby 所有的 .jar 文件;
  • test 目录包含了 Derby 回归测试。

Apache Derby 基于 Java 环境运行,需要先安装 JDK 或者 JRE,可以点击下载安装并配置环境变量 JAVA_HOME,将 JDK 的 bin 目录添加到 PATH 环境变量,然后使用java -version查看当前 Java 版本。

PS C:\Users\dongx> java -version
java version "13.0.1" 2019-10-15
Java(TM) SE Runtime Environment (build 13.0.1+9)
Java HotSpot(TM) 64-Bit Server VM (build 13.0.1+9, mixed mode, sharing)

接下来还需要设置 Derby 的环境变量,将 DERBY_HOME 设置为解压之后的目录,并且将 DERBY_HOME/bin 添加到 PATH 环境变量。

部署模式

Apache Derby 支持两者基本的部署方式:嵌入式(embedded)或者客户端/服务器模式(client/server)。

对于嵌入式部署,Derby 运行在应用程序的 JVM 中,应用通过 Embedded Derby JDBC 驱动访问数据库。此时,Derby 属于应用的一部分,随着应用启动和关闭,用户无法感知它的存在,通常也不需要进行配置和管理。

嵌入式

对于者客户端/服务器模式,Derby 运行在服务器的 JVM 中,多个应用程序通过网络连接到 Derby 数据库。此时,Derby Network Server 负责管理来自客户端的连接请求,客户端利用 Derby Network Client JDBC 驱动连接到服务器。

C/S
接下来我们以嵌入式部署为例,介绍如何配置 Derby。点击运行 bin 目录中的 setEmbeddedCP(Linux)或者 setEmbeddedCP.bat(Windows)脚本:

C:\Users\dongx>D:\Software\db-derby-10.15.2.0-bin\bin\setEmbeddedCP.bat

C:\Users\dongx>SET DERBY_HOME=D:\Software\db-derby-10.15.2.0-bin

C:\Users\dongx>set CLASSPATH=D:\Software\db-derby-10.15.2.0-bin\lib\derbyshared.jar;D:\Software\db-derby-10.15.2.0-bin\lib\derby.jar;D:\Software\db-derby-10.15.2.0-bin\lib\derbytools.jar;D:\Software\db-derby-10.15.2.0-bin/lib/derbyoptionaltools.jar;

C:\Users\dongx>set MODULEPATH=D:\Software\db-derby-10.15.2.0-bin\lib\derbyshared.jar;D:\Software\db-derby-10.15.2.0-bin\lib\derby.jar;D:\Software\db-derby-10.15.2.0-bin\lib\derbytools.jar;D:\Software\db-derby-10.15.2.0-bin/lib/derbyoptionaltools.jar

该脚本会设置相应的 CLASSPATH 和 MODULEPATH 环境变量。

然后运行 bin 目录中的 sysinfo(Linux)或者 sysinfo.bat(Windows)脚本查看 Derby 的环境配置:

C:\Users\dongx>D:\Software\db-derby-10.15.2.0-bin\bin\sysinfo.bat
------------------ Java Information ------------------
Java Version:    13.0.1
Java Vendor:     Oracle Corporation
Java home:       C:\Program Files\Java\jdk-13.0.1
Java classpath:  D:\Software\db-derby-10.15.2.0-bin/lib/derbyshared.jar;D:\Software\db-derby-10.15.2.0-bin/lib/derby.jar;D:\Software\db-derby-10.15.2.0-bin/lib/derbynet.jar;D:\Software\db-derby-10.15.2.0-bin/lib/derbyclient.jar;D:\Software\db-derby-10.15.2.0-bin/lib/derbytools.jar;D:\Software\db-derby-10.15.2.0-bin/lib/derbyoptionaltools.jar
OS name:         Windows 10
OS architecture: amd64
OS version:      10.0
Java user name:  dongx
Java user home:  C:\Users\dongx
Java user dir:   C:\Users\dongx
java.specification.name: Java Platform API Specification
java.specification.version: 13
java.runtime.version: 13.0.1+9
--------- Derby Information --------
[D:\Software\db-derby-10.15.2.0-bin\lib\derby.jar] 10.15.2.0 - (1873585)
[D:\Software\db-derby-10.15.2.0-bin\lib\derbytools.jar] 10.15.2.0 - (1873585)
[D:\Software\db-derby-10.15.2.0-bin\lib\derbynet.jar] 10.15.2.0 - (1873585)
[D:\Software\db-derby-10.15.2.0-bin\lib\derbyclient.jar] 10.15.2.0 - (1873585)
[D:\Software\db-derby-10.15.2.0-bin\lib\derbyshared.jar] 10.15.2.0 - (1873585)
[D:\Software\db-derby-10.15.2.0-bin\lib\derbyoptionaltools.jar] 10.15.2.0 - (1873585)
------------------------------------------------------
----------------- Locale Information -----------------
Current Locale :  [English/United States [en_US]]
Found support for locale: [cs]
         version: 10.15.2.0 - (1873585)
Found support for locale: [de_DE]
         version: 10.15.2.0 - (1873585)
Found support for locale: [es]
         version: 10.15.2.0 - (1873585)
Found support for locale: [fr]
         version: 10.15.2.0 - (1873585)
Found support for locale: [hu]
         version: 10.15.2.0 - (1873585)
Found support for locale: [it]
         version: 10.15.2.0 - (1873585)
Found support for locale: [ja_JP]
         version: 10.15.2.0 - (1873585)
Found support for locale: [ko_KR]
         version: 10.15.2.0 - (1873585)
Found support for locale: [pl]
         version: 10.15.2.0 - (1873585)
Found support for locale: [pt_BR]
         version: 10.15.2.0 - (1873585)
Found support for locale: [ru]
         version: 10.15.2.0 - (1873585)
Found support for locale: [zh_CN]
         version: 10.15.2.0 - (1873585)
Found support for locale: [zh_TW]
         version: 10.15.2.0 - (1873585)
------------------------------------------------------
------------------------------------------------------

显示类似以上信息表明 Derby 运行环境配置成功。

基本操作

Derby 提供了几个基于 Java 的实用工具和程序,包括 sysinfo、ij 和 dblook 等。其中,ij 是用于操作 Derby 数据库的一个交互式 SQL 脚本工具。

首先,我们运行 bin 目录中的 ij(Linux)或者ij.bat(Windows)脚本启动 ij:

C:\Users\dongx>D:\Software\db-derby-10.15.2.0-bin\bin\ij.bat
ij version 10.15
ij>

当前 ij 版本为 10.15。输入 help 命令查看使用帮助:

ij> help;

 Supported commands include:

  PROTOCOL 'JDBC protocol' [ AS ident ];
                               -- sets a default or named protocol
  DRIVER 'class for driver';   -- loads the named class
  CONNECT 'url for database' [ PROTOCOL namedProtocol ] [ AS connectionName ];
                               -- connects to database URL
                               -- and may assign identifier
  SET CONNECTION connectionName; -- switches to the specified connection
  SHOW CONNECTIONS;            -- lists all connections
  AUTOCOMMIT [ ON | OFF ];     -- sets autocommit mode for the connection
  DISCONNECT [ CURRENT | connectionName | ALL ];
                               -- drop current, named, or all connections;
                               -- the default is CURRENT

  SHOW SCHEMAS;                -- lists all schemas in the current database
  SHOW [ TABLES | VIEWS | PROCEDURES | FUNCTIONS | SYNONYMS ] { IN schema };
                               -- lists tables, views, procedures, functions or synonyms
  ...

创建数据库

我们通过 ij 工具创建一个数据库:

ij> connect 'jdbc:derby:hrdb;create=true';

其中,连接 URL 中的 create=true 表示创建一个新的数据库,名称为 hrdb;如果没有指定该选项,并且数据库不存在的话会返回以下错误:

ij> connect 'jdbc:derby:hrdb';
ERROR XJ004: Database 'hrdb' not found.

使用 exit 命令退出 ij:

ij> exit;

新建的数据库文件位于操作系统当前工作目录,可以使用 ls 或者 dir 命令进行查看:

C:\Users\dongx>dir hrdb

 Directory of C:\Users\dongx\hrdb

08/31/2020  04:19 PM    <DIR>          .
08/31/2020  04:19 PM    <DIR>          ..
08/31/2020  04:18 PM    <DIR>          log
08/31/2020  04:19 PM               608 README_DO_NOT_TOUCH_FILES.txt
08/31/2020  04:19 PM    <DIR>          seg0
08/31/2020  04:19 PM               921 service.properties
               2 File(s)          1,529 bytes
               4 Dir(s)  143,770,697,728 bytes free

另外,当前目录中还存在一个 derby.log 日志文件。

执行 SQL 语句

再次启动 ij 工具并运行 connect 命令连接数据库:

C:\Users\dongx>D:\Software\db-derby-10.15.2.0-bin\bin\ij.bat
ij version 10.15
ij> connect 'jdbc:derby:hrdb';
ij>

连接成功之后就可以执行各种 SQL 语句,ij 中的语句以分号(;)结束:

ij> create table test(id int primary key, name varchar(50));
0 rows inserted/updated/deleted

ij> insert into test values(1, 'apple'),(2, 'banana');
2 rows inserted/updated/deleted

ij> select * from test;
ID         |NAME
--------------------------------------------------------------
1          |apple
2          |banana

2 rows selected

运行 SQL 脚本

ij 工具支持调用 SQL 脚本,执行 run 命令运行指定的文件:

ij> run 'myfile.sql';

run 命令会打印并执行脚本文件中的内容。

断开数据库连接

使用 disconnect 命令断开当前数据库连接:

ij> disconnect;
ij> 

如果想要退出 ij 工具,使用 exit 命令;对于嵌入式模式,该命令同时会关闭数据库。

生成 DDL 语句

dblook 工具可以查看指定数据库的 DDL 语句。

C:\Users\dongx>D:\Software\db-derby-10.15.2.0-bin\bin\dblook.bat -d hrdb
-- Timestamp: 2020-08-31 16:57:02.648
-- Source database is:
-- Connection URL is: hrdb
-- appendLogs: false

-- Note: At least one unexpected error/warning message was
-- encountered during DDL generation.  See dblook.log
-- to review the message(s).


C:\Users\dongx>D:\Software\db-derby-10.15.2.0-bin\bin\dblook.bat -d jdbc:derby:hrdb
-- Timestamp: 2020-08-31 16:58:25.764
-- Source database is: hrdb
-- Connection URL is: jdbc:derby:hrdb
-- appendLogs: false

-- ----------------------------------------------
-- DDL Statements for tables
-- ----------------------------------------------

CREATE TABLE "APP"."TEST" ("ID" INTEGER NOT NULL, "NAME" VARCHAR(50));

-- ----------------------------------------------
-- DDL Statements for keys
-- ----------------------------------------------

-- PRIMARY/UNIQUE
ALTER TABLE "APP"."TEST" ADD CONSTRAINT "SQL0000000000-80220011-0174-43a1-f682-00000f4783f0" PRIMARY KEY ("ID");

使用 -o 选项可以将 DDL 语句保存到指定文件中:

C:\Users\dongx>D:\Software\db-derby-10.15.2.0-bin\bin\dblook.bat -d jdbc:derby:hrdb -o hrdb.sql

📝关于 ij、dblook 和其他工具的详细介绍,可以参考官方文档

Maven 依赖

如果想要在自己的 Java 应用中使用 Apache Derby 数据库,可以添加以下 Maven 依赖:

<dependency>
    <groupId>org.apache.derby</groupId>
    <artifactId>derby</artifactId>
    <version>10.15.2.0</version>
</dependency>

最新的版本配置可以查看 Maven Central

资源文档

如果想要进一步深入了解和学习 Apache Derby,可以参考以下资源:

总结

Apache Derby 是一款基于 Java 实现的关系型数据库,支持嵌入式和客户端/服务器部署模式。总而言之,Derby 是一个小巧而强大的产品,通常作为一个嵌入式数据库运行在其他 Java 应用程序中。本文介绍了 Derby 的安装配置、常用工具的基本操作以及相关的学习资源。

如果觉得文章对你有用,欢迎关注❤️、评论📝、点赞👍!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐