Apache Derby GetStarted
本文是对Apache Derby官方文档的翻译与学习的总结,如有转载,请声明出处!
1.下载
首先到Apache Derby网站下载Derby最新的release版本。
笔者使用的版本为10.4.1.3。
建议将可以下载的发布包全部下载,因为文件都不是很大。以备后用。笔者下载了:
db-derby-10.4.1.3-bin.zip [PGP] [MD5]
db-derby-10.4.1.3-lib.zip [PGP] [MD5]
db-derby-10.4.1.3-lib-debug.zip [PGP] [MD5]
db-derby-10.4.1.3-src.zip [PGP] [MD5]
derby_core_plugin_10.4.1.648739.zip [PGP] [MD5]
derby_ui_plugin_1.1.2.zip [PGP] [MD5]
本文中只使用db-derby-10.4.1.3-bin.zip文件。java的jdbc连接数据库
2.Derby简介
Derby是一个开源的基于Java和SQL的关系数据库管理系统(RDBMS)。Derby是使用纯Java编写和实现的。Derby为用户提供了轻量的标准数据库引擎,它可以紧密的嵌入到任何基于Java的解决方案中。Derby确保数据完整性,并提供负责的事务处理操作。默认的配置中不包含任何独立的数据库服务器。
Derby可以有两种部署方式:
嵌入式:Derby被单个用户的Java应用程序使用,在这种模式下,Derby和应用程序运行在同一个JVM中。Derby对于终端用户几乎是透明的,因为它的启动和终止都是由应用程序来控制,而不需要任何的管理。
服务器模式:Derby由应用程序启动,此时通过用户可以通过网络连接。在这种模式下,Derby运行在服务器主机的JVM中。其他JVM的应用程序通过连接服务器来访问数据库。
Derby的运行需要Java 1.4+版本的支持。
3.安装
解压缩db-derby-10.4.1.3-bin.zip文件到本地系统目录,例如C:\。(Apache的帮助文档中提到了Windows和Linux两种操作系统,笔者只介绍Windows操作系统的情况)
将该目录记为DERBY_HOME。
解压缩后的目录中包含了样例程序,运行脚本,javadoc,derby doc,运行时类库,derby测试程序等。
设置环境
将DERBY_HOME设置为系统变量。
将DERBY_HOME\bin添加到系统path环境变量中。
设置完成以后,运行derby的命令如下:
java -jar %DERBY_HOME%\lib\derbyrun.jar ij [-p propertiesfile] [sql_script]
java -jar %DERBY_HOME%\lib\derbyrun.jar sysinfo [-cp ...] [-cp help]
java -jar %DERBY_HOME%\lib\derbyrun.jar dblook [arg]* (or no arguments for usage)
java -jar %DERBY_HOME%\lib\derbyrun.jar server [arg]* (or no arguments for usage)
在DERBY_HOME\bin目录下,有一些设置CLASSPATH的脚本,命名为setXxxCP。
4.运行Derby工具
在Windows命令行提示符窗口中执行sysinfo、ij、dblook命令,对应着DERBY_HOME\bin目录中的脚本,可以运行Derby的工具。
sysinfo:显示Java环境的信息以及Derby的版本。
ij:它是一个JDBC工具,可以用来运行脚本或者交互查询。
dblook:它是一个数据定义语
言生成工具。
5.自学
本部分包括了四方面的内容:
1>  使用ij工具来加载Derby嵌入式驱动,并启动Derby数据库引擎。创建firstdb数据库以及FIRSTTABLE表。使用基本的SQL语句进行插入和选择数据。Derby的日志信息保存在derby.log文件中。
2>  使用Derby的客户端/服务器配置。启动Derby网络服务器,在单独的进程中使用ij工具加载Derby客户端驱动,并连接到网络服务器,创建seconddb数据库和SECONDTABLE表,并使用基本的SQL语句插入和选择数据。
3>  在简单的Java JDBC程序中加载Derby数据库引擎,使用嵌入式驱动来创建jdbcDemoDB,以及WISH_LIST表。使用键盘输入的内容作为数据库表的数据。然后查看数据库中的数据。通过查看代码来了解基本的JDBC访问Derby数据库的方式。介绍了CLASSPATH和连接URL属性,shutdown=true.
4>  将3>中的应用程序修改加载客户端驱动来连接Derby网络服务器。
Part1
创建derbytutor目录
D:\common\apache-db-derby-10.4.1.3-bin>md derbytutor
D:\common\apache-db-derby-10.4.1.3-bin>cd derbytutor
将样例sql脚本拷贝到当前目录
D:\common\apache-db-derby-10.4.1.3-bin\derbytutor>copy %DERBY_HOME%\demo\programs\toursdb\*.sql .
D:\common\apache-db-derby-10.4.1.3-bin\demo\programs\toursdb\ToursDB_schema.sql
……
已复制        10 个文件。
D:\common\apache-db-derby-10.4.1.3-bin\derbytutor>ij
ij 版本 10.4
连接到嵌入式的Derby数据库,如果数据库不存在,就创建
connect为ij的命令,用于创建数据库连接
jdbc:derby是Derby驱动的JDBC协议
firstdb是数据库的名称。由于没有指定文件路径,所以数据库就在当前的目录中创建,数据库的内容存储在子目录firstdb中。
ij> connect 'jdbc:derby:firstdb;create=true';
创建第一张表
ij> create table firsttable(id int primary key,name varchar(12));
已插入/更新/删除 0 行
ij> insert into firsttable values(10,'TEN');
已插入/更新/删除 1 行
ij> select * from firsttable;
ID        |NAME
------------------------
10        |TEN
已选择 1 行
加载脚本
ij> run 'ToursDB_schema.sql';
ij> -- Licensed to the Apache Software Foundation (ASF) under one or more
-- contributor license agreements.  See the NOTICE file distributed with
-- this work for additional information regarding copyright ownership.
-- The ASF licenses this file to You under the Apache License, Version 2.0
-- (the "License"); you may not use this file except in compliance with
-- the License.  You may obtain a copy of the License at
--
--    /licenses/LICENSE-2.0
-
-
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY K
IND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
AUTOCOMMIT OFF;
ij> CREATE TABLE AIRLINES
(
AIRLINE CHAR(2) NOT NULL ,
AIRLINE_FULL VARCHAR(24),
BASIC_RATE DOUBLE PRECISION,
DISTANCE_DISCOUNT DOUBLE PRECISION,
BUSINESS_LEVEL_FACTOR DOUBLE PRECISION,
FIRSTCLASS_LEVEL_FACTOR DOUBLE PRECISION,
ECONOMY_SEATS INTEGER,
BUSINESS_SEATS INTEGER,
FIRSTCLASS_SEATS INTEGER
);
已插入/更新/删除 0 行
……
ij> COMMIT;
ij> exit;
Part2
这里我们需要启动两个windows命令行提示符,一个用于运行Derby网络服务器,医用用于运行Derby客户端。
首先打开一个windows命令行提示符窗口,运行如下的命令:
D:\common\apache-db-derby-10.4.1.3-bin\derbytutor>java -jar %derby_home%/lib/derbyrun.jar server start
已使用基本服务器安全策略安装了安全管理程序。
Apache Derby Network Server - 10.4.1.3 - (648739) 已启动并且已准备好 2008-08-20
07:19:10.375 GMT 时在端口 1527 上接受连接
此时就已经启动了Derby网络服务器。
然后启动第二个windows命令行提示符窗口,进行如下的操作:
D:\common\apache-db-derby-10.4.1.3-bin\derbytutor>ij
ij 版本 10.4
连接到服务器,客户端连接的URL包含了主机名和端口号。
ij> connect 'jdbc:derby://localhost:1527/seconddb;create=true';
ij> exit;
其他创建表等操作都是一样的。
Part3
笔者使用了Eclipse创建了Java工程,将
%DERBY_HOME%\demo\programs\workingwithderby下面的Java源代码拷贝到了工程下,并将derby.jar添加到工程的CLASSPATH中。
使用如下的方式创建数据库连接:
// ## DEFINE VARIABLES SECTION ##
// define the driver to use
String driver = "org.apache.derby.jdbc.EmbeddedDriver";
// the database name
String dbName = "jdbcDemoDB";
// define the Derby connection URL to use
String connectionURL = "jdbc:derby:" + dbName + ";create=true";
Connection conn = null;
// Beginning of JDBC code sections
// ## LOAD DRIVER SECTION ##
try {
/
*
* Load the Derby driver. When the embedded Driver is used this
* action start the Derby engine. Catch an error and suggest a
* CLASSPATH problem
*/
Class.forName(driver);
System.out.println(driver + " loaded. ");
} catch (java.lang.ClassNotFoundException e) {
}
// Beginning of Primary DB access section
// ## BOOT DATABASE SECTION ##
try {
// Create (if needed) and connect to the database
conn = Connection(connectionURL);
至此获取到了连接到Derby数据库的Connection对象,其他的操作就是JDBC的基本操作了。
Part4
使用JDBC连接Derby服务器模式的数据库与连接嵌
入式模式的数据库类似,只是驱动程序和连接的URL发生了变化:
String driver = "org.apache.derby.jdbc.ClientDriver";
// the database name
String dbName = "jdbcDemoDB";
// define the Derby connection URL to use
String connectionURL = "jdbc:derby://localhost:1527/" + dbName
+ ";create=true";
其他的操作完全一致。
6.Derby提供的类库
引擎类库
derby.jar:用于嵌入式数据库。
对于嵌入式环境,改类库总是必须的。对于客户端/服务器环境,只需要将该类库放在服务器上。
工具
对于嵌入式环境,需要在classpath中追加类库来使用工具,对于客户端/服务器环境,只需要在客户端追加该类库。
derbytools.jar:运行所有的Derby工具(ij,dblook,import/export)都需要改类库。
derbyrun.jar:用于启动Derby工具的可运行jar文件。
网络服务器类库
derbynet.jar:用于启动Derby网络服务器。
网络客户端类库
derbyclient.jar:作为Derby网络客户端驱动程序。
本地化类库
* derbyLocale_cs.jar
* derbyLocale_de_DE.jar
* derbyLocale_es.jar
* derbyLocale_fr.jar
* derbyLocale_it.jar
* derbyLocale_hu.jar
* derbyLocale_ja_JP.jar
* derbyLocale_ko_KR.jar
* derbyLocale_pl.jar
* derbyLocale_pt_BR.jar
* derbyLocale_ru.jar
* derbyLocale_zh_CN.jar
* derbyLocale_zh_TW.jar
未指定的区域提供特定语言的消息。
文章出处:www.diybl/course/3_program/java/javaxl/2008821/136732.html
// delete the table
System.out.println("Dropped table hellotable");
rs.close();
s.close();
System.out.println("Closed result set and statement");
connmit();
conn.close();
System.out.println("Committed transaction and closed connection");
try { // perform a clean shutdown
} catch (SQLException se) {
System.out.println("Database shut down normally");
}
} catch (Throwable e) {
// handle the exception
}
System.out.println("SimpleApp finished");
}
}
随后,我们在命令行(本例为 Windows 平台,当然,其它系统下稍作改动即可)下键入以下命令:
清单 2. 运行 HelloJavaDB 命令
java –cp .;%JAVA_HOME%dblibderby.jar HelloJavaDB
图 1. HelloJavaDB 程序的执行结果
上述的程序和以往没什么区别。不同的是我们不需要再为 DBMS 的配置而劳神,因为 Derby 已经自动地在当前目录下新建了一
个名为 helloDB 的目录,来物理地存储数据和日志。需要做的只是注意命名问题:在内嵌模式下驱动的名字应为 org.apache.derby.jdbc.EmbeddedDriver;创建一个新数据库时需要在协议后加入 create=true。另外,关闭所有数据库以及 Derby 的引擎可以使用以下代码:
清单 3. 关闭所有数据库及 Derby 引擎
如果只想关闭一个数据库,那么则可以调用:
清单 4. 关闭一个数据库
这样,使用嵌入模式的 Derby 维护和管理数据库的成本接近于 0。这对于希望专心写代码的人来说不失为一个好消息。然而有人不禁要问:既然有了内嵌模式,为什么大多数的 DBMS 都没有采取这样的模式呢?不妨做一个小实验。当我们同时在两个命令行窗口下运行 HelloJavaDB 程序。结果一个的结果与刚才一致,而另一个却出现了错误,如 图 2 所示。
图 2. 内嵌模式的局限
错误的原因其实很简单:在使用内嵌模式时,Derby 本身并不会在一个独立的进程中,而是和应用程序一起在同一个 Java 虚拟机(JVM)里运行。因此,Derby 如同应用所使用的其它 jar 文件一样变成了应用的一部分。这就不难理解为什么在 classpath 中加入 derby 的 jar 文件,我们的示例程序就能够顺利运行了。这也说明了只有一个 JVM 能够启动数据库:而两个跑在不同 JVM 实例里的应用自然就不能够访问同一个数据库了。
鉴于上述的局限性,和来自不同 JVM 的多个连接想访问一个数据库的需求,下一节将介绍 Derby 的另一种模式:网络服务器(Network Server)。
网络服务器模式
如上所述,网络服务器模式是一种更为传统的客户端/服务器模式。我们需要启动一个 Derby 的网络服务器用于处理客户端的请求,不论这些请求是来自同一个 JVM 实例,还是来自于网络上的另一台机器。同时,客户端使用 DRDA(Distributed Relational Database Architecture)协议连接到服务器端。这是一个由 The Open Group 倡导的数据库交互标准。图 3 说明了该模式的大体结构。
由于 Derby 的开发者们努力使得网络服务器模式与内嵌模式之间的差异变小,使得我们只需简单地修改
清单 1 中的程序就可以实现。如 清单 5所示,我们在 HelloJavaDB 中增添了一个新的函数和一些字符串变量。不难看出,新的代码只是将一些在 上一节中特别指出的字符串进行了更改:驱动类为 org.apache.derby.jdbc.ClientDriver,而连接数据库的协议则变成了 jdbc:derby://localhost:1527/。这是一个类似 URL 的字符串,而事实上,Derby 网络的客户端的连接格式为:jdbc:derby://server[:port]/databaseName[;attributeKey=valu
e]。在这个例子中,我们使用了最简单的本地机器作为服务器,而端口则是 Derby 默认的 1527 端口。
图 3. Derby 网络服务器模式架构
清单 5. 网络服务器模式下的 HelloJavaDB
public class HelloJavaDB {
public static String driver = "org.apache.derby.jdbc.EmbeddedDriver";
public static String protocol = "jdbc:derby:";
public static void main(String[] args) {
// same as before
}
private static void parseArguments(String[] args) {
if (args.length == 0 || args.length > 1) {
return;
}
if (args[0].equalsIgnoreCase("derbyclient")) {
framework = "derbyclient";
driver = "org.apache.derby.jdbc.ClientDriver";
protocol = "jdbc:derby://localhost:1527/";
}
}
}
当然,仅仅有客户端是不够的,我们还需要启动网络服务器。Derby 中控制网络服务器的类是 org.apache.derby.drda.NetworkServerControl,因此键入以下命令即可。如果想了解 NetworkServerControl 更多的选项,只要把 start 参数去掉就可以看到帮助信息了。关于网络服务器端的实现,都被 Derby 包含在 derbynet.jar 里。
清单 6. 启动网络服务器
java -cp .;"C:Program FilesJavajdk1.6.0dblibderby.jar";
"C:Program FilesJavajdk1.6.0dblibderbynet.jar"
org.apache.derby.drda.NetworkServerControl start
相对应的,网络客户端的实现被包含在 derbyclient.jar 中。所以,只需要在 classpath 中加入该 jar 文件,修改后的客户端就可以顺利地读取数据了。再一次尝试着使用两个命令行窗口去连接数据库,就能够得到正确的结果了。如果不再需要服务器,那么使用 NetworkServerControl 的 shutdown 参数就能够关闭服务器。
更多
至此,文章介绍了 Java SE 6 中的新成员:Java DB(Derby),也介绍了如何在内嵌模式以及网络服务器模式下使用 Java DB。当然这只是浅尝辄止,更多高级的选项还需要在 Sun 和 Derby 的文档中寻。在这一章的最后,我们将简单介绍几个 Java DB 的小工具来加快开发速度。它们都位于 org.ls 包内,在开发过程中需要获取信息或者测试可以用到。
? ij:一个用来运行 SQL 脚本的工具;
? dblook:为 Derby 数据库作模式提取(Schema extraction),生成 DDL 的工具;
? sysinfo:显示系统以及 Derby 信息的工具类;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。