使用 Statement 执行查询和更新
Statement 对象用于将SQL语句发送到数据库中。实际上有3种 Statement 对象:Statement、PreparedStatement(它从 Statement 继承而来) 、CallableStatement(它从 PreparedStatement 中继承而来)。
Statement 对象用于执行不带参数的简单SQL语句;
PreparedStatement 对象用于执行 带 或 不带 IN 参数的预编译SQL语句;
CallableStatement 对象用于执行对数据库已存储过程的调用。
也就是说,Statement 接口提供了执行语句和获取结果的基本方法。PreparedStatement 接口添加了处理IN参数的方法。CallableStatement 添加了处理out 参数的方法。
使用ResultSet 处理结果集
(Statement 实例都在前面写了很多例子)
---------------------------------------------------传说中的分割线--------------------------------------------------
使用 PreparedStatement 执行预编译的查询和更新
在前面,我用连接对象 Connection 产生 Statement 对象,然后用 Statement 与数据库处理系统进行交互。Statement 对象在每次执行SQL语句时都将该语句传递给数据库,在多次执行同一语句时,这样的效率就也太低了。
解决这个问题的方法就是 使用 PreparedStatement 对象。如果数据库支持预编译,可以在创建 PreparedStatement 对象时将SQL语句传递给数据库做预编译,以后每次执行这个SQL语句时,速度就可以提高很多。如果不支持预编译,则在语句执行时,才将其传给数据库。这对用户来说是完全透明的。
一般情况下,使用 PreparedStatement 对象都是带输入参数的。下面来看看如何使用PreparedStatement :
1、创建一个 PreparedStatement 对象
PreparedStatement 类是 Statement 类的子类,同Statement类一样,PreparedStatement 类的对象也是建立在Connection 对象之上的。
PreparedStatement pstmt = conn.preparedStatement("update goods set sales=? where goods_name like?");
2、为PreparedStatement 对象提供参数
如果以带输入参数的SQL语句形式创建了一个 PreparedStatement 对象(绝大多数情况下都是这样)。在SQL语句被数据库管理系统正确执行之前,必须为参数(也就是SQL语句中是 ? 的地方)进行初始化。初始化的方法是调用PreparedStatement 类的一系列setXXX() 方法,如果输入的参数类型是int 类型,则调用setInt()方法,如果是String类型,则调用setString()方法。
接上一句例程序:
pstmt.setInt(1,75);
pstmt.setString(2,"googs1");
pstmt.executeUpdate();
注:setXXX() 方法一般有两个参数,第一个参数都是 Int 型,该参数指示 JDBC PreparedStatement 对象的第几个参数将要被初始化,第二个参数值就是PreparedStatement 将要初始化的参数的值,数据类型也就自然相同。
pstmt.setInt(1,75); 该语句使 pstmt对象所应对的SQL语句中参数SALES 的值被初始化为75;
pstmt.setString(2,"googs1");该语句使 pstmt对象所应对的SQL语句中参数GOODS_NAME的值被初始化为goods1。
pstmt.executeUpdate();该语句就是将上面的数据更新。
值得注意的是,当一个对象的参数被初始化之后,该参数的值一直保持不变的,除非它再来一次赋值。
3、设置PreparedStatement 对象的参数
在JSP实际应用中,PreparedStatement 对象要求输入大量的参数值,这就需要使用循环结构来解决繁琐的参数赋值问题,我们继续前面的例子:
int [] salesForWeek = {100,85,95,88,135};
String [] goodsName = {"goods1","goods2","goods3","goods4","goods5"};
int len = goodsName.length;//注意,这儿的length不是length();
for(int i=0;i<len;i++){
pstmt.setInt(1,salesForWeeks[i]);
pstmt.setString(2,goodsName[i]);
pstmt.executeUpdate();
}
代码解释:在这段代码中,用Int型数组来存储将要被更新记录的销售额,用String型数组来存储将要被更新记录的商品名。这两个数组的值一一对应,销售额100对应着商品名为goods1的商品,依次类推。
我们以后想再次更新数据库中的数据时,可以将这段代码当做模板,只需要将数组中的数据进行修改,就可以完成要求的功能了。
---------------------------------------------------传说中的分割线--------------------------------------------------
使用 CallableStatement 执行存储过程。
1、存储过程的概念
存储过程是存储在数据库管理系统服务器上的一组预编译的SQL语句,它是一种封装重复任务操作的方法,支持用户提供的变量,具有强大的编程功能。
2、存储过程的优点
首先,使用存储过程可以与其他应用程序共享应用程序的逻辑,从而确保对数据访问和操作的一致性。
其次,存储过程提供一种安全机制。如果用户被授权执行存储过程的权限,那么,即使该用户没有访问该存储过程所参考表或者视图的权限,也可以执行该存储过程,而不会受到影响。
再者,由于存储过程在第一次执行之后,其执行规划就存储在高速缓冲存储卡中,所以在以后的操作中,只要从高速缓冲中调用已编译好的二进制代码来执行,从而加速了存储过程的执行,提高了系统的功能。
最后,使用存储过程可以减少网络传输所需要的时间,这是使用存储过程的一个非常重要的原因。
3、使用JDBC创建存储过程
存储过程一般是在数据库管理系统中创建的,在应用程序中进行调用,但在有些情况下,应用程序要根据运行环境的情况动态创建存储过程。比如说一种存储过程要向一个表中插入数据,但向哪个表中插入数据是不固定的,要动态决定。这时就要在JSP中创建存储过程,看下面代码:
//创建Statement
Statement stmt = conn.createStatement();
String sqlstr = "create procedure testproc(new_keyword in da
new_author in da
(keyword,title,author,institution,docsource,ndatabase,url) values (new_keyword,new_title,new_author,
new_institution,new_docsource,new_ndatabase,new_url); end;";
stmt.executeUpdate(sqlstr);
注:不同数据库管理系统创建存储过程的SQL语句的语法是有一定的差别的,这个例子用的是Oracle创建存储过程的语法。
4、创建一个CallableStatement 对象
//将前一段代码创建的存储过程名赋值给变量procedurename
String procedurename = ......;
String call_procedure_string = "{call"+procedurename+"(?,?,?,?,?,?,?)}"
//创建一个CallableStatement 对象,该对象和特定的存储过程相关联
CallableStatement cstmt = conn.preparedCall(call_procedure_string);
5、初始化CallableStatement 对象的参数
String keyword = "kword";
String title = "title";
String author = "author";
String institution = "institution";
String docsource = "docsource";
String ndatabase = "ndatabase";
String url = "url";
try{
CallableStatement cstmt = conn.preparedCall(call_procecure_string);
cstmt.setString(1,keyword);
cstmt.setString(2,title);
cstmt.setString(3,author);
cstmt.setString(4,institution);
cstmt.setString(5,docsource);
cstmt.setString(6,ndatabase);
cstmt.setString(7,url);
}catch(Exception e){
}
6、执行CallableStatement 对象对应的executeUpdate()方法
try{
cstmt.executeUpdate();
}catch(SQLException e){
System.out.println("SQLException in insertValue();"+e.getMessage());
}
至此,一个完整的CallableStatement 对象的使用过程便完成了。
本文介绍了使用JDBC通过Statement、PreparedStatement及CallableStatement对象执行SQL查询和更新的方法。详细讲解了每种对象的特点及其应用场景,并提供了具体的代码示例。

被折叠的 条评论
为什么被折叠?



