21.7 常见疑难解答
21.7.1 操作数据库的具体步骤是什么
1.创建Statement对象
建立了到特定数据库的连接之后,就可用该连接发送SQL语句,Statement对象用Connection的方法createStatement创建,如下所示:
Connection con=DriverManager.getConnection(url,"sunny","");
Statement stmt=con.createStatement();
为了执行Statement对象,发送到数据库的SQL语句将被作为参数提供给Statement的方法:
ResultSet rs=stmt.executeQuery("select a, b,c from Table2");
使用Statement对象执行语句,Statement接口提供了三种执行SQL语句的方法:executeQuery()、executeUpdate()和execute(),使用哪一个方法由SQL语句所产生的内容决定。
方法executeQuery()用于产生单个结果集的语句,例如select语句。
方法executeUpdate()用于执行insert、update或delete语句以及SQL DDL(数据定义语言)语句,例如create table和drop table。insert、update或delete语句的效果是修改表中零行或多行中的一列或多列。executeUpdate()的返回值是一个整数,指示受影响的行数(即更新计数)。对于create table或drop table等不操作行的语句,executeUpdate()的返回值总为零。
方法execute()用于执行返回多个结果集、多个更新计数或二者组合的语句,多数程序员不需要该高级功能。
执行语句的所有方法都会关闭所调用的Statement对象的当前结果集,这意味着在重新执行Statement对象之前,需要完成对当前ResultSet对象的处理。
注意
继承了Statement接口中所有方法的PreparedStatement接口,都有自己的executeQuery()、executeUpdate()和execute()方法。Statement对象本身不包含SQL语句,因而必须给Statement.execute()方法提供SQL语句作为参数。PreparedStatement对象并不将SQL语句作为参数提供给这些方法,因为它们已经包含预编译SQL语句。CallableStatement对象继承这些方法的PreparedStatement形式,对于这些方法的PreparedStatement或CallableStatement版本,使用查询参数将抛出SQLException。
2.语句完成
当连接处于自动提交模式时,其中所执行的语句在完成时将自动提交或还原。语句在已执行且所有结果返回时,即认为已完成。对于返回一个结果集的executeQuery()方法,在检索完ResultSet对象的所有行时该语句完成。对于方法executeUpdate(),当它执行时语句即完成,但在少数调用方法execute()的情况中,在检索所有结果集或它生成的更新计数之后,语句才完成。
有些DBMS将存储过程中的每条语句视为独立的语句,而另外一些则将整个过程视为一个复合语句。在启用自动提交时,这种差别就变得非常重要,因为它影响什么时候调用commit()方法。在前一种情况中,每条语句单独提交,在后一种情况中,所有语句同时提交。
3.关闭Statement对象
Statement对象将由Java垃圾收集程序自动关闭。而一种好的编程风格,应在不需要Statement对象时,显式地关闭它们,这将立即释放DBMS资源,有助于避免潜在的内存问题。