使用数组对象
注意 :MySQL 和 Java DB 当前不支持ARRAY
SQL 数据类型。因此,没有 JDBC 教程示例可用来演示Array
JDBC 数据类型。
涵盖以下主题:
创建数组对象
使用方法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 aArray = con.createArrayOf("VARCHAR", northEastRegionnewYork);
Oracle 数据库 JDBC 驱动程序通过oracle.sql.ARRAY
类实现java.sql.Array
interface。
检索和访问 ResultSet 中的数组值
与 JDBC 4.0 大对象interface(Blob
,Clob
,NClob
)一样,您可以操作Array
对象,而不必将其所有数据从数据库服务器带到 Client 端计算机。 Array
对象具体化了表示为结果集或 Java 数组的 SQL ARRAY
。
以下摘录检索列ZIPS
中的 SQL ARRAY
值,并将其分配给java.sql.Array
对象z
对象。摘录检索z
的内容并将其存储在zips
中,Java 数组包含String
类型的对象。摘录遍历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])) {
// ...
// Code to display warning
}
}
}
在以下语句中,ResultSet
方法getArray
返回存储在当前行的列ZIPS
中的值作为java.sql.Array
对象z
:
Array z = rs.getArray("ZIPS");
变量z
包含一个定位符,它是指向服务器上 SQL ARRAY
的逻辑指针;它不包含ARRAY
本身的元素。作为逻辑指针,z
可用于操纵服务器上的阵列。
在下一行中,getArray
是Array.getArray
方法,而不是上一行中使用的ResultSet.getArray
方法。由于Array.getArray
方法以 Java 编程语言返回Object
,并且每个邮政编码都是String
对象,因此在将结果赋给变量zips
之前,将结果强制转换为String
对象的数组。
String[] zips = (String[])z.getArray();
Array.getArray
方法将 Client 端上的 SQL ARRAY
元素具体化为String
对象的数组。实际上,由于变量zips
包含数组的元素,因此可以在for
循环中循环访问zips
,以查找无效的邮政编码。
存储和更新阵列对象
使用方法PreparedStatement.setArray
和PreparedStatement.setObject
将Array
值作为 Importing 参数传递给PreparedStatement
对象。
以下示例将Array
对象northEastRegion
(在上一个示例中创建)设置为 PreparedStatement pstmt
的第二个参数:
PreparedStatement pstmt = con.prepareStatement(
"insert into REGIONS (region_name, zips) " + "VALUES (?, ?)");
pstmt.setString(1, "NorthEast");
pstmt.setArray(2, northEastRegion);
pstmt.executeUpdate();
同样,使用方法PreparedStatement.updateArray
和PreparedStatement.updateObject
用Array
值更新表中的列。
释放阵列资源
Array
对象至少在创建它们的 Transaction 期间保持有效。在 Long 期运行的事务中,这可能导致应用程序资源不足。应用程序可以通过调用free
方法来释放Array
资源。
在以下摘录中,调用方法Array.free
以释放为先前创建的Array
对象保留的资源。
Array aArray = con.createArrayOf("VARCHAR", northEastRegionnewYork);
// ...
aArray.free();