`
xiao_yi
  • 浏览: 395226 次
  • 性别: 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语句。

评论

相关推荐

    Java_JDBC由浅入深

    第十五节 jdbc轻量级封装 88 15.1 将结果集封装为Map 88 15.1.1 ResultSetMetaData演示 88 15.1.2解决多行记录的问题 89 15.1.3 Map结果集的封装 90 15.2 将结果集封装为对象 91 15.2.1 user表POJO的编写 91 15.2.2 ...

    基于JSP+JDBC+MySQL开发报价管理系统

    有一定Java的基础,那么这个课程肯定适合你。 4.创建数据库表 客户表、产品类型表、产品表、订单表、报价表。 5.分为6讲: 01第一讲:课程介绍和系统分析 02第二讲:客户管理模块页面设计 03第三讲:数据库管理类和...

    达梦数据库8,DM8,jdbc驱动

    DM8是达梦公司在总结DM系列产品研发与应用经验的基础上,坚持开放创新、简洁实用的理念,历经五年匠心打磨,推出的新一代自研数据库。 DM8吸收借鉴当前先进新技术思想与主流数据库产品的优点,融合了分布式、弹性...

    Java数据库技术详解 DOC简版

    第5章 JDBC技术基础 5.1 JDBC概述 5.2 JDBC API 5.3 JDBC操作数据库 5.4 本章小结 第6章 JDBC的高级特性 6.1 PreparedStatement预编译对象 6.2 CallableStatement存储过程对象 6.3 BatchedUpdate...

    Java操作数据库之jdbc【原生方式】

    例如说jdbc,dbutil+C3p0,hibernate,jdbcTemplate等等【这五个都会总结】,到后面的话使用一些高级的框架去操作数据库,比如hibernate。但是底层操作数据库是重要的,高级框架也是也底层为基础搭建的,所以这里还是...

    java面试基础知识.docx

    java开发面试基础,第一部分包含虚拟机、基础语法、面向对象、异常处理、IO、集合、线程、网络、高级问题。第二部分包括HTML、JS、JQUERY、XML。第三部分包括服务器、JSP、JDBC、servlet、filter、listener。第四...

    JAVA语言程序基础教程

    第一章 Java语言的基础知识 第二章 面向对象的编程 第三章 Java程序的执行 第四章 标识符、关键字与类型 第五章 运算符、表达式与数组 第六章 Java语句 第七章 面向对象编程介绍 ...第十五章 Java与数据库(JDBC)

    软件设计基础(从事软件开发设计必备的基础知识)

    非常适合初学者,学校的课程资源,制作成PDF格式,分十二个章节:第一章 JAVA语言简介、第二章 Java的图形界面、第三章 流与Java中的文件操作、第四章 数据库概述、第五章 SQL与JDBC、第六章 数据库规范化设计、第七...

    Java&OOP-电子档源码+课件

    第一章:Java 简介第二章:Java 语言基础第三章:面向对象的概念和 Java 实现-1第四章:面向对象的概念和 Java 实现-2第五章:异 常第六章:java.lang包第七章:java.util 包第八章:java.io 包 第九章:JBuilder ...

    JAVA程序设计基础

    JAVA程序设计 第一章 计算机语言概述 第二章 Java的开发环境 第三章 Java语言基础 第四章 Java面向对象的程序设计 第五章 异常处理 第六章 Java的可重用类 ...第十一章 Java与数据库的连接—JDBC技术

    Java 2教程(第五版)

    本书主要介绍了核心语言...企业级Java技术部分讨论了JDBC API、EJB体系结构的基础知识、Java平台安全方案以及XML。 本书结构严谨、语言流畅,是一个学习Java 2最新技术的综合参考书,适合各种层次的Java编程人员使用。

    《剑指offer》Java基础-反射篇.pdf

    Java基础 反射篇 反射的思想及作用 反射的基本使用 获取类的 Class 对象 构造类的实例化对象 ...JDBC 加载数据库驱动类 反射的优势及缺陷 增加程序的灵活性 破坏类的封装性 性能损耗 反射基础篇文末总结

    在线商城说明书 .java软件技术文档

    3.2.2 编写JDBC基础操作类 10 第四章 系统实现 10 4.1 系统界面布局设计 10 4.1.1 登录界面布局设计 10 4.1.2 主界面布局设计 11 4.1.3 注册界面布局设计 11 4.1.4 个人中心界面布局设计 12 4.1.5 购物车界面布局...

    5天入门hibernate

    五天时间可以让你入门hibernate 基础:corejava jdbc 数据库基础

    java面试题库2021.pdf

    2、 JDBC 基础 ①数据库 ②数据库连接池 ③事物管理, 批处理 3、 JDBC 进阶 五、 XML 编程 1、 XML 基础 2、 XML 进阶 3、 Web service ①WSDL 与 SOAP 协议 六、 计算机网络 1、 网络概述 ①关于分层 2、 运输层 ...

    Spring, SpringMVC, MyBatis, JDBC, MySQL, JSP, Servlet, Bootstrap

    Java初学者:通过学习和实践这些项目,您将能够快速掌握SSM框架的基础知识和核心技术。 中高级开发者:这些项目将为您提供丰富的实战经验和灵感,帮助您提升技术水平和解决问题的能力。 项目经理和架构师:这些项目...

    Java语言基础下载

    第十九章: JDBC基础 320 学习目标 320 JDBC的概念 321 连接数据库的几种方式 321 JAVA编程语言和JDBC 323 JDBC编程的步骤 323 实例分析 325 内容总结 335 独立实践 336 第二十章:高级JDBC 337 学习目标 337 使用...

Global site tag (gtag.js) - Google Analytics