⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 statement.doc.html

📁 JDBC入门中文文档
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<!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&nbsp; 概述</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>, &quot;sunny&quot;, &quot;&quot;);
<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(&quot;SELECT a, b, c FROM Table2&quot;);
</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(&quot;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(&quot;Hot&quot;, &quot;Java&quot;)};
</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 + -