📄 jdbc-spec.frame8.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=gb2312">
<title></title>
</head>
<body bgcolor="#ffffff">
<table width="600">
<tr>
<td><font size="-1"><a href="jdbc-spec.frame.html">目录</a> | <a
href="jdbc-spec.frame7.html">上一页</a> | <a href="jdbc-spec.frame9.html">下一页</a>
</font></td>
<td align="right"><i>JDBC<sup><font size="-2">TM</font></sup> 指南:入门</i></td>
</tr>
</table>
<hr>
<p><br>
<a name="20986"></a> </p>
<h2>8 将 SQL 数据类型映射到 Java 中</h2>
<h3>8.1 限制</h3>
<p>我们既需要为常规 SQL 数据类型提供合理的 Java
映射,也需要确保有足够的类型信息以便能正确地存储和检索参数并从
SQL 语句获得结果。 </p>
<p>但是,我们并不要求 Java 数据类型要与 SQL
数据类型完全同型。例如,由于 Java
没有固定长度的数组,因此可将固定长度和可变长度 SQL
数组描述为可变长度 Java 数组。同样,即使 Java String 不与任何 SQL
CHAR 类型精确匹配,也可自由使用。 </p>
<p><a name="6736"></a>表 <a href="jdbc-spec.frame8.html#27081">2</a>
显示了各种常规 SQL 数据类型的缺省 Java
映射。并非所有这些类型都必须得到所有数据库的支持。在以下章节内将更详细地说明各种映射。
</p>
<p><a name="28629"></a> </p>
<table Border="3">
<caption><a name="27081"></a>表 2:从 SQL 类型到 Java 类型的标准映射。 </caption>
<tr>
<td><a name="27082"></a> </td>
</tr>
<tr>
<th>SQL 类型 </th>
<th>Java 类型 </th>
</tr>
<tr>
<td>CHAR </td>
<td>String </td>
</tr>
<tr>
<td>VARCHAR </td>
<td>String </td>
</tr>
<tr>
<td>LONGVARCHAR </td>
<td>String </td>
</tr>
<tr>
<td>NUMERIC </td>
<td>java.math.BigDecimal </td>
</tr>
<tr>
<td>DECIMAL </td>
<td>java.math.BigDecimal </td>
</tr>
<tr>
<td>BIT </td>
<td>boolean </td>
</tr>
<tr>
<td>TINYINT </td>
<td>byte </td>
</tr>
<tr>
<td>SMALLINT </td>
<td>short </td>
</tr>
<tr>
<td>INTEGER </td>
<td>int </td>
</tr>
<tr>
<td>BIGINT </td>
<td>long </td>
</tr>
<tr>
<td>REAL </td>
<td>float </td>
</tr>
<tr>
<td>FLOAT </td>
<td>double </td>
</tr>
<tr>
<td>DOUBLE </td>
<td>double </td>
</tr>
<tr>
<td>BINARY </td>
<td>byte[] </td>
</tr>
<tr>
<td>VARBINARY </td>
<td>byte[] </td>
</tr>
<tr>
<td>LONGVARBINARY </td>
<td>byte[] </td>
</tr>
<tr>
<td>DATE </td>
<td>java.sql.Date </td>
</tr>
<tr>
<td>TIME </td>
<td>java.sql.Time </td>
</tr>
<tr>
<td>TIMESTAMP </td>
<td>java.sql.Timestamp </td>
</tr>
</table>
<table>
<tr>
<td></td>
</tr>
</table>
<p><a name="28556"></a>同样地,表 <a href="jdbc-spec.frame8.html#28688">3</a>
显示了从 Java 类型到 SQL 类型的反向映射。 </p>
<table Border="3">
<caption><a name="28688"></a> 表 3: 从 Java 类型到 SQL 类型的标准映射。 </caption>
<tr>
<td>String 的映射一般为 VARCHAR,但如果给定值超出了驱动程序对 VARCHAR
值的限制,String 将转化为 LONGVARCHAR。byte[]、VARBINARY 和 LONGVARBINARY
也一样。 </td>
</tr>
<tr>
<th>Java 类型 </th>
<th>SQL 类型 </th>
</tr>
<tr>
<td>String </td>
<td>VARCHAR 或 LONGVARCHAR </td>
</tr>
<tr>
<td>java.math.BigDecimal </td>
<td>NUMERIC </td>
</tr>
<tr>
<td>boolean </td>
<td>BIT </td>
</tr>
<tr>
<td>byte </td>
<td>TINYINT </td>
</tr>
<tr>
<td>short </td>
<td>SMALLINT </td>
</tr>
<tr>
<td>int </td>
<td>INTEGER </td>
</tr>
<tr>
<td>long </td>
<td>BIGINT </td>
</tr>
<tr>
<td>float </td>
<td>REAL </td>
</tr>
<tr>
<td>double </td>
<td>DOUBLE </td>
</tr>
<tr>
<td>byte[] </td>
<td>VARBINARY 或 LONGVARBINARY </td>
</tr>
<tr>
<td>java.sql.Date </td>
<td>DATE </td>
</tr>
<tr>
<td>java.sql.Time </td>
<td>TIME </td>
</tr>
<tr>
<td>java.sql.Timestamp </td>
<td>TIMESTAMP </td>
</tr>
</table>
<table>
<tr>
<td></td>
</tr>
</table>
<p><a name="27091"></a> </p>
<p><a name="27092"></a> <a name="11100"></a> </p>
<h3>8.2 动态数据访问</h3>
<p>本章的重点在于对编译时知道其类型的结果或参数的访问。但由于某些应用程序(如通用浏览器或查询工具)是在不知道要访问数据库机制的情况下进行编译的,因此
JDBC 也支持完全动态类型数据访问。参见第 <a
href="jdbc-spec.frame14.html#6552">14.2</a> 节。 </p>
<p><a name="15953"></a> </p>
<h3>8.3 CHAR、VARCHAR 和 LONGVARCHAR</h3>
<p>Java 程序员无需区别三种不同的 SQL 字符串 CHAR、VARCHAR 和 LONGVARCHAR。它们都可在
Java
中以同样的方式表达。即使不知道所需的确切数据类型也可正确地读取和写入
SQL。 </p>
<p><a name="1638"></a>这些类型可映射为 String 或 char[]。在仔细讨论后,我们决定用
String,因为它更适合通用用途。注意,Java String 类提供将 String
转换为 char[] 的方法和将 char[] 转为 String 的构造函数。 </p>
<p>对于 CHAR(n) 类型的固定长度 SQL 字符串,JDBC
驱动程序将用适当的空格填补。这样,当从数据库检索 CHAR(n)
域时,结果 String 长度将始终为“n”,且在其末端可能包括某些填补的空格。当
String 传给 CHAR(n) 域时,驱动程序和/或数据库将在 String
末端添加必要的空格,以使其长度为“n”。 </p>
<p>ResultSet.getString 方法分配并返回新的 String。这适合于检索常规数据,但
LONGVARCHAR SQL 类型却可用于存储数兆字节的字符串。因此,需要为 Java
程序员提供在块内检索 LONGVARCHAR 值的方法。为此,程序员可将
LONGVARCHAR 作为 Java
输入流进行检索,从中他们可按任何块单位读取数据。Java 流可用于
Unicode 或 Ascii 数据,因此程序员可选用 getAsciiStream 或 getUnicodeStream。
</p>
<p><a name="1251"></a> </p>
<h3>8.4 DECIMAL 和 NUMERIC</h3>
<p>SQL DECIMAL 和 NUMERIC
数据类型用来表达要求绝对精确的固定小数点数值。它们常用于表示货币值。
</p>
<p><a name="1674"></a>这两种类型可在 Java
内以同样的方式表达。最方便的映射是使用 JDK1.1
中扩展的精确值类型 java.math.BigDecima。 </p>
<p>也可以按简单 String 和 chars 数组的方式访问 DECIMAL 和 NUMERIC。此时
Java 程序员可用 getString 接收 NUMERIC 或 DECIMAL 结果。 </p>
<p><a name="8206"></a> </p>
<h3>8.5 BINARY、VARBINARY 和 LONGVARBINARY</h3>
<p>Java 程序员无需区别三种不同的 SQL 字节数组 BINARY、VARBINARY 和
LONGVARBINARY。它们在 Java
中也可表示为同样的字节数组(不知道所需的确切 BINARY
数据类型也可正确读取和写入 SQL)。 </p>
<p><a name="1746"></a>与 LONGVARCHAR SQL 类型类似,LONGVARBINARY SQL
类型有时也可用于返回数兆字节的数据值。因此,我们允许将
LONGVARBINARY 值作为 Java
输入流检索,从中程序员可以以任何块为单位读取数据。 </p>
<p><a name="1758"></a> </p>
<h3>8.6 BIT</h3>
<p>SQL BIT 类型可直接映射为 Java 布尔类型。 </p>
<p><a name="1779"></a> </p>
<h3>8.7 TINYINT、SMALLINT、INTEGER 和 BIGINT</h3>
<p>SQL TINYINT、SMALLINT、INTEGER 和 BIGINT 类型分别表示 8 位、16 位、32
位和 64 位值。这些类型可映射为 Java 的 byte、short、int 和 long
数据类型。 </p>
<p><a name="1759"></a> </p>
<h3>8.8 REAL、FLOAT 和 DOUBLE</h3>
<p>SQL 定义三种浮点数据类型:REAL、FLOAT 和 DOUBLE。 </p>
<p><a name="50248"></a>我们将 REAL 映射为 Java float,将 FLOAT 和 DOUBLE
映射为 Java double。 </p>
<p><a name="50249"></a>我们要求 REAL 支持 7 位尾数精度,而要求 FLOAT 和
DOUBLE 支持 15 位尾数精度。 </p>
<p><a name="1833"></a> </p>
<h3>8.9 DATE、TIME 和 TIMESTAMP</h3>
<p>SQL 定义了三种与时间有关的数据类型:DATE 由日、月和年组成。TIME
由小时、分钟和秒组成。 TIMESTAMP 将 DATE 和 TIME
结合起来,并添加了纳秒域。 </p>
<p><a name="6050"></a>标准 Java 类 java.util.Date
可提供日期和时间信息。但由于该类包含 DATE 和 TIME 信息而没有
TIMESTAMP 所需的纳秒,因此并不与上述三种 SQL 类型完全相配。 </p>
<p>因此我们定义了 java.util.Date 的三种子类。它们是:
<ul>
<p><a name="6057"></a></p>
<li>有关 SQL DATE 信息的 java.sql.Date <br>
<br>
<a name="6058"></a> </li>
<li>有关 SQL TIME 信息的 java.sql.Time <br>
<br>
<a name="6061"></a> </li>
<li>有关 SQL TIMESTAMP 信息的 java.sql.Timestamp<br>
<br>
</li>
</ul>
<p><a name="1840"></a>对于 java.sql.Time,java.util.Time
基本类的小时、分钟、秒和毫秒域被设置为零。 </p>
<p><a name="6076"></a>对于 java.sql.Date,java.util.Date
基本类的年、月和日域被分别设置为 1970 年 1 月 1 日。这是在 Java
新纪元中的“零”日期。 </p>
<p><a name="6077"></a>java.sql.Timestamp 类通过添加纳秒域来扩展 java.util.Date。
</p>
<p><a name="16984"></a> </p>
<p><br>
</p>
<hr>
<font size="-1"><a href="jdbc-spec.frame.html">
<p>目录</a> | <a href="jdbc-spec.frame7.html">上一页</a> | <a
href="jdbc-spec.frame9.html">下一页</a> </font></p>
<hr>
<address>
<a href="mailto:jdbc@wombat.eng.sun.com">jdbc@wombat.eng.sun.com</a> 或 <a
href="mailto:jdbc-odbc@wombat.eng.sun.com">jdbc-odbc@wombat.eng.sun.com</a>
</address>
<a href="../../../relnotes/SMICopyright.html"><font size="-1"><i>
<p>版权所有 © 1996, 1997 Sun Microsystems, Inc. 保留所有权利。</i></font> </a><!-- HTML generated by Suzette Pelouch on April 10, 1998 -->
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -