|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。6-PreparedStatement
本概述是从《JDBCTMDatabaseAccessfromJavaTM:ATutorialandAnnotatedReference》这本书中摘引来的。JavaSoft今朝正在筹办这本书。这是一本教程,同时也是JDBC的主要参考手册,它将作为Java系列的构成部分在1997年春季由Addison-Wesley出书公司出书。
6.1概述
该PreparedStatement接口承继Statement,并与之在两方面有所分歧:
PreparedStatement实例包括已编译的SQL语句。这就是使语句“筹办好”。
包括于PreparedStatement对象中的SQL语句可具有一个或多个IN参数。IN参数的值在SQL语句创立时未被指定。相反的,该语句为每一个IN参数保存一个问号(“?”)作为占位符。每一个问号的值必需在该语句实行之前,经由过程得当的setXXX办法来供应。
因为PreparedStatement对象已预编译过,以是其实行速率要快于Statement对象。因而,屡次实行的SQL语句常常创立为PreparedStatement对象,以进步效力。
作为Statement的子类,PreparedStatement承继了Statement的一切功效。别的它还增加了一整套办法,用于设置发送给数据库以代替IN参数占位符的值。同时,三种办法execute、executeQuery和executeUpdate已被变动以使之不再必要参数。这些办法的Statement情势(承受SQL语句参数的情势)不该该用于PreparedStatement对象。
6.1.1创立PreparedStatement对象
以下的代码段(个中con是Connection对象)创立包括带两个IN参数占位符的SQL语句的PreparedStatement对象:
PreparedStatementpstmt=con.prepareStatement(
"UPDATEtable4SETm=?WHEREx=?");
pstmt对象包括语句"UPDATEtable4SETm=?WHEREx=?",它已发送给DBMS,并为实行作好了筹办。
6.1.2传送IN参数
在实行PreparedStatement对象之前,必需设置每一个?参数的值。这可经由过程挪用setXXX办法来完成,个中XXX是与该参数响应的范例。比方,假如参数具有Java范例long,则利用的办法就是setLong。setXXX办法的第一个参数是要设置的参数的序数地位,第二个参数是设置给该参数的值。比方,以下代码将第一个参数设为123456789,第二个参数设为100000000:
pstmt.setLong(1,123456789);
pstmt.setLong(2,100000000);
一旦设置了给定语句的参数值,便可用它屡次实行该语句,直到挪用clearParameters办法扫除它为止。
在毗连的缺省形式下(启用主动提交),当语句完成时将主动提交或复原该语句。
假如基础数据库和驱动程序在语句提交以后仍坚持这些语句的翻开形态,则统一个PreparedStatement可实行屡次。假如这一点不建立,那末试图经由过程利用PreparedStatement对象取代Statement对象来进步功能是没成心义的。
使用pstmt(后面创立的PreparedStatement对象),以下代码例示了怎样设置两个参数占位符的值并实行pstmt10次。如上所述,为做到这一点,数据库不克不及封闭pstmt。在该示例中,第一个参数被设置为"Hi"并坚持为常数。在for轮回中,每次都将第二个参数设置为分歧的值:从0入手下手,到9停止。
pstmt.setString(1,"Hi");
for(inti=0;i<10;i++){
pstmt.setInt(2,i);
introwCount=pstmt.executeUpdate();
}
6.1.3IN参数中数据范例的分歧性
setXXX办法中的XXX是Java范例。它是一种隐含的JDBC范例(一样平常SQL范例),由于驱动程序将把Java范例映照为响应的JDBC范例(遵守该JDBCGuide中§8.6.2“映照Java和JDBC范例”表中所指定的映照),并将该JDBC范例发送给数据库。比方,以下代码段将PreparedStatement对象pstmt的第二个参数设置为44,Java范例为short:
pstmt.setShort(2,44);
驱动程序将44作为JDBCSMALLINT发送给数据库,它是Javashort范例的尺度映照。
程序员的义务是确保将每一个IN参数的Java范例映照为与数据库所需的JDBC数据范例兼容的JDBC范例。无妨思索数据库必要JDBCSMALLINT的情形。假如利用办法setByte,则驱动程序将JDBCTINYINT发送给数据库。这是可行的,由于很多数据库可从一种相干的范例转换为另外一品种型,而且一般TINYINT可用于SMALLINT合用的任何中央。但是,关于要合用于尽量多的数据库的使用程序,最好利用与数据库所需切实其实切的JDBC范例响应的Java范例。假如所需的JDBC范例是SMALLINT,则利用setShort取代setByte将使使用程序的可移植性更好。
6.1.4利用setObject
程序员可以使用setObject办法显式地将输出参数转换为特定的JDBC范例。该办法能够承受第三个参数,用来指定方针JDBC范例。将JavaObject发送给数据库之前,驱动程序将把它转换为指定的JDBC范例。
假如没有指定JDBC范例,驱动程序就会将JavaObject映照到其缺省的JDBC范例(拜见第8.6.4节中的表格),然后将它发送到数据库。这与惯例的setXXX办法相似;在这两种情形下,驱动程序在将值发送到数据库之前,会将该值的Java范例映照为得当的JDBC范例。两者的不同在于setXXX办法利用从Java范例到JDBC范例的尺度映照(拜见第8.6.2节中的表格),而setObject办法利用从JavaObject范例到JDBC范例的映照(拜见第8.6.4节中的表格)。
办法setObject同意承受一切Java对象的才能使使用程序更加通用,并可在运转时承受参数的输出。这类情形下,使用程序在编译时其实不分明输出范例。经由过程利用setObject,使用程序可承受一切Java对象范例作为输出,并将其转换为数据库所需的JDBC范例。第8.6.5节中的表格显现了setObject可实行的一切大概转换。
6.1.5将JDBCNULL作为IN参数发送
setNull办法同意程序员将JDBCNULL值作为IN参数发送给数据库。但要注重,仍旧必需指定参数的JDBC范例。
当把Javanull值传送给setXXX办法时(假如它承受Java对象作为参数),也将一样把JDBCNULL发送到数据库。但仅当指定JDBC范例时,办法setObject才干承受null值。
6.1.6发送年夜的IN参数
setBytes和setString办法可以发送无穷量的数据。可是,偶然程序员更喜好用较小的块传送年夜型的数据。这可经由过程将IN参数设置为Java输出流来完成。当语句实行时,JDBC驱动程序将反复挪用该输出流,读取其内容并将它们看成实践参数数据传输。
JDBC供应了三种将IN参数设置为输出流的办法:setBinaryStream用于含有未申明字节的流,setAsciiStream用于含有ASCII字符的流,而setUnicodeStream用于含有Unicode字符的流。由于必需指定流的总长度,以是这些办法所接纳的参数比别的的setXXX办法要多一个。这很有需要,由于一些数据库在发送数据之前必要晓得其总的传送巨细。
以下代码例示了利用流作为IN参数来发送文件内容:
java.io.Filefile=newjava.io.File("/tmp/data");
intfileLength=file.length();
java.io.InputStreamfin=newjava.io.FileInputStream(file);
java.sql.PreparedStatementpstmt=con.prepareStatement(
"UPDATETable5SETstuff=?WHEREindex=4");
pstmt.setBinaryStream(1,fin,fileLength);
pstmt.executeUpdate();
当语句实行时,将重复挪用输出流fin以传送其数据。
j2EE和asp比较,其实也没什么比的,原因和我上面说那些比较差不了多少,也是稳定性,安全性,J2EE比asp高,速度上比不过asp,asp也是延续着它的拖拽控件的方法,提高速度。 |
|