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

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

译文:

JDBC与JSP研究

1JDBC入门

本文阐述了JDBC(数据库连接)API(应用程序接口)的基本内容。在这里,你将学到用基本的JDBC API去创建表单,插入数值,查询表单,检索结果,修改表单,创建动态语句,完成事务,捕捉异常和错误。

本文来自SUN公司关于JDBC基础内容的官方指南。

--概述 --建立连接 --第一个JDBC语句 --精制JDBC语句 --执行DDL语句 --执行查询语句 --结果集访问说明 --事务处理 --异常和错误处理 --简单的代码和编辑规则

1.1 概述

JDBC的访问级接口是提供了SQL数据库操作和更新操作的编程接口。他们通过带数据库接口的库程序允许在普通的程序中调用SQL。特别的,Java提供了很多非常简单的基于JDBC的接口。

这里有一条简单的方法可也看到在访问级发生了什么:你正在写一个简单的Java程序。在程序的某处,你需要和数据库交换数据。用标准的库程序,你就可也打开一个数据库的连接。接下来,用JDBC来发送SQL代码给数据库,并且加工要返回的结果。等到你结束工作,就关闭数据连接。

这样的方法需要和内嵌SQL的预编辑方法相比较。后者含有一个预编辑过程,在这个过程中内嵌的SQL语句被转化为主机语言代码(C/C++)。访问级的接口不要求预编辑过程就避免了内嵌SQL语句转化的过程。这样在增加轻便性的同时使客户—服务的关系更清晰。

1.2 建立连接

当然,最先要做的是在你的计算机上安装Java,JDBC和DBMS。由于我们想

要连接Oracle数据库,我们也就需要一个支持它的驱动程序。幸运地是,我们有一个负责的主管他已经在Leland的机子上为我们做好了。

和前面说的一样,在一个数据库能被访问前,一个在程序(client)和数据库(server)之间的连接必须被打开。这包括两步:

1、装载特定厂商的驱动程序

为什么需要这一步呢? 为了确保轻便和代码重用,API被尽可能地设计来不依赖于一个数据库的版本或厂家。由于不同DBMS拥有不同的行为,我们就需要告诉驱动管理器我们想用那种DBMS,以便它能调用正确的驱动程序。装载Oracle驱动程序可以用下面的代码:

Class.forName(“oracle.jdbc.driver.OracleDriver”) 2、建立连接

当驱动装载完成就可以建立连接,你建立一个实际的连接可以用: Connection con=DriverManger.getConnection(“jdbc:oracle: thin:

@dbaprodl:1544:SHRI_PRD”,username,password );

现在,让我们看看这个语句是干什么的。第一个字符串是关于数据库的URL,它包含了协议(JDBC),厂商(oracle),驱动(thin),服务器(dbaprodl),端口号(1521),和一个服务实例(SHRI_PRD)。用户名和密码就是你过去输入SQLPLUS以进入你的帐户的用户名和密码。

这就是建立连接的步骤。最后一步返回来的是一个打开的连接,我们将用它来向数据库传递SQL语句。在上面的代码中,con是一个打开的连接,并且我们在后面还将用到它。注意:上面提到的价值在我们的环境中是用根据的。他们在别的环境中有不同的价值。

1.3 创建JDBC 语句

JDBC语句对象是用来发送你的SQL语句到DBMS的,不是与SQL语句相混淆的。JDBC语句是绑定在一个打开的连接上的,不只是一个简单的SQL语句。你能把JDBC语句对象想象成嵌在连接上的一个信息通道,它能传递一个或多个你的SQL语句(那些你要执行的)到DBMS。

一个活动的连接要求创建一个Statement对象。下面的小代码,就是用刚才的连接con,来为你实现Statement对象的:

Statement stmt = con.createStatement();

这样,一个Statement对象存在了,但是它没有向DBMS传递一个SQL语句。我们将在下一节学习它。

1.4 精制JDBC语句

有时,用精制的语句对象来向DBMS发送SQL语句能更方便或更有效。它区

别于其超类Statement的主要特征是,它不像Statement,在它被创建时就被给与了一个正确的SQL语句。这个SQL语句接下来就以正确的方式发向DBMS,并且在那里得到编译。因此,精制的语句实际上是连接的一个信道,并汇编有关SQL声明. 和用普通的语句在每次用的时候都要编译一次相比,它提供的优势是,当你需要用相同的或相似的带不同参数的查询多次,语句就可以被DBMS编译和优化,而在不同参数时,不再要求编译。

PreparedStatements 也是用连接方法来创建的。下面的小代码展示了怎么创建一个有三个输入参数的带参数SQL语句:

PreparedStatements prepareUpdateprice =con. preparedStatements(

“UPDATE Sells SET price = ? where bar = ? AND beer = ?”);

在执行一个PreparedStatement前,我们需要提供参数的值。这可以调用定义在PreparedStatement类中的SET XXX方法来完成。最常用的方法是setInt,setFloat,setDouble,setString 等。你可以设置参数的值在执行准备的语句前。 继续上面的例子,我们将写:

prepareUpdatePrice.setInt(1, 3);

prepareUpdatePrice.setString(2, \ prepareUpdatePrice.setString(3, \

1.5 执行DDL语句

在JDBC中执行SQL语句用很多样式,他们依赖于SQL语句的目的。DDL(数据定义语言)语句,象表的创建和删除语句,还有更新表的内容的语句都是通过executeupdate方法执行的。注意到这些命令都改变数据库的状态,因此方法的名字包含”Update”。

下面的代码是executeupdate语句的例子: Statement stmt con.createStatement();

stmt. Executeupdate(“CREATE TABLE Sells” + “(bar VARCHAR2(40),beer

VARCHAR2(40),price REAL)”);

stmt. Executeupdate(“INSERT INTO Sells ” + “VALUES (?Bar Of

Foo?,?BudLite?,2.00)” );

String sqlString= “CREATE TABLE Bars ” + “name

VARCHAR2(40),address VARCHAR2(80),license INT”);

Stmt. Executeupdate(sqlString);

由于SQL语句不太适合在一行上显示,我们就把它打断成两个字符串,并且用加号连接起来以便它被编译。特别注意“INSERT INTO Sells”和“VALUES”之间的间隔。也注意我们更愿意重用相同的Statement而不是重新创建一个。

在执行executeUpdate时常常是调用DDL语句,返回的结果一般是0,在数据修改语句执行时将返回一个大于或等于0的值,这个数据表明了其间的关系。

当使用PreparedStatement时,我们将执行这样的一个语句,它首先要设定参数的值(象上面所见的那样),接着调用executeUpdate.

int n = prepareUpdatePrice.executeUpdate();

1.6 执行SQL语句

作为和前一节的语句相对的语句,一个查询希望得到一组记录来作为结果,并且不改变数据库的状态。自然地,这里就有相应的方法叫做executeQuery,它返回一个ResultSet对象作为其结果。

String bar,beer; float price ;

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

Bar = rs.getString(“bar”); Beer = rs.getString(“beer”); Price = rs.getFloat(“price”);

System.out.println(bar + “sells” + beer + “for” + price + “Dollars.”); }

查询得到的结果集包含在一个变量rs中,rs是ResultSet的一个实例。这样的组对我们没有太大的作用,除非我们能访问每一行和每行中的各个属性。ResultSeta给我们提供了一个能让我们依次访问每行的游标。游标仅仅是第一行的集。每次调用next方法使它移动到下一行,如果下一行存在就返回真,如果没有剩余行就返回错。

我们可以用适当类型的getXXX方法去检索行的各个属性。 在前面的例子中,我们用了getDtring和getFloat两个方法来访问各列的值。注意到我们用想得到的值得列的列名作为方法的参数。同时也注意,VARCHAR2类型的bar,beer被转换为Java String,REAL转换为Java float.

同样地,我们可以指定列号来代替列名,也能得到相同的结果。这样,有关的语句就应该是:

Bar = rs.getString(1); Beer = rs.getString(2); Price = rs.getFloat(3);

当使用PreparedStatement工作时,我们应该执行一个设置好参数的查询,并且用它调用executeQuery方法。