`
xiao_yi
  • 浏览: 405409 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC基础(五)

阅读更多

里程碑:JDBC基础

现在您已经到达了一个里程碑。

 

我们迄今所做的可以说明您已学习了JDBC的一些基础知识。您已看到创建表、在表中插入数据、查询表、检索结果以及更新表的方法。这些都是使用数据库的具体细节,现在您可以使用JDBC 1.0 API将它们用于Java程序中了。迄今为止,在例子中只可看到非常简单的查询,但只要驱动程序和DBMS支持,就可以使用已讨论的基本的JDBC API向DBMS发送非常复杂的SQL查询。

本讲其余部分讨论如何使用稍微复杂一点的特性:预备语句、存储过程和事务处理。也阐述了警告和异常, 并举例说明如何将JDBC程序转换成Applet。本讲最后一部分是您可亲自运行的示范代码。

 

使用预备语句

有时用PreparedStatement对象发送SQL语句给数据库更加方便有效。这种特殊类型的语句派生自更加通用的类Statement。

 

何时使用PreparedStatement对象

如果想多次执行一个Statement对象,使用PreparedStatement对象代替Statement对象一般会缩短执行时间。

与Statement对象不同的是,PreparedStatement对象的主要特性是创建时就指定SQL语句。因此,它的好处在于多数场合下,这条语句马上发送到DBMS进行编译。其结果是PreparedStatement对象不只是包含一条SQL语句,而是包含一条预编译过的SQL语句。这表明PreparedStatement执行时,DBMS不必编译就可直接运行PreparedStatement的SQL语句。

尽管PreparedStatement对象可用于不带参数的SQL语句,但在多数场合是用于带参数的SQL语句。使用带参数的SQL语句的优点是,您可以使用相同的语句,只是在每次执行时提供不同的参数值。下面几节您会看到这种例子。

创建PreparedStatement对象

如同Statement对象,您可用Connection方法创建PreparedStatement对象。使用前面例子打开的连接con,可编写如下代码创建带有两个输入参数的PreparedStatement对象:

PreparedStatement updateSales = con.prepareStatement(
    "UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?");

现在变量updateSales包含了SQL语句“UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ?”,在多数情况下,这条语句也已发送到DBMS预编译。

为PreparedStatement参数提供值

如果有参数,那在执行PreparedStatement对象前还应使用值来替代问号占位符。通过调用PreparedStatement类中定义的一种setXXX方法就可完成该替代。如果想用来替代问号的值是Java整数值,那么可调用SetInt。如果想用来替代问号的值是Java字符串,就可调用setString方法,如此等等。在Java程序设计语言中,一般情况下一种类型有一种setXXX方法。

使用前面例子创建的PreparedStatement对象updateSales,下面代码将把第一个问号占位符设为值75的Java整数:

updateSales.setInt(1, 75);

从例子中可以猜测到,setXXX方法的第一个参数表示设置的是哪个问号占位符,第二个参数表示设置值。下一例子将第二个占位符参数设为字符串“Colombian”:

updateSales.setString(2, "Colombian");

为两个输入参数设置值后,updateSales中的SQL语句就等价于前面例子使用的String对象updateString中的SQL语句。因此下面两个代码段等价:

代码段1:

String updateString = "UPDATE COFFEES SET SALES = 75 " + 
		      "WHERE COF_NAME LIKE 'Colombian'";
stmt.executeUpdate(updateString);

代码段2:

PreparedStatement updateSales = con.prepareStatement(
	"UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? ");
updateSales.setInt(1, 75); 
updateSales.setString(2, "Colombian"); 
updateSales.executeUpdate():

这里使用executeUpdate方法执行Statement对象stmt和PreparedStatement对象updateSales。但执行updateSales时并没有为executeUpdate提供参数,因为updateSales已经包含了要执行的SQL语句。

看到这些例子您可能会这样想,既然简单语句(只有一条)涉及较少的步骤,那为什么要用带参数的PreparedStatement对象?如果只想更新SALES列一两次,那就没必要使用带输入参数的SQL语句。相反,如果要经常更新数据,特别是在可用for或while循环为参数设置连续值的情况下,使用PreparedStatement就要容易得多。本节后面会有这样的例子。

一旦为参数设置了数值,它将一直保存这个值,直到它重设为另一个值或调用了clearParameters方法为止。下面的代码段使用PreparedStatement对象updateSales例示了在重设一个参数值、保持另一参数不变后重用一条预备语句:

updateSales.setInt(1, 100); 
updateSales.setString(2, "French_Roast"); 
updateSales.executeUpdate(); 
// changes SALES column of French Roast row to 100
updateSales.setString(2, "Espresso");
updateSales.executeUpdate(); 
// changes SALES column of Espresso row to 100 (the first 
// parameter stayed 100, and the second parameter was reset
// to "Espresso")

使用循环设置参数值

通过使用for或while循环设置输入参数值通常可使编码更容易些。

下面代码段例示使用for循环设置PreparedStatement对象updateSales中的参数值。数组salesForWeek保存每周销售量。这些销售量对应数组coffees中的咖啡名称,因此salesForWeek的第一个数量(175)应用于coffees中的第一个咖啡名称(“Colombian”),salesForWeek的第二个数量(150)应用于coffees中的第二个咖啡名称(“French_Roast”),以此类推。这段代码展示更新COFFEES表中所有咖啡的SALES列:

 
PreparedStatement updateSales;
String updateString = "update COFFEES " +
		      "set SALES = ? where COF_NAME like ?";
updateSales = con.prepareStatement(updateString);
int [] salesForWeek = {175, 150, 60, 155, 90};
String [] coffees = {"Colombian", "French_Roast", "Espresso",
		     "Colombian_Decaf", "French_Roast_Decaf"};
int len = coffees.length;
for(int i = 0; i < len; i++) {
		updateSales.setInt(1, salesForWeek[i]);
		updateSales.setString(2, coffees[i]);
		updateSales.executeUpdate();
	}

当咖啡馆老板想更新下一周销售数量时就可用相同代码做模板。但他要按正确顺序在数组salesForWeek中输入新的销售数量。数组coffees中的咖啡名称保持不变,因此它们不需要变更(在实际的应用程序中,这些数值可能从用户那里输入而不是从初始化Java数组输入)。

executeUpdate方法的返回值

尽管executeQuery返回一个ResultSet对象,其中包含发送到DBMS的查询的结果,但executeUpdate返回的是一个整数值,指出了表中已更新的行数。例如,下面的代码显示executeUpdate的返回值(将赋给变量n):

 
updateSales.setInt(1, 50); 
updateSales.setString(2, "Espresso"); 
int n = updateSales.executeUpdate();
// n = 1 because one row had a change in it

COFFEES表被更新了,即Espresso行的SALES列中的值被替换为50。此更新影响表中的一行,因此n等于1。

当executeUpdate方法执行DLL语句(如创建表)时将返回整数0。因此下面的代码段中,执行创建COFFEES表的DLL语句后,赋给n的值是0:

 
int n = executeUpdate(createTableCoffees); // n = 0

注意,executeUpdate的返回值为0表明如下两种情况:(1) 执行的语句是一个不影响任何行的更新语句;(2) 执行的是一个DLL语句。

评论

相关推荐

    JDBC 基础实例(非常适合初学者)

    **JDBC基础实例详解** Java Database Connectivity (JDBC) 是Java平台中用于与关系数据库进行交互的一种标准接口。它是Java编程语言的一部分,允许应用程序通过Java代码执行SQL语句,实现数据的增删改查操作。对于...

    Jdbc第五章数据库实例

    **JDBC第五章数据库实例详解** 在Java编程中,JDBC(Java Database Connectivity)是用于与各种数据库进行交互的一组接口和类。JDBC提供了一种标准的API,使得Java开发者能够连接、查询和操作数据库,无论是Oracle...

    jsp基础JDBC小项目

    二、JDBC基础 1. 驱动加载:JDBC操作的第一步是加载数据库驱动,通过Class.forName()方法指定驱动类名,如"com.mysql.jdbc.Driver"。 2. 数据库连接:使用DriverManager.getConnection()方法建立到数据库的连接,...

    自学jdbc心得体会

    五、JDBC连接URL * Oracle URL的格式:jdbc:oracle:thin:@XXX.XXX.X.XXX:XXXX:XXXXXXX * MySQL URL的写法:jdbc:mysql://localhost:3306/tarena * SQLServer URL的写法:jdbc:microsoft:sqlserver://localhost:1433...

    JDBC基础教程之概述.txt

    ### JDBC基础教程之概述 #### 一、JDBC简介与概念理解 JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC的...

    JDBC基础教程之连接.doc

    ### JDBC基础教程之连接知识点详解 #### 一、Connection对象及其作用 - **Connection对象**:在JDBC中,`Connection`对象代表了一个与数据库之间的连接。通过这个连接,应用程序可以执行SQL语句并获取结果集。 - *...

    JDBC 入门电子书.zip

    **JDBC 入门知识详解** ...综上所述,JDBC是Java与数据库交互的基础,理解其工作原理和最佳实践对于任何Java开发者来说都至关重要。通过深入学习,我们可以更有效地构建健壮且高效的数据库应用程序。

    JDBC基础-Java学习笔记

    ### JDBC基础知识点详解 #### 一、JDBC概述 **JDBC** (Java Database Connectivity) 是 Java 开发者用来访问数据库的重要技术之一。它提供了一组标准的接口和类,使得开发者可以使用 Java 语言来编写数据库应用...

    jdbc资料jdbc资料jdbc资料pdf

    - `java.sql`包含基础的JDBC类和接口,如`Connection`, `Statement`, `ResultSet`等。 - `javax.sql`包含高级功能,例如`DataSource`等。 - **`DriverManager`类**: - **作用**:用于创建与数据库的连接。 - *...

    JDBC基础教程之驱动设置.doc

    ### JDBC基础教程之驱动设置详解 #### 一、概述与DriverManager的作用 JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和...

    jdbc 课件.doc

    **JDBC基础应用详解** **一、JDBC概述** JDBC(Java Database Connectivity)是Java语言与各种数据库之间通信的标准接口,由Sun Microsystems公司开发并引入Java平台,它允许Java程序通过标准API来访问和操作...

    JDBC基础教程之语句.doc

    ### JDBC基础教程之语句详解 #### 一、概述与Statement对象 JDBC(Java Database Connectivity)是一种用于执行SQL语句的Java API,允许Java应用程序连接到几乎所有的关系型数据库管理系统。本文档主要介绍了JDBC...

    jdbc实现与线程池

    一、jdbc 基础 jdbc 是 Java 中访问数据库的标准 API,提供了统一的接口来访问不同的数据库管理系统。jdbc 的主要组件包括: * DriverManager:负责管理数据库连接的驱动程序。 * Connection:表示与数据库的连接...

    JDBC基础教程之PreparedStatement.doc

    ### JDBC基础教程之PreparedStatement知识点详解 #### 一、概述 `PreparedStatement`是Java数据库连接(JDBC)API中的一种重要接口,它继承自`Statement`接口,并在其基础上进行了扩展和优化。`PreparedStatement`...

    jdbc入门至精通

    本文将从基础概念出发,逐步深入,帮助读者从入门到精通JDBC。 **第二节 jdbc的概念** 2.1 **概念** JDBC是Java API(应用程序接口),它为Java程序员提供了一组接口和类,用于与各种数据库进行交互,实现数据的增...

    jdbc学习基础笔记

    ### JDBC学习基础笔记详解 #### 一、JDBC与ODBC概述 JDBC(Java Database Connectivity)是Java中用于连接数据库的标准接口,它允许Java应用程序与各种类型的数据库进行交互,而无需关心底层数据库的具体实现。...

    非常全面JDBC资源

    **一、JDBC基础** 1. **JDBC驱动**: JDBC驱动是Java与数据库之间的桥梁,分为四种类型:JDBC-ODBC桥接驱动、本地API驱动、网络纯Java驱动和协议翻译驱动。 2. **连接数据库**: 使用`DriverManager.getConnection()`...

    JDBC基础教程之CallableStatement.doc

    ### JDBC基础教程之CallableStatement详解 #### 一、概述 在数据库编程中,为了提高代码的复用性和执行效率,通常会使用存储过程。存储过程是预编译并存储在数据库中的SQL语句集合,可以接受输入参数并返回输出...

    发个基础jdbc

    **标题:“发个基础jdbc”** 在Java编程中,JDBC(Java Database Connectivity)是连接Java应用程序和数据库的标准接口。这个“基础jdbc”的主题涵盖了如何使用JDBC进行基本的数据库操作,包括数据库连接、SQL语句...

Global site tag (gtag.js) - Google Analytics