文档

Java™ 教程
隐藏目录
使用数组对象
路径: JDBC数据库访问
课程: JDBC基础知识

使用数组对象

注意:MySQL和Java DB目前不支持ARRAY SQL数据类型。因此,没有可用的JDBC教程示例来演示Array JDBC数据类型。

以下主题将被涵盖:

创建Array对象

使用方法Connection.createArrayOf来创建Array对象。

例如,假设您的数据库包含一个名为REGIONS的表,该表已创建并使用以下SQL语句填充;请注意,这些语句的语法将根据您的数据库而有所不同:

create table REGIONS
    (REGION_NAME varchar(32) NOT NULL,
    ZIPS varchar32 ARRAY[10] NOT NULL,
    PRIMARY KEY (REGION_NAME));

insert into REGIONS values(
    'Northwest',
    '{"93101", "97201", "99210"}');
insert into REGIONS values(
    'Southwest',
    '{"94105", "90049", "92027"}');
Connection con = DriverManager.getConnection(url, props);
String [] northEastRegion = { "10022", "02110", "07399" };
Array anArray = con.createArrayOf("VARCHAR", northEastRegion);

Oracle数据库JDBC驱动程序使用oracle.sql.ARRAY类来实现java.sql.Array接口。

在ResultSet中检索和访问Array值

与JDBC 4.0大对象接口(BlobClobNClob)一样,您可以在不将所有数据从数据库服务器传输到客户端计算机的情况下操作Array对象。一个Array对象将其表示为结果集或Java数组的SQL ARRAY

以下摘录从列ZIPS中检索SQL ARRAY值,并将其赋给java.sql.Array对象z。摘录检索z的内容并将其存储在zips中,zips是一个包含String类型对象的Java数组。摘录遍历zips数组,并检查每个邮政(邮编)代码是否有效。该代码假设之前已经定义了类ZipCode,其中方法isValid返回true,如果给定的邮政编码与有效邮政编码的主列表中的一个匹配:

ResultSet rs = stmt.executeQuery(
    "SELECT region_name, zips FROM REGIONS");

while (rs.next()) {
    Array z = rs.getArray("ZIPS");
    String[] zips = (String[])z.getArray();
    for (int i = 0; i < zips.length; i++) {
        if (!ZipCode.isValid(zips[i])) {
            // ...
            // 代码来显示警告
        }
    }
}

在下面的语句中,ResultSet方法getArray将当前行的列ZIPS中存储的值作为java.sql.Array对象z返回:

Array z = rs.getArray("ZIPS");

变量z包含一个定位器,它是一个指向服务器上SQL ARRAY的逻辑指针;它不包含ARRAY本身的元素。作为一个逻辑指针,z可以用来在服务器上操作数组。

在下面的行中,getArrayArray.getArray方法,而不是前一行中使用的ResultSet.getArray方法。因为Array.getArray方法返回Java编程语言中的Object,而每个邮政编码是一个String对象,所以结果在分配给变量zips之前被转换为String对象的数组。

String[] zips = (String[])z.getArray();

Array.getArray方法将SQL ARRAY元素在客户端作为String对象的数组实例化。因为实际上变量zips包含数组的元素,所以可以在for循环中迭代zips,查找无效的邮政编码。

存储和更新数组对象

使用PreparedStatement.setArrayPreparedStatement.setObject方法将Array值作为输入参数传递给PreparedStatement对象。

以下示例将Array对象anArray(在之前的示例中创建)设置为PreparedStatement pstmt的第二个参数:

PreparedStatement pstmt = con.prepareStatement(
    "insert into REGIONS (region_name, zips) " + "VALUES (?, ?)");
pstmt.setString(1, "NorthEast");
pstmt.setArray(2, anArray);
pstmt.executeUpdate();

类似地,使用PreparedStatement.updateArrayPreparedStatement.updateObject方法用Array值更新表中的列。

释放数组资源

Array对象在它们被创建的事务的持续时间内保持有效。在长时间运行的事务中,这可能导致应用程序资源耗尽。应用程序可以通过调用它们的free方法来释放Array资源。

在以下摘录中,调用Array.free方法释放先前创建的Array对象所持有的资源。

Array aArray = con.createArrayOf("VARCHAR", northEastRegionnewYork);
// ...
aArray.free();
Array aArray = con.createArrayOf("VARCHAR", northEastRegionnewYork);
// ...
aArray.free();

上一页:使用SQLXML对象
下一页:使用DISTINCT数据类型