大雀软件园

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

JDBCTM 指南:入门4 - Statement

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

4 - statement本概括是从《jdbctm database access from javatm: a tutorial and annotated reference 》这该书中摘引入的。javasoft 暂时正在筹备这该书。这是一本教程,同声也是 jdbc 的要害参考画册,它将动作 java 系列的构成部份在 1997 年春季由 addison-wesley 出书公司出书。 4.1 概括statement 东西用来将 sql 语句发送给数据库中。本质上有三种 statement 东西,它们都动作在给定贯穿上实行 sql 语句的容纳器:statement、preparedstatement(它从 statement 接受而来)和 callablestatement(它从 preparedstatement 接受而来)。它们都专用来发送一定典型的 sql 语句: statement 东西用来实行不带参数的大略 sql 语句;preparedstatement 东西用来实行带或不带 in 参数的摘编译 sql 语句;callablestatement 东西用来实行对数据库已保存进程的挪用。statement 接口供给了实行语句和获得截止的基础本领。preparedstatement 接口增添了处置 in 参数的本领;而 callablestatement 增添了处置 out 参数的本领。4.1.1 创造 statement 东西创造了到特定命据库的贯穿之后,就可用该贯穿发送 sql 语句。statement 东西用 connection 的本领 createstatement 创造,如次列代码段中所示: connection con = drivermanager.getconnection(url, "sunny", "");statement stmt = con.createstatement();为了实行 statement 东西,被发送给数据库的 sql 语句将被动作参数供给给 statement 的本领: resultset rs = stmt.executequery("select a, b, c from table2");4.1.2 运用 statement 东西实行语句statement 接口供给了三种实行 sql 语句的本领:executequery、executeupdate 和 execute。运用哪一个本领由 sql 语句所爆发的实质确定。本领 executequery 用来爆发单个截止集的语句,比方 select 语句。本领 executeupdate 用来实行 insert、update 或 delete 语句以及 sql ddl(数据设置谈话)语句,比方 create table 和 drop table。insert、update 或 delete 语句的功效是窜改表中零行或多行中的一列或多列。executeupdate 的归来值是一个平头,引导受感化的行数(即革新计数)。对于 create table 或 drop table 等不操纵行的语句,executeupdate 的归来值总为零。本领 execute 用来实行归来多个截止集、多个革新计数或二者拉拢的语句。由于普遍步调员不会须要该高档功效,以是本概括反面将在独立一节中对其举行引见。实行语句的一切本领都将封闭所挪用的 statement 东西的暂时翻开截止集(即使生存)。这表示着在从新实行 statement 东西之前,须要实行对暂时 resultset 东西的处置。应提防,接受了 statement 接口中一切本领的 preparedstatement 接口都有本人的 executequery、executeupdate 和 execute 本领。statement 东西自己不包括 sql 语句,所以必需给 statement.execute 本领供给 sql 语句动作参数。preparedstatement 东西并不将 sql 语句动作参数供给给那些本领,由于它们仍旧包括摘编译 sql 语句。callablestatement 东西接受那些本领的 preparedstatement 情势。对于那些本领的 preparedstatement 或 callablestatement 本子,运用查问参数将抛出 sqlexception。4.1.3 语句实行当贯穿居于机动提交形式时,个中所实行的语句在实行时将机动提交或恢复。语句在已实行且一切截止归来时,即觉得已实行。对于归来一个截止集的 executequery 本领,在检索完 resultset 东西的一切行时该语句实行。对于本领 executeupdate,当它实行时语句即实行。但在少量挪用本领 execute 的情景中,在检索一切截止集或它天生的革新计数之后语句才实行。有些 dbms 将已保存进程中的每条语句视为独力的语句;而其余少许则将所有进程视为一个复合语句。在起用机动提交时,这种分辨就变得特殊要害,由于它感化什么功夫挪用 commit 本领。在前一种情景中,每条语句独立提交;在后一种情景中,一切语句同声提交。4.1.4 封闭 statement 东西statement 东西将由 java 废物搜集步调机动封闭。而动作一种好的编制程序作风,应在不须要 statement 东西时显式地封闭它们。这将登时开释 dbms 资源,无助于于制止潜伏的外存题目。4.1.5 statement 东西中的 sql 转义语法 statement 可包括运用 sql 转义语法的 sql 语句。转义语法报告启动步调个中的代码该当以各别办法处置。启动步调将扫描任何转义语法,并将它变换成特定命据库可领会的代码。这使得转义语法与 dbms 无干,并承诺步调员运用在没有转义语法时不行用的功效。转义子句由花括号和要害字界定: {keyword . . . parameters . . . }该要害字引导转义子句的典型,如次所示。escape 表白 like 转义字符 字符“%”和“_”一致于 sql like 子句中的通配符(“%”配合零个或多个字符,而“_”则配合一个字符)。为了精确证明它们,应在其前方加上反斜杠(“\”),它是字符串中的特出转义字符。在查问结束囊括如次语法即可指定用作转义字符的字符: {escape 'escape-character'}比方,下列查问运用反斜杠字符动作转义字符,搜索以次划线发端的操作符名: stmt.executequery("select name from identifierswhere id like `\_%' {escape `\'};fn 表白标量因变量简直一切 dbms 都具备标量值的数值、字符串、功夫、日子、体例和变换因变量。要运用那些因变量,可运用如次转义语法:要害字 fn 后跟所需的因变量名及其参数。比方,下列代码挪用因变量 concat 将两个参数贯穿在一道: {fn concat("hot", "java")};可用下列语法赢得暂时数据库用户名: {fn user()};标量因变量大概由语法稍有各别的 dbms 扶助,而它们大概不被一切启动步调扶助。百般 databasemetadata 本领将列出所扶助的因变量。比方,本领 getnumericfunctions 归来用逗点分割的数值因变量列表,而本领 getstringfunctions 将归来字符串因变量,之类。启动步调将转义因变量挪用映照为相映的语法,或径直实行该因变量。d、t 和 ts 表白日子和功夫笔墨dbms 用来日子、功夫和功夫标志笔墨的语法各不沟通。jdbc 运用转义子句扶助那些笔墨的语法的 iso 规范方法。启动步调必需将转义子句变换成 dbms 表白。比方,可用下列语法在 jdbc sql 语句中指定日子: {d `yyyy-mm-dd'}在该语法中,yyyy 为岁月,mm 为月份,而 dd 则为日子。启动步调将用等价的一定于 dbms 的表白替代这个转义子句。比方,即使 '28- feb-99' 适合基础数据库的方法,则启动步调将用它替代 {d 1999-02-28}。对于 time 和 timestamp 也有一致的转义子句: {t `hh:mm:ss'}{ts `yyyy-mm-dd hh:mm:ss.f . . .'}timestamp 中的少量点后的秒(.f . . .)局部可忽视。call 或 ? = call 表白已保存进程即使数据库扶助已保存进程,则可从 jdbc 中挪用它们,语法为: {call procedure_name[(?, ?, . . .)]}或(个中进程归来截止参数): {? = call procedure_name[(?, ?, . . .)]}方括号引导个中的实质是可选的。它们不是语法的需要局部。输出参数不妨为笔墨或参数。相关精细消息,拜见 jdbc 指南开中学第 7 节,“callablestatement”。可经过挪用本领 databasemetadata.supportsstoredprocedures 查看数据库能否扶助已保存进程。oj 表白外部贯穿外部贯穿的语法为 {oj outer-join}个中 outer-join 情势为 table left outer join {table / outer-join} on search-condition外部贯穿属于高档功效。相关它们的证明可拜见 sql 语法。jdbc 供给了三种 databasemetadata 本领用来决定启动步调扶助哪些外部贯穿典型:supportsouterjoins、supportsfullouterjoins 和 supportslimitedouterjoins。本领 statement.setescapeprocessing 可翻开或封闭转义处置;缺省状况为翻开。当本能极为要害时,步调员大概想封闭它以缩小处置功夫。但常常它将出于翻开状况。应提防: setescapeprocessing 不实用于 preparedstatement 东西,由于在挪用该语句前它就大概已被发送给数据库。相关摘编译的消息,拜见 preparedstatement。4.1.6 运用本领 executeexecute 本领该当仅在语句能归来多个 resultset 东西、多个革新计数或 resultset 东西与革新计数的拉拢时运用。当实行某个已保存进程或动静实行未知 sql 字符串(即运用步调步调员在编写翻译时未知)时,有大概展示多个截止的情景,纵然这种情景很罕见。比方,用户大概实行一个已保存进程(运用 callablestatement 东西 - 拜见第 135 页的 callablestatement),而且该已保存进程可实行革新,而后实行采用,再举行革新,再举行采用,之类。常常运用已保存进程的人应领会它所归来的实质。由于本领 execute 处置非惯例情景,以是获得其截止须要少许特出处置并不及为怪。比方,假设已知某个进程归来两个截止集,则在运用本领 execute 实行该进程后,必需挪用本领 getresultset 赢得第一个截止集,而后挪用符合的 getxxx 本领获得个中的值。要赢得第二个截止集,须要先挪用 getmoreresults 本领,而后再挪用 getresultset 本领。即使已知某个进程归来两个革新计数,则开始挪用本领 getupdatecount,而后挪用 getmoreresults,并再次挪用 getupdatecount。对于不领会归来实质,则情景更为搀杂。即使截止是 resultset 东西,则本领 execute 归来 true;即使截止是 java int,则归来 false。即使归来 int,则表示着截止是革新计数或实行的语句是 ddl 吩咐。在挪用本领 execute 之后要做的第一件工作是挪用 getresultset 或 getupdatecount。挪用本领 getresultset 不妨赢得两个或多个 resultset 东西中第一个东西;或挪用本领 getupdatecount 不妨赢得两个或多个革新计数中第一个革新计数的实质。当 sql 语句的截止不是截止集时,则本领 getresultset 将归来 null。这大概表示着截止是一个革新计数或没有其它截止。在这种情景下,确定 null 真实含意的独一本领是挪用本领 getupdatecount,它将归来一个平头。这个平头为挪用语句所感化的行数;即使为 -1 则表白截止是截止集或没有截止。即使本领 getresultset 已归来 null(表白截止不是 resultset 东西),则归来值 -1 表白没有其它截止。也即是说,当下列前提为真时表白没有截止(或没有其它截止): ((stmt.getresultset() == null) && (stmt.getupdatecount() == -1))即使仍旧挪用本领 getresultset 并处置了它归来的 resultset 东西,则有需要挪用本领 getmoreresults 以决定能否有其它截止集或革新计数。即使 getmoreresults 归来 true,则须要再次挪用 getresultset 来检索下一个截止集。总的来说,即使 getresultset 归来 null,则须要挪用 getupdatecount 来查看 null 是表白截止为革新计数仍旧表白没有其它截止。当 getmoreresults 归来 false 时,它表白该 sql 语句归来一个革新计数或没有其它截止。所以须要挪用本领 getupdatecount 来查看它是哪一种情景。在这种情景下,当下列前提为真时表白没有其它截止: ((stmt.getmoreresults() == false) && (stmt.getupdatecount() == -1))底下的代码演练了一种本领用来确认已考察挪用本领 execute 所爆发的十足截止集和革新计数: stmt.execute(querystringwithunknownresults);while (true) {int rowcount = stmt.getupdatecount();if (rowcount > 0) { // 它是革新计数system.out.println("rows changed = " + count);stmt.getmoreresults();continue;}if (rowcount == 0) { // ddl 吩咐或 0 个革新system.out.println(" no rows changed or statement was ddlcommand");stmt.getmoreresults();continue;}// 实行到这边,表明有一个截止集// 或没有其它截止resultset rs = stmt.getresultset;if (rs != null) {. . . // 运用元数据赢得对于截止集列的消息while (rs.next()) {. . . // 处置截止stmt.getmoreresults();continue;}break; // 没有其它截止

热门阅览

最新排行

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