大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> JSP专区 -> JDBCTM 指南:入门6-PreparedStatement

JDBCTM 指南:入门6-PreparedStatement

时间: 2021-07-31 作者:daque

6 - preparedstatement本概括是从《jdbctm database access from javatm: a tutorial and annotated reference 》这该书中摘引入的。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 东西: preparedstatement pstmt = con.preparestatement("update table4 set m = ? where x = ?");pstmt 东西包括语句 "update table4 set m = ? where x = ?",它已发送给 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 东西),以次代码例示了怎样树立两个参数占位符的值并实行 pstmt 10 次。总的来说,为做到这一点,数据库不许封闭 pstmt。在该示例中,第一个参数被树立为 "hi"并维持为常数。在 for 轮回中,历次都将第二个参数树立为各别的值:从 0 发端,到 9 中断。pstmt.setstring(1, "hi");for (int i = 0; i < 10; i++) {pstmt.setint(2, i);int rowcount = pstmt.executeupdate();}6.1.3 in 参数中数据典型的普遍性setxxx 本领中的 xxx 是 java 典型。它是一种隐含的 jdbc 典型(普遍 sql 典型),由于启动步调将把 java 典型映照为相映的 jdbc 典型(按照该 jdbc guide中§8.6.2 “映照 java 和 jdbc 典型”表中所指定的映照),并将该 jdbc 典型发送给数据库。比方,以次代码段将 preparedstatement 东西 pstmt 的第二个参数树立为 44,java 典型为 short: pstmt.setshort(2, 44);启动步调将 44 动作 jdbc smallint 发送给数据库,它是 java short 典型的规范映照。步调员的负担是保证将每个 in 参数的 java 典型映照为与数据库所需的 jdbc 数据典型兼容的 jdbc 典型。无妨商量数据库须要 jdbc smallint 的情景。即使运用本领 setbyte ,则启动步调将 jdbc tinyint 发送给数据库。这是可行的,由于很多数据库可从一种关系的典型变换为另一种典型,而且常常 tinyint 可用来 smallint 实用的任何场合。但是,对于要实用于尽大概多的数据库的运用步调,最佳运用与数据库所需的真实的 jdbc 典型相映的 java 典型。即使所需的 jdbc 典型是 smallint,则运用 setshort 包办 setbyte 将使运用步调的可移植性更好。6.1.4 运用 setobject步调员可运用 setobject 本领显式地将输出参数变换为一定的 jdbc 典型。该本领不妨接收第三个参数,用来指定目的 jdbc 典型。将 java object 发送给数据库之前,启动步调将把它变换为指定的 jdbc 典型。即使没有指定 jdbc 典型,启动步调就会将 java object 映照到其缺省的 jdbc 典型(拜见第 8.6.4 节中的表格),而后将它发送给数据库。这与惯例的 setxxx 本领一致;在这两种情景下,启动步调在将值发送给数据库之前,会将该值的 java 典型映照为符合的 jdbc 典型。二者的分辨在乎 setxxx 本领运用从 java 典型到 jdbc 典型的规范映照(拜见第 8.6.2 节中的表格),而 setobject 本领运用从 java object 典型到 jdbc 典型的映照(拜见第 8.6.4 节中的表格)。本领 setobject 承诺接收一切 java 东西的本领使运用步调更为通用,并可在运转时接收参数的输出。这种情景下,运用步调在编写翻译时并不领会输出典型。经过运用 setobject,运用步调可接收一切 java 东西典型动作输出,并将其变换为数据库所需的 jdbc 典型。第 8.6.5 节中的表格表露了 setobject 可实行的一切大概变换。6.1.5 将 jdbc null 动作 in 参数发送setnull 本领承诺步调员将 jdbc null 值动作 in 参数发送给数据库。但要提防,仍旧必需指定参数的 jdbc 典型。当把 java null 值传播给 setxxx 本领时(即使它接收 java 东西动作参数),也将同样把 jdbc null 发送给数据库。但仅当指定 jdbc 典型时,本领 setobject 本领接收 null 值。6.1.6 发送大的 in 参数setbytes 和 setstring 本领不妨发送无穷量的数据。然而,偶尔步调员更爱好用较小的块传播巨型的数据。这可经过将 in 参数树立为 java 输出流来实行。当语句实行时,jdbc 启动步调将反复挪用该输出流,读取其实质并将它们看成本质参数数据传输。jdbc 供给了三种将 in 参数树立为输出流的本领:setbinarystream 用来含有未证明字节的流, setasciistream 用来含有 ascii 字符的流,而 setunicodestream 用来含有 unicode 字符的流。由于必需指定流的总参谋长度,以是那些本领所沿用的参数比其它的 setxxx 本领要多一个。这很有需要,由于少许数据库在发送数据之前须要领会其总的传递巨细。以次代码例示了运用流动作 in 参数来发送文献实质: java.io.file file = new java.io.file("/tmp/data");int filelength = file.length();java.io.inputstream fin = new java.io.fileinputstream(file);java.sql.preparedstatement pstmt = con.preparestatement("update table5 set stuff = ? where index = 4");pstmt.setbinarystream (1, fin, filelength);pstmt.executeupdate();当语句实行时,将重复挪用输出流 fin 以传播其数据。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.