📄 statement.doc.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="introTOC.doc.html">目录</a> | <a
href="drivermanager.doc.html">上一页</a> | <a href="resultset.doc.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="999752"></a> </p>
<h1>4 - Statement</h1>
<p>本概述是从《<em>JDBC<font size="-1"><sup>TM</sup></font> Database Access from
Java<font size="-1"><sup>TM</sup></font>: A Tutorial and Annotated Reference </em>》这本书中摘引来的。JavaSoft
目前正在准备这本书。这是一本教程,同时也是 JDBC
的重要参考手册,它将作为 Java 系列的组成部份在 1997 年春季由
Addison-Wesley 出版公司出版。</p>
<p><a name="1000008"></a> </p>
<h2>4.1 概述</h2>
<code>
<p>Statement</code> 对象用于将 SQL 语句发送到数据库中。实际上有三种 <code>Statement</code>
对象,它们都作为在给定连接上执行 SQL 语句的包容器:<code>Statement</code>、<code>PreparedStatement</code>(它从
<code>Statement</code> 继承而来)和 <code>CallableStatement</code>(它从 <code>PreparedStatement</code>
继承而来)。它们都专用于发送特定类型的 SQL 语句: <code>Statement</code>
对象用于执行不带参数的简单 SQL 语句;<code>PreparedStatement</code>
对象用于执行带或不带 IN 参数的预编译 SQL 语句;<code>CallableStatement</code>
对象用于执行对数据库已存储过程的调用。</p>
<p><a name="999769"></a><code>Statement</code>
接口提供了执行语句和获取结果的基本方法。<code>PreparedStatement</code>
接口添加了处理 IN 参数的方法;而 <code>CallableStatement</code>
添加了处理 OUT 参数的方法。</p>
<p><a name="999770"></a> </p>
<h3>4.1.1 创建 Statement 对象</h3>
<p>建立了到特定数据库的连接之后,就可用该连接发送 SQL 语句。<code>Statement</code>
对象用 <code>Connection</code> 的方法 <code>createStatement</code>
创建,如下列代码段中所示: </p>
<pre><a name="999772"></a> Connection con = DriverManager.getConnection(<code>url</code>, "sunny", "");
<a
name="999773"></a> Statement stmt = con.createStatement();
</pre>
<p>为了执行 <code>Statement</code> 对象,被发送到数据库的 SQL
语句将被作为参数提供给 Statement 的方法: </p>
<pre><a name="999775"></a> ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2");
</pre>
<a name="1000107"></a><h3>4.1.2 使用 Statement 对象执行语句</h3>
<code>
<p>Statement</code> 接口提供了三种执行 SQL 语句的方法:<code>executeQuery</code>、<code>executeUpdate</code>
和 <code>execute</code>。使用哪一个方法由 SQL 语句所产生的内容决定。</p>
<p><a name="1000109"></a>方法 <code>executeQuery</code>
用于产生单个结果集的语句,例如 <code>SELECT</code> 语句。</p>
<p><a name="1000110"></a>方法 <code>executeUpdate</code> 用于执行 <code>INSERT</code>、<code>UPDATE</code>
或 <code>DELETE</code> 语句以及 SQL DDL(数据定义语言)语句,例如 <code>CREATE</code>
<code>TABLE</code> 和 <code>DROP</code> <code>TABLE</code>。<code>INSERT</code>、<code>UPDATE</code>
或 <code>DELETE</code>
语句的效果是修改表中零行或多行中的一列或多列。<code>executeUpdate</code>
的返回值是一个整数,指示受影响的行数(即更新计数)。对于 <code>CREATE</code>
<code>TABLE</code> 或 <code>DROP</code> <code>TABLE</code> 等不操作行的语句,<code>executeUpdate</code>
的返回值总为零。</p>
<p><a name="1000111"></a>方法 <code>execute</code>
用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能,所以本概述后面将在单独一节中对其进行介绍。</p>
<p><a name="1000112"></a>执行语句的所有方法都将关闭所调用的 <code>Statement</code>
对象的当前打开结果集(如果存在)。这意味着在重新执行 <code>Statement</code>
对象之前,需要完成对当前 <code>ResultSet</code> 对象的处理。</p>
<p><a name="1000113"></a>应注意,继承了 <code>Statement</code>
接口中所有方法的 <code>PreparedStatement</code> 接口都有自己的 <code>executeQuery</code>、<code>executeUpdate</code>
和 <code>execute</code> 方法。<code>Statement</code> 对象本身不包含 SQL
语句,因而必须给 <code>Statement.execute</code> 方法提供 SQL
语句作为参数。<code>PreparedStatement</code> 对象并不将 SQL
语句作为参数提供给这些方法,因为它们已经包含预编译 SQL 语句。<code>CallableStatement</code>
对象继承这些方法的 <code>PreparedStatement</code> 形式。对于这些方法的 <code>PreparedStatement</code>
或 <code>CallableStatement</code> 版本,使用查询参数将抛出 <code>SQLException</code>。</p>
<p><a name="1000044"></a> </p>
<h3>4.1.3 语句完成</h3>
<p>当连接处于自动提交模式时,其中所执行的语句在完成时将自动提交或还原。语句在已执行且所有结果返回时,即认为已完成。对于返回一个结果集的
<code>executeQuery</code> 方法,在检索完 <code>ResultSet</code>
对象的所有行时该语句完成。对于方法 <code>executeUpdate</code>,当它执行时语句即完成。但在少数调用方法
<code>execute</code>
的情况中,在检索所有结果集或它生成的更新计数之后语句才完成。</p>
<p><a name="1000046"></a>有些 DBMS
将已存储过程中的每条语句视为独立的语句;而另外一些则将整个过程视为一个复合语句。在启用自动提交时,这种差别就变得非常重要,因为它影响什么时候调用
<code>commit</code>
方法。在前一种情况中,每条语句单独提交;在后一种情况中,所有语句同时提交。</p>
<p><a name="1000047"></a> </p>
<h3>4.1.4 关闭 Statement 对象</h3>
<code>
<p>Statement</code> 对象将由 Java
垃圾收集程序自动关闭。而作为一种好的编程风格,应在不需要
Statement 对象时显式地关闭它们。这将立即释放 DBMS
资源,有助于避免潜在的内存问题。</p>
<p><a name="999828"></a> </p>
<h3>4.1.5 Statement 对象中的 SQL 转义语法 </h3>
<code>
<p>Statement</code> 可包含使用 SQL 转义语法的 SQL
语句。转义语法告诉驱动程序其中的代码应该以不同方式处理。驱动程序将扫描任何转义语法,并将它转换成特定数据库可理解的代码。这使得转义语法与
DBMS 无关,并允许程序员使用在没有转义语法时不可用的功能。</p>
<p><a name="999830"></a>转义子句由花括号和关键字界定: </p>
<pre><a name="999831"></a> {keyword . . . parameters . . . }
</pre>
<p>该关键字指示转义子句的类型,如下所示。</p>
<p><a name="999833"></a>
<ul>
<p><a name="999834"></a></p>
<li><code>escape</code> 表示 <code>LIKE</code> 转义字符 <br>
<br>
</li>
</ul>
<blockquote>
<p><a name="999835"></a></p>
<p><a name="999836"></a>字符“%”和“_”类似于 SQL <code>LIKE</code>
子句中的通配符(“%”匹配零个或多个字符,而“_”则匹配一个字符)。为了正确解释它们,应在其前面加上反斜杠(“\”),它是字符串中的特殊转义字符。在查询末尾包括如下语法即可指定用作转义字符的字符:
</p>
</blockquote>
<pre><a name="999837"></a> <code> {escape 'escape-character'}
</code></pre>
<blockquote>
<p><a name="999838"></a></p>
<p>例如,下列查询使用反斜杠字符作为转义字符,查找以下划线开头的标识符名:
</p>
</blockquote>
<pre><a name="999839"></a> stmt.executeQuery("SELECT name FROM Identifiers
<a
name="999840"></a> WHERE Id LIKE `\_%' {escape `\'};
</pre>
<blockquote>
<p><a name="999841"></a></p>
</blockquote>
<ul>
<p><a name="999842"></a></p>
<li><code>fn</code> 表示标量函数<br>
<br>
</li>
</ul>
<blockquote>
<p><a name="999843"></a></p>
<p><a name="999844"></a>几乎所有 DBMS
都具有标量值的数值、字符串、时间、日期、系统和转换函数。要使用这些函数,可使用如下转义语法:关键字
<code>fn</code> 后跟所需的函数名及其参数。例如,下列代码调用函数 <code>concat</code>
将两个参数连接在一起: </p>
</blockquote>
<pre><a name="999845"></a> {fn concat("Hot", "Java")};
</pre>
<blockquote>
<p><a name="999846"></a></p>
<p>可用下列语法获得当前数据库用户名: </p>
</blockquote>
<pre><a name="999847"></a> {fn user()};
</pre>
<blockquote>
<p><a name="999848"></a></p>
<p>标量函数可能由语法稍有不同的 DBMS
支持,而它们可能不被所有驱动程序支持。各种 <code>DatabaseMetaData</code>
方法将列出所支持的函数。例如,方法 <code>getNumericFunctions</code>
返回用逗号分隔的数值函数列表,而方法 <code>getStringFunctions</code>
将返回字符串函数,等等。</p>
<p><a name="999849"></a>驱动程序将转义函数调用映射为相应的语法,或直接实现该函数。</p>
</blockquote>
<p><a name="999850"></a>
<ul>
<p><a name="999851"></a></p>
<li><code>d</code>、<code>t</code> 和 <code>ts</code> 表示日期和时间文字<br>
<br>
</li>
</ul>
<blockquote>
<p><a name="999852"></a></p>
<p><a name="999853"></a>DBMS
用于日期、时间和时间标记文字的语法各不相同。JDBC
使用转义子句支持这些文字的语法的 ISO
标准格式。驱动程序必须将转义子句转换成 DBMS 表示。</p>
<p><a name="999854"></a> 例如,可用下列语法在 JDBC SQL 语句中指定日期: </p>
</blockquote>
<pre><a name="999855"></a> <code> {d `yyyy-mm-dd'}
</code></pre>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -