Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言特性的摘要,请参见Java语言更改。
有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息,请参见JDK发行说明。
本节介绍的高级数据类型为关系数据库提供了更多的灵活性,可以作为表列的值使用。例如,可以使用列来存储BLOB(二进制大对象)值,它可以存储大量的原始字节数据。列还可以是CLOB(字符大对象)类型,它能够以字符格式存储大量的数据。
最新版本的ANSI/ISO SQL标准通常被称为SQL:2003。该标准指定了以下数据类型:
SQL92内置类型,包括熟悉的SQL列类型,如CHAR、FLOAT和DATE
SQL99内置类型,包括SQL99添加的类型:
BOOLEAN:布尔值(true或false)
BLOB:二进制大对象
CLOB:字符大对象
SQL:2003添加的新内置类型:
XML:XML对象
用户定义的类型:
Structured类型:用户定义的类型;例如:
CREATE TYPE PLANE_POINT AS (X FLOAT, Y FLOAT) NOT FINAL
DISTINCT类型:基于内置类型的用户定义的类型;例如:
CREATE TYPE MONEY AS NUMERIC(10,2) FINAL
构造类型:基于给定基本类型的新类型:
REF(structured-type):持久地指示驻留在数据库中的结构化类型实例的指针
base-type ARRAY[n]:包含n个base-type元素的数组
定位器:实体,逻辑上指向驻留在数据库服务器上的数据的指针。定位器存在于客户端计算机上,是指向服务器上数据的瞬态逻辑指针。定位器通常指的是无法在客户端上实例化的大型数据,如图像或音频。(预先存储或“物化”为模式对象的查询结果称为“物化视图”)。在SQL级别定义了操作符,用于检索由定位器指示的数据的随机访问片段:
LOCATOR(structured-type):指向服务器中结构化实例的定位器
LOCATOR(array):指向服务器中数组的定位器
LOCATOR(blob):指向服务器中二进制大对象的定位器
LOCATOR(clob):指向服务器中字符大对象的定位器
Datalink:用于管理数据源外部数据的类型。Datalink值是SQL MED(管理外部数据)的一部分,是SQL ANSI/ISO标准规范的一部分。
JDBC API为SQL:2003标准指定的高级数据类型提供了默认映射。以下列表列出了数据类型及其映射的接口或类:
BLOB
:映射到Blob
接口CLOB
:映射到Clob
接口NCLOB
:映射到NClob
接口ARRAY
:映射到Array
接口XML
:映射到SQLXML
接口Struct
接口REF(结构化类型)
:映射到Ref
接口ROWID
:映射到RowId
接口DISTINCT
:基础类型的映射类型。例如,基于SQL的NUMERIC
类型的DISTINCT
值映射到java.math.BigDecimal
类型,因为在Java编程语言中,NUMERIC
映射到BigDecimal
。DATALINK
:映射到java.net.URL
对象您可以像处理其他数据类型一样检索、存储和更新高级数据类型。您可以使用ResultSet.getDataType
或CallableStatement.getDataType
方法来检索它们,使用PreparedStatement.setDataType
方法来存储它们,并使用ResultSet.updateDataType
方法来更新它们。(变量DataType
是映射到高级数据类型的Java接口或类的名称。)大约90%的高级数据类型操作都涉及使用getDataType
、setDataType
和updateDataType
方法。下表显示了使用哪些方法:
高级数据类型 | getDataType 方法 |
setDataType 方法 |
updateDataType 方法 |
---|---|---|---|
BLOB |
getBlob |
setBlob |
updateBlob |
CLOB |
getClob |
setClob |
updateClob |
NCLOB |
getNClob |
setNClob |
updateNClob |
ARRAY |
getArray |
setArray |
updateArray |
XML |
getSQLXML |
setSQLXML |
updateSQLXML |
Structured type |
getObject |
setObject |
updateObject |
REF(structured type) |
getRef |
setRef |
updateRef |
ROWID |
getRowId |
setRowId |
updateRowId |
DISTINCT |
getBigDecimal |
setBigDecimal |
updateBigDecimal |
DATALINK |
getURL |
setURL |
updateURL |
注意: DISTINCT
数据类型与其他高级 SQL 数据类型的行为不同。作为一个基于已存在的内置类型的用户定义类型,它在Java编程语言中没有接口。因此,您需要使用与 DISTINCT
数据类型基于的Java类型相对应的方法。有关更多信息,请参见使用 DISTINCT 数据类型。
例如,以下代码片段检索 SQL ARRAY
值。对于此示例,假设表 STUDENTS
中的列 SCORES
包含 ARRAY
类型的值。变量 stmt
是一个 Statement
对象。
ResultSet rs = stmt.executeQuery( "SELECT SCORES FROM STUDENTS " + "WHERE ID = 002238"); rs.next(); Array scores = rs.getArray("SCORES");
变量scores
是指向存储在表格STUDENTS
中学生002238
行的SQL ARRAY
对象的逻辑指针。
如果您想要将一个值存储到数据库中,您可以使用相应的set
方法。例如,下面的代码片段中,rs
是一个ResultSet
对象,它存储了一个Clob
对象:
Clob notes = rs.getClob("NOTES"); PreparedStatement pstmt = con.prepareStatement( "UPDATE MARKETS SET COMMENTS = ? " + "WHERE SALES < 1000000"); pstmt.setClob(1, notes); pstmt.executeUpdate();
此代码将notes
设置为发送到数据库的更新语句的第一个参数。通过notes
指定的Clob
值将存储在表MARKETS
的COMMENTS
列中,在该列的值小于一百万的每一行中。