java.sql.Types,数据库字段类型,java数据类型的对应关系本概述是从《JDBC TM Database Access from Java TM: A Tutorial and Annotated Reference》这本书中摘引来的。JavaSoft ⽬前正在准备这
本书。这本书是⼀本教程,同时也是 JDBC 的重要参考⼿册,它将作为 Java 系列的组成部份,在 1997 年春季由 Addison-Wesley 出版公司出版。
8.1 概述
由于 SQL 数据类型和 Java 数据类型是不同的,因此需要某种机制在使⽤ Java 类型的应⽤程序和使⽤ SQL 类型的数据库之间来读写数据。为此,JDBC 提供了getXXX和setXXX⽅法集、⽅法registerOutParameter和类Types。
本章汇集了影响各种类和接⼝的数据类型的有关信息,并列出所有的对应关系表(这些表显⽰了 SQL 类型和 Java 类型之间的映射关系)以便于参考。
8.2 将 SQL 数据类型映射为 Java 类型
不幸的是,不同数据库产品所⽀持的 SQL 类型之间有很⼤的不同。即使不同的数据库以相同的语义⽀持 SQL 类型,它们也可能⽤不同的名称。例如,绝⼤多数的主流数据库都⽀持⼀种表⽰⼤型⼆进制值的 SQL 类型,但 Oracle 把这种类型叫做LONG RAW,Sybase 把它叫
做IMAGE,Informix 却把它叫做BYTE,⽽ DB2 ⼜把它叫做LONG VARCHAR FOR BIT DATA。
幸运的是,JDBC 程序员通常并不需要⾃⼰去关⼼⽬标数据库所⽤的实际 SQL 类型的名称。⼤多数时候,JDBC 程序员将根据⼀些现有的数据库表来进⾏编程。他们⽆须关⼼⽤于创建这些表的确切 SQL 类型的名称。
JDBC 在java.sql.Types类中定义了⼀系列的常规 SQL 类型标识符。这些类型可⽤于表⽰那些最为常⽤的 SQL 类型。在⽤ JDBC API 编程时,程序员通常可以使⽤这些 JDBC 类型来引⽤⼀般的 SQL 类型,⽽⽆须关⼼⽬标数据库所⽤的确切 SQL 类型的名称。在下⼀节中将对这些 JDBC 类型进⾏仔细说明。
程序员⽤到 SQL 类型名称的主要地⽅是在⽤ SQL 的CREATE TABLE 语句创建新的数据库表时。这种情况下,程序员必须注意应该使⽤⽬标数据库所⽀持的 SQL 类型名称。如果需要知道各种 SQL 类型在某个特定的数据库中的⾏为的确切定义,我们建议查阅⼀下数据库⽂档。
如果想要编写⼀种可在各种数据库上创建表的可移植 JDBC 程序,⽤户主要有两个选择。第⼀个选择是:限制⾃⼰只使⽤那些被⼴为接受的SQL 类型名称(例如INTEGER、NUMERIC或VARCHAR)。这些类型有可能能适应所有的数据库。第⼆个选择是:
⽤java.TypeInfo⽅法来出给定的数据库实际上⽀持哪些 SQL 类型,然后选择与给定 JDBC 类型相匹配的特定于数据库的 SQL 类型名。
JDBC 定义了⼀个从 JDBC 数据库类型到 Java 类型的标准映射。例如,JDBC 的INTEGER类型通常映射为 Java 的int类型。这可⽀持简单的接⼝,将 JDBC 值读写为简单的 Java 类型。
Java 类型不必与 JDBC 类型完全形同;它们只须能够⽤⾜够的类型信息来代表 JDBC 类型,从⽽能正确地存储和取出参数和从 SQL 语句恢复结果就可以了。例如,Java String对象可能并不能精确地与任何 JDBC CHAR类型匹配,但它却可给出⾜够的类型信息来成功地表
⽰CHAR、VARCHAR或LONGVARCHAR类型。
8.3 JDBC 类型
本节描述各种 JDBC 数据类型及其与标准 SQL 类型和 Java 类型的关联⽅式。
8.3.1 CHAR、 VARCHAR 和 LONGVARCHAR
JDBC 类型CHAR、VARCHAR和LONGVARCHAR密切相关。CHAR表⽰固定长度的⼩字符串,VARCHAR表⽰长度可变的⼩字符串,
⽽LONGVARCHAR表⽰长度可变的⼤字符串。
与 JDBC CHAR对应的是 SQL CHAR类型,其定义由 SQL-92 给出,且所有主要的数据库都⽀持它。它接受⽤于指定字符串最⼤长度的参数,例如CHAR(12)即定义了⼀个长度为 12 个字符的字符串。所有主要的数据库都⽀持长度达 254 个字符的CHAR。
与 JDBC VARCHAR对应的是 SQL VARCHAR类型,其定义由 SQL-92 给出,且所有的主要数据库都⽀持它。它接受⽤于指定字符串最⼤长度的参数,例如VARCHAR(12)即定义了⼀个最⼤长度为 12 个字符的字符串。所有主要数据库都⾄少⽀持长度达 254 个字符的VARCHAR。当把字符串的值赋给VARCHAR变量时,数据库就记住该字符串的长度,使⽤SELECT 时,它可以返回准确的原始字符串。
不幸的是,对于 JDBC LONGVARCHAR类型,⽬前并没有⼀致的 SQL 映射。所有主要数据库都⽀持某种类型的长度可变的⼤字符串,这种字符串⽀持⾼达⼗亿位字节的数据,但 SQL 类型名称却变化多样。
Java 程序员不必区分CHAR、VARCHAR和LONGVARCHAR这三种类型的 JDBC 字符串。它们都可表⽰为 Java String,并且在不知道所需要的确切数据类型时也可正确读写 SQL 语句。
CHAR、VARCHAR和LONGVARCHAR可映射为String或char[],但String更适合于⼀般⽤法。同时,String类能使String和char[]之间的转换更为容易:它有⼀个⽤于将String对象转换为char[]的⽅法,还有⼀个将 char[]转换为String对象的构造函数。
必须提及的⼀个问题是:如何处理类型为CHAR(n)的固定长度的 SQL 字符串。答案是 JDBC 驱动程序(或 DBMS)将⽤适当的空格来进⾏填补。因此,当从数据库中检索CHAR(n)域时,驱动程序将把它转换为长度为n的 Java String对象,对象末尾可能含有⼀些填补空格。反之,当把String对象送到某个CHAR(n)域时,驱动程序和/或数据库将在字符串的末尾填上⼀些必要的空格,使字符串的长度达到n。
⽅法String⽤于分配和返回新的String对象。我们建议⽤它来从CHAR、VARCHAR和LONGVARCHAR域中检索数据。它适⽤于检索普通的数据,但如果⽤ JDBC 类型LONGVARCHAR来储存多个兆字节的字符串时,⽤它进⾏检索将显得⼗分笨拙。为此,ResultSet接⼝中有两个⽅法可供程序员将LONGVARCHAR值作为 Java 输⼊流进⾏检索,之后可从该流中以任意⼤⼩的块来读取数据。这两个⽅法是:getAsciiStream和getUnicodeStream,它们将把储存在LONGVARCHAR列的数据作为 Ascii 或 Unicode 字符流来传送。
8.3.2 BINARY、VARBINARY 和 LONGVARBINARY
JDBC 类型BINARY、VARBINARY和LONGVARBINARY密切相关。BINARY表⽰固定长度的⼩⼆进制值,VARBINARY表⽰长度可变化的⼩⼆进制值,⽽LONGVARBINARY表⽰长度可变化的⼤⼆进制值。
不幸的是,这些不同BINARY类型的使⽤还未被标准化,因⽽在各种主要数据库提供的⽀持有很⼤的不同。
对应于 JDBC BINARY类型的 SQL BINARY类型,是⼀种⾮标准的 SQL 扩展,只在某些数据库上才实现。它接受⽤于指定⼆进制字节数的参数。例如,BINARY(12)即定义了⼀个长度为 12 个字节的 binary 类型。通常,BINARY 值被限定在 254 个字节以内。
对应于 JDBC VARBINARY类型的 SQL VARBINARY类型,是⼀种⾮标准的 SQL 扩展,只在某些数据库上才实现。它接受⽤于指定⼆进制字节最⼤数的参数。例如,VARBINARY(12)即定义了⼀个长度最⼤可为 12 个字节的⼆进制类型。通常,VARBINARY的值被限定在 254 个字节以内。当把⼆进制的值赋给VARBINARY变量时,数据库就记住这个所赋值的长度,调⽤SELECT时,它返回准确的原始值。
遗憾的是,⽬前还没有⼀致的 SQL 类型名称与 JDBC LONGVARBINARY类型相对应。所有主要数据库都⽀持某种类型的长度可变的⼤⼆进制类型,它可⽀持⾼达⼗亿个字节的数据,但 SQL 类型名称却变化多样。
在 Java 中,BINARY、VARBINARY和LONGVARBINARY都可⽤同⼀byte数组来表⽰。由于可在不知道所需的确切BINARY数据类型的情况下正确地读写 SQL 语句,因此,Java 程序员⽆需区分它们。
检索BINARY和VARBINARY值时,我们建议使⽤Bytes。然⽽,如果类型为 JDBC LONGVARBINARY的某列储存的是⼏兆字节长度的字节数组,则建议⽤⽅法getBinaryStream来检索。与LONGVARCHAR的情形类似,该⽅法可以使 Java 程序员将LONGVARBINARY值作为Java 输⼊流检索,然后可从该流中以更⼩的块来读取。
8.3.3 BIT
JDBC 类型BIT代表⼀个位值,可为 0 或 1。SQL-92 定义了 SQL BIT类型。但与 JDBC BIT类型不同,这种 SQL-92 BIT 类型带参数,⽤于定义固定长度的⼆进制字符串。幸运的是,SQL-92 也允许⽤简单的⾮参数化的BIT类型来代表单个的⼆进制数字。这种⽤法对应于JDBC BIT类型。不幸的是,SQL-92 BIT类型只有在 “完全” SQL-92 中才要求,且⽬前只有⼀部份主流数据库⽀持它。因此,可移植的代码也许宁愿⽤ JDBC SMALLINT类型,这种类型已得到⼴泛⽀持。
JDBC BIT类型的 Java 映射的推荐类型是 Java 布尔型。
8.3.4 TINYINT
JDBC 类型TINYINT代表⼀个 8 位⽆符号整数,其值在 0 到 255 之间。
对应的 SQL 类型TINYINT⽬前只有⼀部份的数据库⽀持它。因此,可移植的代码也许宁愿⽤ JDBC SMALLINT类型,这种类型已得到⼴泛⽀持。
JDBC TINYINT类型的 Java 映射的推荐类型是 Java byte或 Java short。8 位的 Java byte类型代表⼀个有符号的整数,其值在 -128 到 127 之间,因此对于⼤的TINYINT值它并⾮总合适,⽽ 16 位的 Java short类型却总能存储所有的TINYINT值。
8.3.5 SMALLINT
JDBC 类型SMALLINT代表⼀个 16 位的有符号整数,其值在 -32768 和 32767 之间。
对应的 SQL 类型SMALLINT,其定义由 SQL- 92 给出,并为所有主流数据库所⽀持。SQL-92 标准将SMALLINT的精度留给实现去决定。但事实上,所有的主流数据库都⾄少⽀持 16 位。
JDBC SMALLINT类型的 Java 映射的推荐类型是 Java short类型。
8.3.6 INTEGER
JDBC 类型INTEGER代表⼀个 32 位的有符号整数,其值在 - 2147483648 和 2147483647 之间。
对应的 SQL 类型INTEGER,其定义由 SQL- 92 给出,并为所有主流数据库所⼴为⽀持。SQL-92 标准将INTEGER的精度留给实现去决定。但事实上,所有的主流数据库都⾄少⽀持 32 位。
INTEGER类型 Java 映射的推荐类型是 Java int类型。
8.3.7 BIGINT
JDBC 类型BIGINT代表⼀个 64 位的有符号整数,其值在 -9223372036854775808 和 9223372036854775807 之间。
对应的 SQL 类型BIGINT是 SQL 的⼀个⾮标准扩展。事实上,⽬前还没有任何数据库实现 SQL BIGINT类型。我们建议在可移植的代码中避免使⽤该类型。
BIGINT类型的 Java 映射的推荐类型是 Java long 类型。
8.3.8 REAL
JDBC 类型REAL代表⼀个有 7 位尾数的“单精度”浮点数。
对应的 SQL 类型REAL,其定义由 SQL- 92 给出。虽然未得到普遍⽀持,但在主流数据库中却已得到
⼴泛⽀持。SQL-92 标准将REAL的精度留给实现去决定。但事实上,所有的⽀持REAL类型的主流数据库都⽀持⾄少 7 位数的尾数精度。
REAL类型的 Java 映射的推荐类型为 Java float类型。
8.3.9 DOUBLE
JDBC 类型DOUBLE代表⼀个有 15 位尾数的“双精度”浮点数。
对应的 SQL 类型是DOUBLE PRECISION,其定义由 SQL- 92 给出,并为主流数据库所⼴为⽀持。SQL-92 标准将DOUBLE PRECISION的精度留给实现去决定。但事实上,所有⽀持DOUBLEPRECISION类型的主流数据库都⽀持⾄少 15 位数的尾数精度。
DOUBLE类型的 Java 映射的推荐类型为 Java double类型。
8.3.10 FLOAT
JDBC 类型FLOAT基本上与 JDBC 类型DOUBLE相同。我们同时提供了FLOAT和DOUBLE,其⽬的是与以前的 API 实现⼀致。但这却有可能产⽣误导。FLOAT代表⼀个有 15 位尾数的“双精度”浮点数。
对应的 SQL 类型FLOAT,其定义由 SQL-92 给出。SQL-92 标准将FLOAT的精度留给实现去决定。但事实上,所有⽀持FLOAT类型的主流数据库都⽀持⾄少 15 位数的尾数精度。
FLOAT类型的 Java 映射的推荐类型为 Java double类型。然⽽,由于 SQL FLOAT和单精度的 Java float类型间可能产⽣混淆,因此建议 JDBC 程序员通常选⽤ JDBC DOUBLE类型⽽不选⽤FLOAT。
8.3.11 DECIMAL 和 NUMERIC
JDBC 类型DECIMAL和NUMERIC两者⾮常相似。它们都表⽰固定精度的⼗进制值。
相应的 SQL 类型DECIMAL和NUMERIC,其定义在 SQL-92 中给出,并得到⼴泛⽀持。这些 SQL 类型都带有精度和⽐例参数。精度是所⽀持的⼗进制数字的总位数,⽐例是⼩数点后的数字位数。⽐例必须永远⼩于或等于精度。例如,值 "12.345" 有 5 位精度和 3 位⽐例,⽽值".11" 有 2 位精度和 2 位⽐例。JDBC 要求所有DECIMAL和NUMERIC类型都必须⽀持⾄少 15 位的精度和⽐例。
DECIMAL和NUMERIC之间的唯⼀区别是 SQL-92 规范要求NUMERIC类型必须以确切指定的精度来表⽰,⽽对 DECIMAL类型,它允许实现在创建该类型时所指定的精度以外再添加额外的精度。因此,创建为类型NUMERIC(12,4)的列将总是⽤ 12 位数来表⽰,⽽创建为类
型DECIMAL(12,4)的列则可⽤更⼤的位数来表⽰。
DECIMAL和NUMERIC类型的 Java 映射的推荐类型是 java.math.BigDecimal,该 Java 类型也⽤绝对精度来表⽰定点数。java.math.BigDecimal类型提供了⼀些数学操作,可对BigDecimal类型与其它的BigDecimal类型、整数类型和浮点数类型进⾏加、减、乘、除的运算。
⽤于检索DECIMAL和NUMERIC值的推荐⽅法是BigDecimal。JDBC 还允许将这些 SQL 类型作为简单的Strings或char数组来访问。因此,Java 程序员可⽤getString来检索DECIMAL或NUMERIC结果。然⽽,这将使常见的⽤DECIMAL或NUMERIC来表⽰的货币值变得极为尴尬,因为它意味着应⽤程序编程⼈员必须对字符串进⾏数学运算。当然,也可将这些 SQL 类型作为 Java 数值型类型来检索。
8.3.12 DATE、TIME 和 TIMESTAMP
有三种 JDBC 类型与时间有关:
JDBC DATE类型表⽰⼀个由年、⽉、⽇组成的⽇期。对应的是 SQL DATE 类型,其定义由 SQL-92 给出,但只有⼀部份主流数据库实现它。某些数据库提供了另外⼀些⽀持类似语义的 SQL 类型。
JDBC TIME类型表⽰⼀个由⼩时、分钟和秒组成的时间。对应的是 SQL TIME类型,其定义由 SQL-92 给出,但只有⼀部份主流数据库实现它。与DATE⼀样,某些数据库提供了另外⼀些⽀持类似语义的 SQL 类型。
JDBC TIMESTAMP类型表⽰DATE加上TIME,外加⼀个纳秒域。对应的TIMESTAMP 类型,其定义由 SQL-92 给出,但只有少数⼏个数据库实现它。
由于标准的 Java 类java.util.Date并不与这三个 JDBC ⽇期—时间类型完全匹配(它含有 DATE和TIME的信息但不含纳秒信息),因此 JDBC 定义了三个java.util.Date的⼦类与 SQL 类型对应。它们是:
java.sql.Date,对应于 SQL DATE信息。java.util.Date基本类中的⼩时、分钟和秒都设为 0。
java.sql.Time,对应于 SQL TIME信息。java.util.Date基本类中的年、⽉、⽇域设为 1970 年 1 ⽉ 1 ⽇。这是 Java 纪元的“零”⽇期。
java.sql.Timestamp,对应于 SQL TIMESTAMP信息。该类扩展了java.util.Date,添加了纳秒域。
所有这三个与时间有关的 JDBC 类都是java.util.Date的⼦类,因此它们可⽤在任何可以使⽤java.util.Date的地⽅。例如,国际化(internationalization) ⽅法将java.util.Date对象⽤作变量,因此可将这三个与时间有关的 JDBC 类中任何⼀个的实例作为参数传给国际化⽅法。
JDBC Timestamp对象除了具有其⽗类的⽇期和时间成份外,还有⼀个独⽴的纳秒组件。如果将java.sql.Timestamp对象⽤于需要java.util.Date对象的地⽅,则纳秒组件将丢失。但由于是以毫秒的精
度来储存 j ava.util.Date对象的,因此将java.sql.Timestamp对象转换为java.util.Date对象时可以保持这样的精度。这可通过将纳秒组件中的纳秒转换为毫秒(⽤纳秒数除以 1,000,000)并将之添到java.util.Date对象中来实现。转换中可能丢失⾼达 999,999 纳秒,但所产⽣的java.util.Date对象将可精确到毫秒以内。
下述代码段将java.sql.Timestamp对象转换为精度达到毫秒量级的java.util.Date对象:
Timestamp t = new Timestamp(100, 0, 1, 15, 45, 29, 987245732);
decimal是整数数据类型java.util.Date d;
d = new java.util.Time() + (t.getNanos() / 1000000));
8.4 映射⽰例
任何情况下,当 Java 程序要从数据库中检索数据时,必须存在某种形式的映射和数据转换。⼤多数时候, JDBC 程序员将在知道其⽬标数据库机制的情况下进⾏编程。例如,他们将知道数据库含有哪些表、表中每⼀列的数据类型。因此,他们可使⽤ResultSet、PreparedStatement和CallableStatement接⼝中那些与类型有关的存取⽅法。本节给出三个⽰例,描述各种情形中所要求的数据映射和转换。
8.4.1 简单的 SQL 语句
在最常见的情形中,⽤户将执⾏简单的 SQL 语句,然后取回含有结果的ResultSet对象。由数据库返回并存放在ResultSet列的值,其类型为JDBC 数据类型。调⽤XXX⽅法将把该值检索为 Java 数据类型。例如,如果某个ResultSet列含有⼀个 JDBC FLOAT值,则⽅
法getDouble将把它检索为 Java double类型。节所⽰的表显⽰了哪些 getXXX⽅法可检索哪些 JDBC 类型(如果⽤户不知道某个ResultSet列的类型,可通过调⽤MetaData ⽅法来获得有关信息,然后再调⽤ResultSetMetaData的getColumnType或getColumnTypeName⽅法)。以下代码段⽰范了如何获得结果中各列的类型名称:
String query = "select * from Table1";
ResultSet rs = uteQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = ColumnCount();
for (int i = 1; i <= columnCount; i++) {
String s = ColumnTypeName(i);
System.out.println ("Column " + i + " is type " + s);
}
8.4.2 带 IN 参数的 SQL 语句
在另⼀个可能的情况中,⽤户将发送带输⼊参数的 SQL 语句。这种情况下,⽤户通过调⽤PreparedStatement.setXXX⽅法为每个输⼊参数赋值。例如,PreparedStatement.setLong(1, 2345678)将把值2345678作为 Java 的 long类型赋给第⼀个参数。为了将2345678到数据库中,驱动程序将把它转换为 JDBC BIGINT。驱动程序将把哪种 JDBC 类型送到数据库中是由 Java 类型到 JDBC 类型的标准映射所决定的
8.4.3 带 OUT 参数的 SQL 语句
还有⼀个情况是,⽤户要调⽤已存储过程,将值赋给其 INOUT 参数,从结果中检索值,然后从参数中检索值。这种情形极为少见且相当复杂,但它却不失为映射和数据转换的好范例。
这种情况下,⾸先要做的是⽤PreparedStatement.setXXX⽅法对 INOUT 参数赋值。此外,由于这些参数同时也⽤于输出,因此程序员必须为每个参数注册 JDBC 类型,该类型是数据库所要返回给该参数的值的 JDBC 类型。这可⽤isterOutParameter⽅法来完成,后者接受在类Ty
pes中所定义的 JDBC 类型作为其变量。程序员可以⽤XXX⽅法系列来检索返回给ResultSet对象的结果,
⽤XXX⽅法系列来检索存放在输出参数中的值。
⽤于XXX⽅法的XXX类型在某些情况下⾮常灵活。节中所⽰的表显⽰了哪些XXX⽅法可⽤于检索哪些 JDBC 类型。
⽤于XXX⽅法的 XXX类型必须映射为那个参数所注册的 JDBC 类型。例如,如果数据库应返回类型为JDBC REAL的输出值,则该参数应被注册为java.sql.Types.REAL。因此,要检索该JDBC REAL值,必须调⽤Float⽅法(从 JDBC 类型到 Java 类型的映射在节中的表中给出)。⽅法getFloat先把储存在输出参数中的值从 JDBC REAL类型转换为 Java float类型,然后将它返回。为了适应各种数据库和使应⽤程序具有更⾼的可移植性,建议先检索ResultSet对象中的值,再检索输出参数中的值。
下述代码⽰范的是调⽤名为getTestData的已存储过程。它有两个参数,且都是 INOUT 参数。⾸先,Connection对象con将创
建CallableStatement对象cstmt。然后,⽅法setByte把第⼀个参数设置为 Java byte类型,其值为25。
驱动程序将把25转换为 JDBC TINYINT类型并将之送到数据库中。⽅法setBigDecimal⽤输⼊值83.75来设置第⼆个参数。驱动程序将把这个java.math.BigDecimal对象转换为
JDBC NUMERIC值。接下来将这两个参数注册为 OUT 参数,第⼀个参数注册为 JDBC TINYINT类型,第⼆个参数注册为⼩数点后⾯带两位数字的 JDBC DECIMAL类型。执⾏cstmt后,就⽤XXX⽅法将值从ResultSet对象中检索出来。⽅法getString将第⼀列中的值作为Java String对象获取,getInt将第⼆列中的值作为 Java int获取,getInt将第三列中的值作为 Java int获取。
之后,XXX⽅法检索存放在输出参数中的值。⽅法getByte将JDBC TINYINT检索为
Java byte,getBigDecimal将JDBC DECIMAL检索为⼩数点后⾯带有两位数字的java.math.BigDecimal对象。注意,当参数既是输⼊参数同时⼜是输出参数时,setXXX⽅法所⽤的 Java 类型与getXXX⽅法所⽤的相同(正如setByte和getByte中⼀样)。registerOutParameter⽅法将它注册成由 Java 类型映射来的 JDBC 类型(Java byte类型映射为 JDBC TINYINT,如节中的表所⽰)。
CallableStatement cstmt = con.prepareCall(
"{call getTestData(?, ?)}");
cstmt.setByte(1, 25);
cstmt.setBigDecimal(2, 83.75);
// 将第⼀个参数注册为 JDBC TINYINT,第⼆个
// 参数注册为⼩数点后⾯带有两位数字的 JDBC DECIMAL 类型
ResultSet rs = uteUpdate();
// 检索并打印结果中的值。
()) {
String name = rs.getString(1);
int score = rs.getInt(2);
int percentile = rs.getInt(3);
System.out.print("name = " + name + ", score = " + score + ", "
System.out.println("percentile = " + percentile);
// 检索输出参数中的值
byte x = Byte(1);
java.math.BigDecimal n = BigDecimal(2, 2);
总之,XXX和PreparedStatement.setXXX⽅法系列中的XXX是 Java 类型。对于setXXX⽅法,驱动程序先把 Java 类型转换为JDBC 类型,再把它送到数据库中(使⽤节中的表所⽰的标准映射)。对于getXXX⽅法,驱动程序先把数据库返回的 JDBC 类型转换为Java 类型(⽤节表中所⽰的标准映射),再把它返回给getXXX⽅法。
registerOutParameter⽅法只接受 JDBC 类型的变量,⽽setObject⽅法却可接受 JDBC 类型的变量。
注意,如果在可选的第三个变量的位置上提供了 JDBC 类型,则setObject⽅法将把参数值从 Java 类
型显式地转换为所指定的 JDBC 类型。如果没有为 setObject提供⽬标 JDBC 类型,则将把参数值转换为 Java 类型的标准映射 JDBC 类型(如节的表中所⽰)。在将参数送到数据库中之前,驱动程序都要进⾏显式或隐式转换。
8.5 动态数据存取
⼤多数时候,⽤户要存取的结果和参数其数据类型在编译时是已知的。然⽽,有些应⽤程序(例如普通的浏览器或查询⼯具)在编译时对它们所要存取的数据库的机制并不知晓。因此,JDBC 除了⽀持静态数据类型存取外,还⽀持类型完全动态确定的数据存取。
有三种⽅法和⼀个常量可⽤于访问那些在编译时其数据类型尚属未知的值:
PreparedStatement.setObject
java.sql.Types.OTHER (⽤作isterOutParameter的⼀个变量)
例如,如果应⽤程序想要接受多种类型作为其ResultSet对象中的结果,它可以使⽤Object⽅法。
例:boolean、char、byte、short、int、long、float和double。因此,不能⽤getObject⽅法来检索它们。然⽽,这些基本类型每种都有相应的可⽤作 wrapper 的类。这些类的实例是对象,这意味着可⽤Object和Object⽅法来检索它们。显⽰了从 JDBC 类型到 Java Object类型的映射。该表与 JDBC 类型到 Java 类型的标准映射不同:在该表中,除了 JDBC TINYINT和 JDBC SMALLINT类型映射为Java 类Integer之外,每⼀个基本的 Java 类型都被替换为它们的 wrapper 类。
⽅法getObject还可⽤于检索⽤户定义的 Java 类型。随着抽象数据类型(ADT)和其它⽤户定义的类型在某些数据库系统中的出现,⼀些提供者可能会发现⽤getObject来检索这些类型将更⽅便。
8.6 数据类型映射表
本节含有以下表,它们是 JDBC 类型和 Java 数据类型之间的映射关系表:
— 从 JDBC 类型映射到 Java 类型
— 从 Java 类型映射到 JDBC 类型
─从 JDBC 类型映射到 Java Object类型
─从 Java Object类型映射到 JDBC 类型
─由setObject所进⾏的转换
— 由XXX⽅法所检索的 JDBC 类型
8.6.1 从 JDBC 类型映射到 Java 类型
JDBC 类型Java 类型
CHAR String
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论