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

📄 jdbctm 指南:入门6 - preparedstatement.htm

📁 写给JSP初级程序员的书
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0057)http://eps.www85.cn4e.com/java/article/devshow.asp?id=100 -->
<HTML><HEAD><title>csdn_JDBCTM 指南:入门6 - PreparedStatement</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<STYLE type=text/css>TD {
	FONT-FAMILY: "Verdana", "Arial", "宋体"; FONT-SIZE: 9pt
}
A {
	COLOR: #660000; TEXT-DECORATION: underline
}
A:hover {
	COLOR: #660000; TEXT-DECORATION: none
}
.line {
	LINE-HEIGHT: 14pt
}
</STYLE>

<META content="MSHTML 5.00.2920.0" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff text=#000000>

  <table><tbody>
  <TR>
    <TD height=21>
      <DIV align=center><B><FONT size=3>JDBCTM 指南:入门6 - 
      PreparedStatement <BR><FONT size=2> </FONT></FONT></FONT>
      <HR align=center color=#cccccc noShade SIZE=1>
      </DIV></TD></TR>
  <TR>
    <TD class=line><FONT 
      color=#333300>6&nbsp;-&nbsp;PreparedStatement<BR>本概述是从《JDBCTM&nbsp;Database&nbsp;Access&nbsp;from&nbsp;JavaTM:&nbsp;A&nbsp;Tutorial&nbsp;and&nbsp;Annotated&nbsp;Reference&nbsp;》这本书中摘引来的。JavaSoft&nbsp;目前正在准备这本书。这是一本教程,同时也是&nbsp;JDBC&nbsp;的重要参考手册,它将作为&nbsp;Java&nbsp;系列的组成部份在&nbsp;1997&nbsp;年春季由&nbsp;Addison-Wesley&nbsp;出版公司出版。&nbsp;<BR><BR><BR>6.1&nbsp;概述<BR>该&nbsp;PreparedStatement&nbsp;接口继承&nbsp;Statement,并与之在两方面有所不同:&nbsp;<BR><BR><BR>PreparedStatement&nbsp;实例包含已编译的&nbsp;SQL&nbsp;语句。这就是使语句“准备好”。&nbsp;<BR>包含于&nbsp;PreparedStatement&nbsp;对象中的&nbsp;SQL&nbsp;语句可具有一个或多个&nbsp;IN&nbsp;参数。IN&nbsp;参数的值在&nbsp;SQL&nbsp;语句创建时未被指定。相反的,该语句为每个&nbsp;IN&nbsp;参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的&nbsp;setXXX&nbsp;方法来提供。&nbsp;<BR><BR>由于&nbsp;PreparedStatement&nbsp;对象已预编译过,所以其执行速度要快于&nbsp;Statement&nbsp;对象。因此,多次执行的&nbsp;SQL&nbsp;语句经常创建为&nbsp;PreparedStatement&nbsp;对象,以提高效率。<BR><BR>作为&nbsp;Statement&nbsp;的子类,PreparedStatement&nbsp;继承了&nbsp;Statement&nbsp;的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代&nbsp;IN&nbsp;参数占位符的值。同时,三种方法&nbsp;execute、&nbsp;executeQuery&nbsp;和&nbsp;executeUpdate&nbsp;已被更改以使之不再需要参数。这些方法的&nbsp;Statement&nbsp;形式(接受&nbsp;SQL&nbsp;语句参数的形式)不应该用于&nbsp;PreparedStatement&nbsp;对象。<BR><BR><BR>6.1.1&nbsp;创建&nbsp;PreparedStatement&nbsp;对象<BR>以下的代码段(其中&nbsp;con&nbsp;是&nbsp;Connection&nbsp;对象)创建包含带两个&nbsp;IN&nbsp;参数占位符的&nbsp;SQL&nbsp;语句的&nbsp;PreparedStatement&nbsp;对象:&nbsp;<BR><BR>PreparedStatement&nbsp;pstmt&nbsp;=&nbsp;con.prepareStatement(<BR>"UPDATE&nbsp;table4&nbsp;SET&nbsp;m&nbsp;=&nbsp;?&nbsp;WHERE&nbsp;x&nbsp;=&nbsp;?");<BR><BR>pstmt&nbsp;对象包含语句&nbsp;"UPDATE&nbsp;table4&nbsp;SET&nbsp;m&nbsp;=&nbsp;?&nbsp;WHERE&nbsp;x&nbsp;=&nbsp;?",它已发送给&nbsp;DBMS,并为执行作好了准备。<BR><BR><BR>6.1.2&nbsp;传递&nbsp;IN&nbsp;参数<BR>在执行&nbsp;PreparedStatement&nbsp;对象之前,必须设置每个&nbsp;?&nbsp;参数的值。这可通过调用&nbsp;setXXX&nbsp;方法来完成,其中&nbsp;XXX&nbsp;是与该参数相应的类型。例如,如果参数具有&nbsp;Java&nbsp;类型&nbsp;long,则使用的方法就是&nbsp;setLong。setXXX&nbsp;方法的第一个参数是要设置的参数的序数位置,第二个参数是设置给该参数的值。例如,以下代码将第一个参数设为&nbsp;123456789,第二个参数设为&nbsp;100000000:&nbsp;<BR><BR>pstmt.setLong(1,&nbsp;123456789);<BR>pstmt.setLong(2,&nbsp;100000000);<BR><BR>一旦设置了给定语句的参数值,就可用它多次执行该语句,直到调用&nbsp;clearParameters&nbsp;方法清除它为止。<BR><BR>在连接的缺省模式下(启用自动提交),当语句完成时将自动提交或还原该语句。<BR><BR>如果基本数据库和驱动程序在语句提交之后仍保持这些语句的打开状态,则同一个&nbsp;PreparedStatement&nbsp;可执行多次。如果这一点不成立,那么试图通过使用&nbsp;PreparedStatement&nbsp;对象代替&nbsp;Statement&nbsp;对象来提高性能是没有意义的。<BR><BR>利用&nbsp;pstmt(前面创建的&nbsp;PreparedStatement&nbsp;对象),以下代码例示了如何设置两个参数占位符的值并执行&nbsp;pstmt&nbsp;10&nbsp;次。如上所述,为做到这一点,数据库不能关闭&nbsp;pstmt。在该示例中,第一个参数被设置为&nbsp;"Hi"并保持为常数。在&nbsp;for&nbsp;循环中,每次都将第二个参数设置为不同的值:从&nbsp;0&nbsp;开始,到&nbsp;9&nbsp;结束。<BR><BR>pstmt.setString(1,&nbsp;"Hi");<BR>for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;10;&nbsp;i++)&nbsp;{<BR>pstmt.setInt(2,&nbsp;i);<BR>int&nbsp;rowCount&nbsp;=&nbsp;pstmt.executeUpdate();<BR>}<BR><BR>6.1.3&nbsp;IN&nbsp;参数中数据类型的一致性<BR>setXXX&nbsp;方法中的&nbsp;XXX&nbsp;是&nbsp;Java&nbsp;类型。它是一种隐含的&nbsp;JDBC&nbsp;类型(一般&nbsp;SQL&nbsp;类型),因为驱动程序将把&nbsp;Java&nbsp;类型映射为相应的&nbsp;JDBC&nbsp;类型(遵循该&nbsp;JDBC&nbsp;Guide中§8.6.2&nbsp;“映射&nbsp;Java&nbsp;和&nbsp;JDBC&nbsp;类型”表中所指定的映射),并将该&nbsp;JDBC&nbsp;类型发送给数据库。例如,以下代码段将&nbsp;PreparedStatement&nbsp;对象&nbsp;pstmt&nbsp;的第二个参数设置为&nbsp;44,Java&nbsp;类型为&nbsp;short:&nbsp;<BR><BR>pstmt.setShort(2,&nbsp;44);<BR><BR>驱动程序将&nbsp;44&nbsp;作为&nbsp;JDBC&nbsp;SMALLINT&nbsp;发送给数据库,它是&nbsp;Java&nbsp;short&nbsp;类型的标准映射。<BR><BR>程序员的责任是确保将每个&nbsp;IN&nbsp;参数的&nbsp;Java&nbsp;类型映射为与数据库所需的&nbsp;JDBC&nbsp;数据类型兼容的&nbsp;JDBC&nbsp;类型。不妨考虑数据库需要&nbsp;JDBC&nbsp;SMALLINT&nbsp;的情况。如果使用方法&nbsp;setByte&nbsp;,则驱动程序将&nbsp;JDBC&nbsp;TINYINT&nbsp;发送给数据库。这是可行的,因为许多数据库可从一种相关的类型转换为另一种类型,并且通常&nbsp;TINYINT&nbsp;可用于&nbsp;SMALLINT&nbsp;适用的任何地方。然而,对于要适用于尽可能多的数据库的应用程序,最好使用与数据库所需的确切的&nbsp;JDBC&nbsp;类型相应的&nbsp;Java&nbsp;类型。如果所需的&nbsp;JDBC&nbsp;类型是&nbsp;SMALLINT,则使用&nbsp;setShort&nbsp;代替&nbsp;setByte&nbsp;将使应用程序的可移植性更好。<BR><BR><BR>6.1.4&nbsp;使用&nbsp;setObject<BR>程序员可使用&nbsp;setObject&nbsp;方法显式地将输入参数转换为特定的&nbsp;JDBC&nbsp;类型。该方法可以接受第三个参数,用来指定目标&nbsp;JDBC&nbsp;类型。将&nbsp;Java&nbsp;Object&nbsp;发送给数据库之前,驱动程序将把它转换为指定的&nbsp;JDBC&nbsp;类型。<BR><BR>如果没有指定&nbsp;JDBC&nbsp;类型,驱动程序就会将&nbsp;Java&nbsp;Object&nbsp;映射到其缺省的&nbsp;JDBC&nbsp;类型(参见第&nbsp;8.6.4&nbsp;节中的表格),然后将它发送到数据库。这与常规的&nbsp;setXXX&nbsp;方法类似;在这两种情况下,驱动程序在将值发送到数据库之前,会将该值的&nbsp;Java&nbsp;类型映射为适当的&nbsp;JDBC&nbsp;类型。二者的差别在于&nbsp;setXXX&nbsp;方法使用从&nbsp;Java&nbsp;类型到&nbsp;JDBC&nbsp;类型的标准映射(参见第&nbsp;8.6.2&nbsp;节中的表格),而&nbsp;setObject&nbsp;方法使用从&nbsp;Java&nbsp;Object&nbsp;类型到&nbsp;JDBC&nbsp;类型的映射(参见第&nbsp;8.6.4&nbsp;节中的表格)。<BR><BR>方法&nbsp;setObject&nbsp;允许接受所有&nbsp;Java&nbsp;对象的能力使应用程序更为通用,并可在运行时接受参数的输入。这种情况下,应用程序在编译时并不清楚输入类型。通过使用&nbsp;setObject,应用程序可接受所有&nbsp;Java&nbsp;对象类型作为输入,并将其转换为数据库所需的&nbsp;JDBC&nbsp;类型。第&nbsp;8.6.5&nbsp;节中的表格显示了&nbsp;setObject&nbsp;可执行的所有可能转换。<BR><BR><BR>6.1.5&nbsp;将&nbsp;JDBC&nbsp;NULL&nbsp;作为&nbsp;IN&nbsp;参数发送<BR>setNull&nbsp;方法允许程序员将&nbsp;JDBC&nbsp;NULL&nbsp;值作为&nbsp;IN&nbsp;参数发送给数据库。但要注意,仍然必须指定参数的&nbsp;JDBC&nbsp;类型。<BR><BR>当把&nbsp;Java&nbsp;null&nbsp;值传递给&nbsp;setXXX&nbsp;方法时(如果它接受&nbsp;Java&nbsp;对象作为参数),也将同样把&nbsp;JDBC&nbsp;NULL&nbsp;发送到数据库。但仅当指定&nbsp;JDBC&nbsp;类型时,方法&nbsp;setObject&nbsp;才能接受&nbsp;null&nbsp;值。<BR><BR><BR>6.1.6&nbsp;发送大的&nbsp;IN&nbsp;参数<BR>setBytes&nbsp;和&nbsp;setString&nbsp;方法能够发送无限量的数据。但是,有时程序员更喜欢用较小的块传递大型的数据。这可通过将&nbsp;IN&nbsp;参数设置为&nbsp;Java&nbsp;输入流来完成。当语句执行时,JDBC&nbsp;驱动程序将重复调用该输入流,读取其内容并将它们当作实际参数数据传输。<BR><BR>JDBC&nbsp;提供了三种将&nbsp;IN&nbsp;参数设置为输入流的方法:setBinaryStream&nbsp;用于含有未说明字节的流,&nbsp;setAsciiStream&nbsp;用于含有&nbsp;ASCII&nbsp;字符的流,而&nbsp;setUnicodeStream&nbsp;用于含有&nbsp;Unicode&nbsp;字符的流。因为必须指定流的总长度,所以这些方法所采用的参数比其它的&nbsp;setXXX&nbsp;方法要多一个。这很有必要,因为一些数据库在发送数据之前需要知道其总的传送大小。<BR><BR>以下代码例示了使用流作为&nbsp;IN&nbsp;参数来发送文件内容:&nbsp;<BR><BR>java.io.File&nbsp;file&nbsp;=&nbsp;new&nbsp;java.io.File("/tmp/data");<BR>int&nbsp;fileLength&nbsp;=&nbsp;file.length();<BR>java.io.InputStream&nbsp;fin&nbsp;=&nbsp;new&nbsp;java.io.FileInputStream(file);<BR>java.sql.PreparedStatement&nbsp;pstmt&nbsp;=&nbsp;con.prepareStatement(<BR>"UPDATE&nbsp;Table5&nbsp;SET&nbsp;stuff&nbsp;=&nbsp;?&nbsp;WHERE&nbsp;index&nbsp;=&nbsp;4");<BR>pstmt.setBinaryStream&nbsp;(1,&nbsp;fin,&nbsp;fileLength);<BR>pstmt.executeUpdate();<BR><BR>当语句执行时,将反复调用输入流&nbsp;fin&nbsp;以传递其数据。<BR></FONT></TD></TR>
  <TR>
    <TD height=5>
      <HR align=center color=#cccccc noShade SIZE=1>
    </TD></TR></TBODY></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -