02_使用JDBC核心类之二

本文介绍了使用JDBC通过Statement、PreparedStatement及CallableStatement对象执行SQL查询和更新的方法。详细讲解了每种对象的特点及其应用场景,并提供了具体的代码示例。

使用 Statement 执行查询和更新

Statement 对象用于将SQL语句发送到数据库中。实际上有3种 Statement 对象:StatementPreparedStatement(它从 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  data.keyword%type,new_title in data.title%type,

new_author in data.author%type,new_institution in data.institution%type,new_docsource in data.docsource%type,new_ndatabse in data.ndatabase%type,new_url in data.url%type) as begin insert into test

(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 对象的使用过程便完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值