用Apache Derby进行Java数据库开发-离线开发
开始编写 Java 代码之前,请先参考另一篇文章 Apache Derby 入门,用Apache Derby构建脱机Ajax。首先应该了解 JDBC API 的性质,JDBC 是正式的 Java Database Connectivity API,而且从 Java Development Kit 的 1.1 版本开始就存在了。JDBC API 包含在 java.sql 包中,如果仔细观察,您会发现这个 API 主要由接口组成。因此,创建数据库 JDBC 驱动程序的实际工作由数据库厂商(或第三方)负责,他们必须提供实现这些接口的 Java 类。javax.sql 包中的 JDBC API 扩展提供更高级的功能。
关于 JDBC 还有最后一点要注意:Java 应用程序和数据库之间的连接由 JDBC 驱动程序控制。原来有 4 种 JDBC 驱动程序类型,由它们的类型号区分:1、2、3 或 4。类型与 Java 应用程序和数据库进行通信所用的技术对应。当今的大多数驱动程序(包括用来连接 Derby 数据库的驱动程序)是 Type 4 驱动程序,这意味着它们是完全用 Java 语言编写的,它们直接将 JDBC API 转换为厂商特定的数据库协议。对于 Derby 数据库,这个过程就更简单了,因为 Derby 是用 Java 语言编写的!
private static final String driver = "org.apache.derby.jdbc.EmbeddedDriver";
private static final String url = "jdbc:derby:test;create=true";
public static void main(String[] args) {
Connection con = null;
DatabaseMetaData dbmd = null;
try {
Class.forName(driver);
con = DriverManager.getConnection(url);
// Use the database connection somehow.
} catch (SQLException se) {
printSQLException(se);
} catch (ClassNotFoundException e) {
System.out.println("JDBC Driver " + driver
+ " not found in CLASSPATH");
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException se) {
printSQLException(se);
}
}
}
}
DatabaseMetaData dbmd = null ;
dbmd = con.getMetaData() ;
System.out.println("\n----------------------------------------------------") ;
System.out.println("Database Name = " + dbmd.getDatabaseProductName()) ;
System.out.println("Database Version = " + dbmd.getDatabaseProductVersion()) ;
System.out.println("Driver Name = " + dbmd.getDriverName()) ;
System.out.println("Driver Version = " + dbmd.getDriverVersion()) ;
System.out.println("Database URL = " + dbmd.getURL()) ;
如前面的示例所示,为了访问适当的元数据,首先要从当前的 JDBC Connection 创建一个新的 DatabaseMetaData 对象。然后,可以调用 Apache Derby JDBC 驱动程序提供的许多元数据函数。在这个示例中,检索了正在访问的数据库的名称和产品版本号、用来访问数据库的 JDBC 驱动程序的名称和版本号以及标识已经连接到的数据库的完整 JDBC URL。如果要开发的数据库应用程序必须与许多不同的数据库或 JDBC 驱动程序进行交互,那么数据库元数据是最有用的。在这种情况下,可以使用元数据在运行时判断特定数据库和 JDBC 驱动程序的能力。
private static void printSQLException(SQLException se) {
while(se != null) {
System.out.print("SQLException: State: " + se.getSQLState());
System.out.println("Severity: " + se.getErrorCode());
System.out.println(se.getMessage());
se = se.getNextException();
}
}
private static void printSQLWarning(SQLWarning sw) {
while(sw != null) {
System.out.print("SQLWarning: State=" + sw.getSQLState()) ;
System.out.println(", Severity = " + sw.getErrorCode()) ;
System.out.println(sw.getMessage());
sw = sw.getNextWarning();
}
}
处理 SQL 异常和 SQL 警告是相似的。SQLWarning 类继承自 SQLException 类;但是 SQL 警告不如 SQL 异常那么严重,所以更好的方法是分别处理它们。这两个函数都声明为 private static,因此可以从 main 方法中调用它们,但是不能从其他类调用。在生产性代码中,可以根据程序的需求修改这一声明。
在这两个函数中,循环处理警告或异常。这在一般的错误处理场景中可能有点儿奇怪,但是在涉及数据库编程时就很常见了。出现多个警告或异常的原因很简单:在数据库中事件常常连接在一起。例如,如果在数据库中插入多行,而且它们都由于列数据类型或名称不匹配而无法插入,那么就会有多个错误。为了正确地考虑所有错误,需要能够将异常连接在一起,从而让进行调用的代码知道数据库遇到的所有问题。为了简化,Apache Derby 总是将最重要的异常放在异常链的开头。
在循环中,输出错误或警告信息。SQL 状态是一个五字符的字符串,它符合 X/OPEN Common Application Environment(CAE)规范、Data Management: SQL, Version 2 SQL 规范或 SQL99 标准约定,使程序能够从特定的数据库错误中恢复过来。SQL 状态的前两个字符是一个类值,后三个字符形成子类值。SQL 状态为 00000 值就表示成功,类值为 01 就表示警告,比如数据截断。SQL 编码是与数据库相关的值。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.DatabaseMetaData;
public class FirstConnect {
private static final String driver = "org.apache.derby.jdbc.EmbeddedDriver" ;
private static final String url = "jdbc:derby:test;create=true" ;
static void printSQLException(SQLException se) {
while(se != null) {
System.out.print("SQLException: State: " + se.getSQLState());
System.out.println("Severity: " + se.getErrorCode());
System.out.println(se.getMessage());
se = se.getNextException();
}
}
static void printSQLWarning(SQLWarning sw) {
while(sw != null) {
System.out.print("SQLWarning: State=" + sw.getSQLState()) ;
System.out.println(", Severity = " + sw.getErrorCode()) ;
System.out.println(sw.getMessage());
sw = sw.getNextWarning();
}
}
public static void main(String[] args) {
Connection con = null ;
DatabaseMetaData dbmd = null ;
try {
Class.forName(driver) ;
con = DriverManager.getConnection(url);
SQLWarning swarn = con. getWarnings() ;
if(swarn != null){
printSQLWarning(swarn) ;
}
dbmd = con.getMetaData() ;
System.out.println("\n----------------------------------------------------") ;
System.out.println("Database Name = " + dbmd.getDatabaseProductName()) ;
System.out.println("Database Version = " + dbmd.getDatabaseProductVersion()) ;
System.out.println("Driver Name = " + dbmd.getDriverName()) ;
System.out.println("Driver Version = " + dbmd.getDriverVersion()) ;
System.out.println("Database URL = " + dbmd.getURL()) ;
System.out.println("----------------------------------------------------") ;
} catch (SQLException se) {
printSQLException(se) ;
} catch(ClassNotFoundException e){
System.out.println("JDBC Driver " + driver + " not found in CLASSPATH") ;
}
finally {
if(con != null){
try{
con.close() ;
} catch(SQLException se){
printSQLException(se) ;
}
}
}
}
}
Apache Derby下载地址
另一篇文章:用Apache Derby构建脱机Ajax
页:
[1]