开始编写 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