论坛首页 Java企业应用论坛

用Apache Derby进行Java数据库开发-离线开发

浏览 1560 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-04-10   最后修改:2010-04-10

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

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics