小女巫 发表于 2015-1-18 11:18:19

JAVA教程之JDBCTM 指南:进门4 - Statement

C#跟java类似,但是在跨平台方面理论上可以跨平台,实际上应用不大,执行性能优于java,跟C++基本一致,但是启动速度还是慢.代码安全,但容易性能陷阱.4-Statement
本概述是从《JDBCTMDatabaseAccessfromJavaTM:ATutorialandAnnotatedReference》这本书中摘引来的。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创立,以下列代码段中所示:

Connectioncon=DriverManager.getConnection(url,"sunny","");
Statementstmt=con.createStatement();

为了实行Statement对象,被发送到数据库的SQL语句将被作为参数供应给Statement的办法:

ResultSetrs=stmt.executeQuery("SELECTa,b,cFROMTable2");

4.1.2利用Statement对象实行语句
Statement接口供应了三种实行SQL语句的办法:executeQuery、executeUpdate和execute。利用哪个办法由SQL语句所发生的内容决意。

办法executeQuery用于发生单个了局集的语句,比方SELECT语句。

办法executeUpdate用于实行INSERT、UPDATE或DELETE语句和SQLDDL(数据界说言语)语句,比方CREATETABLE和DROPTABLE。INSERT、UPDATE或DELETE语句的效果是修正表中零行或多行中的一列或多列。executeUpdate的前往值是一个整数,唆使受影响的行数(即更新计数)。关于CREATETABLE或DROPTABLE等不操纵行的语句,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.5Statement对象中的SQL本义语法
Statement可包括利用SQL本义语法的SQL语句。本义语法告知驱动程序个中的代码应当以分歧体例处置。驱动程序将扫描任何本义语法,并将它转换成特定命据库可了解的代码。这使得本义语法与DBMS有关,并同意程序员利用在没有本义语法时不成用的功效。

本义子句由花括号和关头字界定:

{keyword...parameters...}

该关头字唆使本义子句的范例,以下所示。


escape暗示LIKE本义字符


字符“%”和“_”相似于SQLLIKE子句中的通配符(“%”婚配零个或多个字符,而“_”则婚配一个字符)。为了准确注释它们,应在其后面加上反斜杠(“”),它是字符串中的特别本义字符。在查询开端包含以下语法便可指定用作本义字符的字符:

{escapeescape-character}


比方,以下查询利用反斜杠字符作为本义字符,查找以下划线开首的标识符名:

stmt.executeQuery("SELECTnameFROMIdentifiers
WHEREIdLIKE`\_%{escape`};


fn暗示标量函数


几近一切DBMS都具有标量值的数值、字符串、工夫、日期、体系和转换函数。要利用这些函数,可以使用以下本义语法:关头字fn后跟所需的函数名及其参数。比方,以下代码挪用函数concat将两个参数毗连在一同:

{fnconcat("Hot","Java")};


可用以下语法取得以后数据库用户名:

{fnuser()};


标量函数大概由语法稍有分歧的DBMS撑持,而它们大概不被一切驱动程序撑持。各类DatabaseMetaData办法将列出所撑持的函数。比方,办法getNumericFunctions前往用逗号分开的数值函数列表,而办法getStringFunctions将前往字符串函数,等等。

驱动程序将本义函数挪用映照为响应的语法,或间接完成该函数。


d、t和ts暗示日期和工夫笔墨


DBMS用于日期、工夫和工夫标志笔墨的语法各不不异。JDBC利用本义子句撑持这些笔墨的语法的ISO尺度格局。驱动程序必需将本义子句转换成DBMS暗示。

比方,可用以下语法在JDBCSQL语句中指定日期:

{d`yyyy-mm-dd}


在该语法中,yyyy为年月,mm为月份,而dd则为日期。驱动程序将用等价的特定于DBMS的暗示交换这个本义子句。比方,假如28-FEB-99切合基础数据库的格局,则驱动程序将用它交换{d1999-02-28}。

关于TIME和TIMESTAMP也有相似的本义子句:

{t`hh:mm:ss}
{ts`yyyy-mm-ddhh:mm:ss.f...}


TIMESTAMP中的小数点后的秒(.f...)部分可疏忽。


call或?=call暗示已存储历程



假如数据库撑持已存储历程,则可从JDBC中挪用它们,语法为:

{callprocedure_name[(?,?,...)]}


或(个中历程前往了局参数):

{?=callprocedure_name[(?,?,...)]}


方括号唆使个中的内容是可选的。它们不是语法的需要部分。

输出参数能够为笔墨或参数。有关具体信息,拜见JDBC指南中第7节,“CallableStatement”。

可经由过程挪用办法DatabaseMetaData.supportsStoredProcedures反省数据库是不是撑持已存储历程。



oj暗示内部毗连



内部毗连的语法为

{ojouter-join}


个中outer-join情势为

tableLEFTOUTERJOIN{table/outer-join}ONsearch-condition


内部毗连属于初级功效。有关它们的注释可拜见SQL语法。JDBC供应了三种DatabaseMetaData办法用于断定驱动程序撑持哪些内部毗连范例:supportsOuterJoins、supportsFullOuterJoins和supportsLimitedOuterJoins。


办法Statement.setEscapeProcessing可翻开或封闭本义处置;缺省形态为翻开。当功能极其主要时,程序员大概想封闭它以削减处置工夫。但一般它将出于翻开形态。应注重:setEscapeProcessing不合用于PreparedStatement对象,由于在挪用该语句前它便可能已被发送到数据库。有关预编译的信息,拜见PreparedStatement。


4.1.6利用办法execute
execute办法应当仅在语句能前往多个ResultSet对象、多个更新计数或ResultSet对象与更新计数的组应时利用。当实行某个已存储历程或静态实行未知SQL字符串(即使用程序程序员在编译时未知)时,有大概呈现多个了局的情形,只管这类情形很少见。比方,用户大概实行一个已存储历程(利用CallableStatement对象-拜见第135页的CallableStatement),而且该已存储历程可实行更新,然后实行选择,再举行更新,再举行选择,等等。一般利用已存储历程的人应晓得它所前往的内容。

由于办法execute处置十分规情形,以是猎取其了局必要一些特别处置其实不足为怪。比方,假定已知某个历程前往两个了局集,则在利用办法execute实行该历程后,必需挪用办法getResultSet取得第一个了局集,然后挪用得当的getXXX办法猎取个中的值。要取得第二个了局集,必要先挪用getMoreResults办法,然后再挪用getResultSet办法。假如已知某个历程前往两个更新计数,则起首挪用办法getUpdateCount,然后挪用getMoreResults,并再次挪用getUpdateCount。

关于不晓得前往内容,则情形更加庞大。假如了局是ResultSet对象,则办法execute前往true;假如了局是Javaint,则前往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){
introwCount=stmt.getUpdateCount();
if(rowCount>0){//它是更新计数
System.out.println("Rowschanged="+count);
stmt.getMoreResults();
continue;
}
if(rowCount==0){//DDL命令或0个更新
System.out.println("NorowschangedorstatementwasDDL
command");
stmt.getMoreResults();
continue;
}

//实行到这里,证实有一个了局集
//或没有别的了局

ResultSetrs=stmt.getResultSet;
if(rs!=null){
...//利用元数据取得关于了局集列的信息
while(rs.next()){
...//处置了局
stmt.getMoreResults();
continue;
}
break;//没有别的了局


主要缺点就是:速度比较慢,没有C和C++快

第二个灵魂 发表于 2015-1-20 19:52:47

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

小妖女 发表于 2015-1-29 18:52:48

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

兰色精灵 发表于 2015-2-6 03:16:09

Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)

简单生活 发表于 2015-2-6 17:23:21

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

飘飘悠悠 发表于 2015-2-17 15:11:22

是一种语言,用以产生「小应用程序(Applet(s))

再见西城 发表于 2015-2-17 17:39:15

你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。

深爱那片海 发表于 2015-3-2 01:29:27

关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。

老尸 发表于 2015-3-4 01:51:05

是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能

只想知道 发表于 2015-3-7 09:05:40

是一种将安全性(Security)列为第一优先考虑的语言

谁可相欹 发表于 2015-3-11 06:47:27

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

活着的死人 发表于 2015-3-17 22:50:16

另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。

因胸联盟 发表于 2015-3-25 04:19:23

Java是一种计算机编程语言,拥有跨平台、面向对java
页: [1]
查看完整版本: JAVA教程之JDBCTM 指南:进门4 - Statement