Java教程适用于JDK 8。本页中描述的示例和实践不利用后续版本引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改以了解Java SE 9及后续版本中更新的语言特性的摘要。
请参阅JDK发行说明以获取有关所有JDK版本的新功能、增强功能和已删除或不推荐选项的信息。
注意: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 anArray = con.createArrayOf("VARCHAR", northEastRegion);
Oracle数据库JDBC驱动程序使用oracle.sql.ARRAY
类来实现java.sql.Array
接口。
与JDBC 4.0大对象接口(Blob
、Clob
、NClob
)一样,您可以在不将所有数据从数据库服务器传输到客户端计算机的情况下操作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
可以用来在服务器上操作数组。
在下面的行中,getArray
是Array.getArray
方法,而不是前一行中使用的ResultSet.getArray
方法。因为Array.getArray
方法返回Java编程语言中的Object
,而每个邮政编码是一个String
对象,所以结果在分配给变量zips
之前被转换为String
对象的数组。
String[] zips = (String[])z.getArray();
Array.getArray
方法将SQL ARRAY
元素在客户端作为String
对象的数组实例化。因为实际上变量zips
包含数组的元素,所以可以在for
循环中迭代zips
,查找无效的邮政编码。
使用PreparedStatement.setArray
和PreparedStatement.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.updateArray
和PreparedStatement.updateObject
方法用Array
值更新表中的列。
Array
对象在它们被创建的事务的持续时间内保持有效。在长时间运行的事务中,这可能导致应用程序资源耗尽。应用程序可以通过调用它们的free
方法来释放Array
资源。
在以下摘录中,调用Array.free
方法释放先前创建的Array
对象所持有的资源。
Array aArray = con.createArrayOf("VARCHAR", northEastRegionnewYork); // ... aArray.free();
Array aArray = con.createArrayOf("VARCHAR", northEastRegionnewYork); // ... aArray.free();