jsp+sql智能道路交通信息管理系统-文献翻译 联系客服

发布时间 : 星期三 文章jsp+sql智能道路交通信息管理系统-文献翻译更新完毕开始阅读31c9e445ff00bed5b9f31d74

ResultSet rs = prepareUpdatePrice.executeQuery();

1.7 结果集访问说明

JDBC提供了一系列的方法来找出你在处理结果集的那个地方,方法包括:getRow,isFirst,isBeforeFirst,isLast,isAfterLast.

他们提供可以任意访问结果集中各行的游标。默认的,游标仅仅只能向前并且是只读的。在为Connection创建Statement时,你可以改变ResultSet的类型,使它成为更方便查找和更新的模型:

Statement stmt = con.createStartment(

ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);

ResultSet rs = stmt.executeQuery(“SELECT * FROM Sells”);

不同的类型选项有: TYPE_FORWARD_ONLY、TYPE_SCROLL_INSENSITIVE、和TYPE_SCROLL_SENSITIVE。你可以利用CONCUR_READ_ONLY和CONCUR_UPDATABLE选项来选择是用只读的还是可更新的游标。用默认的游标,你可以利用rs.next()来卷动游标。用可卷动的游标你可设置更多的选项:

rs.absolute(3); // 移动到第三tuple

rs.previous(); //向后移动一个tuple(tuple 2) rs.relative(2); //向后移动两个tuples(tuple 4) rs. relative(-3); //往回移动两个tuples(tuple 1)

这里还有很多可卷动游标特征的细节。可卷动游标,虽然在某些应用中很有用,但是它非常复杂,因此在使用时要小心和克制。更多关于游标细节的操作技术可以在New Features in the JDBC 2.0 API上找到。

1.8 事务处理

JDBC允许多个SQL语句嵌入到一个单一的事务中。因而,我们用JDBC事务可以确保ACID(原子性、一致性、独立性、完整性)属性。

事务控制是通过连接对象完成的。当连接建立时,它就默认是自动提交型。这意味着每个SQL语句都被认为是一个单独得事务,并且只要它自身执行完成就马上提交。(这样并不完全精确,并且在大多数情况下,我们可能被它蒙蔽而不知道这些细节。)

我们能为连接关闭自动提交,用: con.setAutoCommit(false); 也可以再打开,用: con. setAutoCommit(ture);

一旦自动提交关闭,没有SQL语句能被提交(那不是说,数据库将永远得不到更新),直到你明确地调用commit()方法来告诉它提交。

Con.commit();

在提交之前的任何地方,我们都可也调用rollback()来卷回事务,并恢复数据到上一次提交的地方(在尝试更新之前)。下面是个融合了上面观点的例子。

con.setAutoCommit(false);

Statement stmt = con.createStatement();

Stmt.executeUpdate(“INSERT INTO Sells VALUES(?bar of

foo?,?budlite?,?1.00?)”);

con.rollback();

Stmt.executeUpdate(“INSERT INTO Sells VALUES(?bar of

joe?,?Miller?,?2.00?)”);

con.commit();

con.setAutoCommit(true);

让我们浏览这个例子理解几个方法的用法和作用。我们首先看看自动提交关闭时,接下来的几条语句需要看成一个整体。我们尝试在Sells表中插入记录(?bar of foo?,?budlite?,?1.00?))。然而,这个操作最终并没完成(committed).当我们调用rollback,我们取消了插入。注意,Sells表现在仍和我们尝试插入之前一样。接着我们尝试插入其他记录,并且这次,我们提交了事务。现在Sells表就受到了永久的影响,并且多了一条新的记录。最后,我们重新开启了自动提交。

我们同样可以按需要地设定事务的独立性。例如,我们可以设定事务独立性为TRANSACTION_READ_COMMITTED,它不允许访问数据直到数据提交完毕,同时也不允许读脏数据。在连接的接口中提供了5个独立性级别。默认下,独立性级别是串行化 。JDBC允许查看数据库设定的独立性级别(用连接的getTransactionIsolation方法),也可以设定适当的级别(用连接的setTransactionIsolation方法)。

rollback常常和Java异常处理结合在一起来恢复不可预知的错误。这样的结合提供了简单而优秀的处理数据完整性的机制。我们将在下一节学习JDBC的异常处理。

1.9 错误与异常处理

事实上,在软件项目中错误是常常发生的。经常,数据库程序是一个危险的应用,并且温和地捕捉和处理错误是势在必行的。程序应该能恢复并使数据库保持一致性的状态。Rollback与Java异常处理机制协同工作是达到这一要求的一条清晰的道路。

客户端(程序)访问服务器(数据库)需要是否有错误从服务器返回。JDBC通过两个不同级别的错误情况(SQLException和SQLWarning)来获取以上信息。

SQLExceptions是Java异常,假如不处理,会终止应用程序。SQLWarnings是SQLException的子类,但它们描述不致命的错误或不预期的情况等,可以忽略。

在Java中,预计要抛出异常或警告的语句被包含在try语句块中。如果在try语句块中的语句抛出了异常或警告,那么,在相应的catch语句中将被捕获。每个catch语句都被指明准备捕获那个异常。

下面是一个捕捉异常,使用错误情况来卷回事务的例子: try{

con.setAutoCommit(false); stmt.executeUpdate(“CREATE

TABLE

Sells

(bar

VARCHAR2(40),”+”beer VARHAR2(40),price REAL)”); stmt.executeUpdate(\

\ con.commit() ;

con.setAutoCommit(true) ;

}catch(SQLException ex) {

System.err.println(\ con.rollback() ;

con.setAutoCommit(true) ;

}

既然这样,一个异常肯定被抛出,因为错误的书写导致了beer被定义为VARHAR2。由于在DBMS中没有这样的类型,一个SQLException将被抛出。这样输出就将是:

Message: ORA-00902:invalid datatype

还有就是,如果你的数据类型正确,但万一你的你的数据库超过了空间限制并不能再创建一个新的表。SQLWarning可以从Connection对象、Statement对象和ResultSet对象中找回来。每一个仅仅存放着最近的SQLWarning。因此,只要你用你的Statement对象执行其他的语句,那么以前的警告就将被丢弃。下面的小代码举例说明了怎么使用SQLWarning:

ResultSet rs = stmt.executeQuery(\ SQLWarning warn = stmt.getWarnings() ; if (warn != null)

System.out.println(\ SQLWarning warning = rs.getWarnings() ;

if (warning != null)

warning = warning.getNextWarning() ; if (warning != null)

System.out.println(\

SQLWarnings(相对于SQLExceptions)其实是相当难得,最多的就是数据连接切断的警告。后面将要指出的是在读或写数据库是这里存在的一个问题。

1.11简单的代码和编辑规则

有望地,到现在你已经可以熟悉地用JDBC写复杂的代码了。这里有一个简单的例子融合了上面多有的观点。

我们还有一些简单的为教育的目的由Craig Jurney编写的代码。你可以免费地使用这些代码来作为一个准则,或者在将来写代码是用作筐架,但是你要在你引用了代码的应用上做一个说明。

SQLBuilder.java - Creation of a Relation 关系的创建 SQLLoader.java - Insertion of Tuples 插入记录 SQLRunner.java - Processes Queries 查询过程 SQLUpdater.java - Updating Tuples 更新记录 SQLBatchUpdater.java - Batch Updating 批更新

SQLUtil.java - JDBC Utility Functions JDBC的有用函数

不要忘记用source /usr/class/cs145/all.env,它将正确的设置你的classpath。

增加你的全局的classpath的简单命令:

elaine19:~$ javac SQLBuilder.java elaine19:~$ java SQLBuilder

替换成:

elaine19:~$ javac SQLBuilder.java

elaine19:~$ java –classpath

/usr/pubsw/apps/oracle/8.1.5/jdbc/lib/classes111.zip: SQLBuilder

在java的用户名和密码文件中有固定的用户名和密码。他们必须被改成你自己的用户名和密码,这样你才能访问数据库。

这篇文章最初由Nathan Folkert在2000年春写给Jennifer Widom教授的CS145班,在2000年秋,它又被Mayank Bawa出租给Jeff Ullman教授的CS145班。Jim Zhuang在2005年夏作了一点小改动。同时感谢Matt Laue的排版改正。

2利用JSP和JDBC技术访问动态的WEB数据