Apache Derby 进行 Java 数据库开发Word文件下载.docx
《Apache Derby 进行 Java 数据库开发Word文件下载.docx》由会员分享,可在线阅读,更多相关《Apache Derby 进行 Java 数据库开发Word文件下载.docx(73页珍藏版)》请在冰豆网上搜索。
原来有4种JDBC驱动程序类型,由它们的类型号区分:
1、2、3或4。
类型与Java应用程序和数据库进行通信所用的技术对应。
当今的大多数驱动程序(包括用来连接Derby数据库的驱动程序)是Type4驱动程序,这意味着它们是完全用Java语言编写的,它们直接将JDBCAPI转换为厂商特定的数据库协议。
对于Derby数据库,这个过程就更简单了,因为Derby是用Java语言编写的!
ApacheDerby和JDBC
既然您熟悉了JDBC的基本概念,就可以开始学习如何使用Java编程语言连接嵌入式ApacheDerby数据库。
但是首先,必须安装并运行ApacheDerby软件,其过程见系列的第一篇文章。
如果还没有执行这个关键的步骤,那么请阅读第一篇文章并下载和安装Derby软件。
在安装Derby数据库软件之后,可以使用本文附带的示例代码连接Derby数据库,见清单1。
清单1.执行示例代码
rb$mkdirderbyWork
rb$cdderbyWork/
rb$unzip../derby9.zip
Archive:
../derby9.zip
inflating:
FirstConnect.java
rb$ls
FirstConnect.java
rb$javacFirstConnect.java
rb$javaFirstConnect
----------------------------------------------------
DatabaseName=ApacheDerby
DatabaseVersion=10.1.2.1
DriverName=ApacheDerbyEmbeddedJDBCDriver
DriverVersion=10.1.2.1
DatabaseURL=jdbc:
derby:
test
rb$javaFirstConnect
SQLWarning:
State=01J01,Severity=10000
Database'
test'
notcreated,connectionmadetoexistingdatabaseinstead.
rb$ls
FirstConnect.classderby.log
FirstConnect.javatest
如果数据库无法运行,应该怎么办
尽管第一个数据库连接示例非常简单,但是有时候仍然可能出问题。
在使用Java编程语言时,最可能出现的问题是必要的类文件不在CLASSPATH中。
例如,如果代码已经编译了,但是在尝试运行它时出现错误消息JDBCDriverorg.apache.derby.jdbc.EmbeddedDrivernotfoundinCLASSPATH,那么就需要将derby.jar文件添加到CLASSPATH中。
本系列中的第一篇文章讨论了这个问题。
其他错误可能是由于忘了使用javac工具编译Java源代码,或者是在错误的目录中进行了编译。
在第一个示例中,创建一个用来开发和执行数据库应用程序代码的干净的工作空间。
首先创建一个新目录,将本文提供的代码文件提取到这个目录中。
在编译和执行之前,使用ls命令确认这个目录只包含本文中解释的Java源代码。
下一个步骤是使用Java编译器创建Java字节码文件,在下一步中Java虚拟机(JavaVirtualMachine,JVM)将执行这个文件。
如果成功地编译了源代码,就可以在JVM中执行字节码。
这会调用FirstConnect类的main方法,生成与这里相似的输出;
如果在这个过程中遇到了问题,请参见边栏如果数据库无法运行,应该怎么办。
这段Java代码首先使用ApacheDerby嵌入式JDBC驱动程序创建test数据库,然后创建到这个数据库的连接。
为了演示这段代码如何处理SQL警告和错误,可以再次执行代码,这会首先显示警告消息,指出没有创建数据库(因为数据库已经存在),然后是与前面一样的关于数据库和JDBC驱动程序的标准信息。
在这个示例的结尾,再次显示工作目录的内容,这会显示编译后的Java类文件和新的数据库文件。
最后一点很重要:
在将ApacheDerby用作嵌入式数据库时,数据库文件的默认位置是在代码所在的目录中。
如果这不是您希望的位置,那么需要修改JDBCURL来指定应该创建数据库文件的位置。
这个主题超出了本文的范围;
请参考DerbyDeveloper'
sGuide(可以通过本文的参考资料部分中Derby在线手册的链接找到这个文档)。
回页首
连接Java应用程序和Derby数据库
前一节中执行的Java代码非常简单,本文的其余部分将详细讨论这些代码。
在生产环境中,开发Java数据库应用程序可能很困难。
本文并不涉及这些细节(这些将在以后的文章中讨论),而是主要关注在Java应用程序和嵌入式ApacheDerby数据库之间建立连接的最基本的技术。
这种技术(见清单2)需要使用JDBC驱动程序实现连接协议。
清单2.使用JDBC连接Derby数据库
privatestaticfinalStringdriver="
org.apache.derby.jdbc.EmbeddedDriver"
;
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|--------XMLerror:
Thepreviouslineislongerthanthemaxof90characters---------|
privatestaticfinalStringurl="
jdbc:
test;
create=true"
publicstaticvoidmain(String[]args){
Connectioncon=null;
DatabaseMetaDatadbmd=null;
try{
Class.forName(driver);
con=DriverManager.getConnection(url);
//Usethedatabaseconnectionsomehow.
}catch(SQLExceptionse){
printSQLException(se);
}catch(ClassNotFoundExceptione){
System.out.println("
JDBCDriver"
+driver+"
notfoundinCLASSPATH"
);
}finally{
if(con!
=null){
try{
con.close();
}catch(SQLExceptionse){
}
}
关于DataSource
为了简单起见,本文只关注使用Derby嵌入式JDBC驱动程序连接嵌入式ApacheDerby数据库。
作为标准规则,连接数据库的首选JDBC解决方案是利用DataSource,这样就可以对数据库连接的细节进行抽象,比如数据库URL、驱动程序类、用户名、密码和数据库名称。
通过对特定的连接信息进行抽象,就很容易修改这些参数而不需要修改应用程序代码。
以后的文章将讲解如何对Derby使用DataSource;
但是首先了解JDBC驱动程序和DriverManager,然后再了解DataSource,这样更容易理解JDBC的基础知识。
这段示例代码首先定义两个常量,其中包含ApacheDerby嵌入式JDBC驱动程序的Java类名和JDBC数据库连接URL。
这个连接URL应该很眼熟——它与以前的文章中使用ij工具发出connect命令时使用的URL完全相同。
赋给driver的值是嵌入式驱动程序类的完全限定名称。
代码的其余部分包含在main方法中;
它使用JVM中的默认类装载器寻找并实例化前面定义的driver类(通过使用Class.forname方法)。
这个方法寻找Derby嵌入式驱动程序的类文件(这个文件必须在CLASSPATH中存在),然后将它装载到JVM中。
在装载过程中,会处理这个类的静态部分,这会向JDBCDriverManager对象注册这个驱动程序。
DriverManager作为一个工厂对象。
给出一个数据库URL,DriverManager就会使用适当的JDBC驱动程序返回一个数据库连接。
这个步骤在下一行代码中执行,在这里使用前面定义的URL从DriverManager请求一个JDBCconnection。
您肯定会注意到,连接请求被包围在try...catch块中,而且在finally块中在连接上调用close方法。
本文后面的当出现错误时一节会讨论这两个主题。
由于篇幅的限制,本文无法全面讨论用JDBC建立数据库连接的不同方式。
例如,这个示例没有使用任何安全信息,比如用户名或密码。
以后的文章将研究其他数据库连接技术(参见边栏关于DataSource)。
如果想提前了解这些技术,那么请参考本文参考资料部分链接的DerbyDeveloper'
sGuide。
数据库元数据
如果您从来没有遇到过元数据,那么它看起来似乎是一个奇怪的概念。
但它实际上很简单:
元数据(Metadata)就是描述数据的数据。
在数据库的上下文中,元数据描述特定的数据库,比如数据库的名称、它的版本号或建立连接的JDBC驱动程序的名称。
通过调用DatabaseMetaData对象中的适当方法在JDBC中访问数据库元数据,见清单3。
清单3.操作数据库元数据
dbmd=con.getMetaData();
System.out.println("
\n----------------------------------------------------"
DatabaseName="
+dbmd.getDatabaseProductName());
DatabaseVersion="
+dbmd.getDatabaseProductVersion());
DriverName="
+dbmd.getDriverName());
DriverVersion="
+dbmd.getDriverVersion());
DatabaseURL="
+dbmd.getURL());
----------------------------------------------------"
如前面的示例所示,为了访问适当的元数据,首先要从当前的JDBCConnection创建一个新的DatabaseMetaData对象。
然后,可以调用ApacheDerbyJDBC驱动程序提供的许多元数据函数(完整的列表参见本文参考资料链接的JDBC规范)。
在这个示例中,检索了正在访问的数据库的名称和产品版本号、用来访问数据库的JDBC驱动程序的名称和版本号以及标识已经连接到的数据库的完整JDBCURL。
如果要开发的数据库应用程序必须与许多不同的数据库或JDBC驱动程序进行交互,那么数据库元数据是最有用的。
在这种情况下,可以使用元数据在运行时判断特定数据库和JDBC驱动程序的能力。
出现错误时
在操作ApacheDerby数据库时(无论是按照本系列以前文章的描述,还是采用自己的方法),您肯定遇到过数据库警告和数据库错误。
由于在数据库中存储的信息的重要性,适当地处理数据库错误和警告对于业务是很重要的。
幸运的是,正如本节其余部分所演示的,这并不困难。
第一步是学习如何查看提供给应用程序的关于数据库遇到的错误的信息,见清单4。
清单4.异常处理代码
privatestaticvoidprintSQLException(SQLExceptionse){
while(se!
=null){
System.out.print("
SQLException:
State:
"
+se.getSQLState());
Severity:
+se.getErrorCode());
System.out.println(se.getMessage());
se=se.getNextException();
privatestaticvoidprintSQLWarning(SQLWarningsw){
while(sw!
State="
+sw.getSQLState());
Severity="
+sw.getErrorCode());
System.out.println(sw.getMessage());
sw=sw.getNextWarning();
如清单4所示,处理SQL异常和SQL警告是相似的。
SQLWarning类继承自SQLException类;
但是SQL警告不如SQL异常那么严重,所以更好的方法是分别处理它们。
这两个函数都声明为privatestatic,因此可以从main方法中调用它们,但是不能从其他类调用。
在生产性代码中,可以根据程序的需求修改这一声明。
在这两个函数中,循环处理警告或异常。
这在一般的错误处理场景中可能有点儿奇怪,但是在涉及数据库编程时就很常见了。
出现多个警告或异常的原因很简单:
在数据库中事件常常连接在一起。
例如,如果在数据库中插入多行,而且它们都由于列数据类型或名称不匹配而无法插入,那么就会有多个错误。
为了正确地考虑所有错误,需要能够将异常连接在一起,从而让进行调用的代码知道数据库遇到的所有问题。
为了简化,ApacheDerby总是将最重要的异常放在异常链的开头。
在循环中,输出错误或警告信息。
SQL状态是一个五字符的字符串,它符合X/OPENCommonApplicationEnvironment(CAE)规范、DataManagement:
SQL,Version2SQL规范或SQL99标准约定,使程序能够从特定的数据库错误中恢复过来。
SQL状态的前两个字符是一个类值,后三个字符形成子类值。
SQL状态为00000值就表示成功,类值为01就表示警告,比如数据截断。
SQL编码是与数据库相关的值。
处理SQL异常很简单。
使用标准的Javatry...catch结构包围JDBC方法调用,如清单5所示。
清单5.捕获SQL异常
//ExecuteaJDBCoperation
}catch(SQLExceptionse){
如这个示例所示,通过将SQLException对象传递给前面定义的printSQLException方法来处理任何SQL异常,这会处理所有错误报告。
在处理SQL异常时,惟一的难点是正确地回收数据库资源,比如数据库连接。
因为可以在运行数据库应用程序代码的JVM之外管理连接或数据库游标这样的资源,所以应用程序必须显式地关闭这些资源。
Connection对象的close方法可以抛出SQLException,所以要将这个方法放在finally块中。
这样的话,即使发生了错误,Java应用程序也会尝试关闭数据库资源。
另一方面,必须显式地检查任何SQL警告,因为它们不会通过标准的异常处理机制传播。
为此,需要调用相关JDBC对象上的适当getWarnings方法,见清单6。
清单6.检查SQL警告
SQLWarningswarn=con.getWarnings();
if(swarn!
printSQLWarning(swarn);
正如前面所讨论的,SQL警告由printSQLWarning方法处理。
在调用这个方法之前,首先要检查是否至少有一个SQL警告;
如果有,就将第一个SQLWarning对象传递给适当的方法。
在以后的文章中会看到,许多JDBC对象都可以产生SQL警告,所以将错误和警告处理代码封装起来可以简化数据库应用程序代码的开发和维护。
将所有代码组合起来
到目前为止,本文已经讨论了使用JDBCAPI和ApacheDerby建立数据库连接所需的许多组件。
清单7中提供了完整的连接示例,它说明这些组件组合在一起可以提供大多数必要的功能。
清单7.完整的连接示例代码
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.SQLException;
importjava.sql.SQLWarning;
importjava.sql.DatabaseMetaData;
publicclassFirstConnect{
privatestaticfinalStringurl="
staticvoidprintSQLException(SQLExceptionse){
staticvoidprintSQLWarning(SQLWarningsw){
publicstaticvoidmain(String[]args){
SQLWarning