详解Java的JDBC中Statement与PreparedStatement对象
一旦获得一个连接,我们可以与数据库进行交互。在jdbc statement, callablestatement 和 preparedstatement 接口定义的方法和属性,使可以发送sql或pl/sql命令和从数据库接收数据。
它们还定义方法,帮助java和数据库使用sql数据类型之间转换数据的差异。
下表提供了每个接口的用途概要,了解决定使用哪个接口
statement 对象:
创建statement对象
在可以使用statement对象执行sql语句,需要使用connection对象的createstatement( )方法创建一个,如下面的示例所示:
statement stmt = null; try { stmt = conn.createstatement( ); . . . } catch (sqlexception e) { . . . } finally { . . . }
一旦创建了一个statement对象,然后可以用它来与它的三个执行方法之一执行sql语句。
boolean execute(string sql) : 如果resultset对象可以被检索返回布尔值true,否则返回false。使用这个方法来执行sql ddl语句,或当需要使用真正的动态sql。
int executeupdate(string sql) : 返回受影响的sql语句执行的行的数目。使用此方法来执行,而希望得到一些受影响的行的sql语句 - 例如,insert,update或delete语句。
resultset executequery(string sql) : 返回resultset对象。当希望得到一个结果集使用此方法,就像使用一个select语句。
关闭 statement 对象:
正如关闭一个connection对象来保存数据库资源,出于同样的原因,也应该关闭statement对象。
close()方法简单的调用将完成这项工作。如果关闭了connection对象首先它会关闭statement对象也是如此。然而,应该始终明确关闭statement对象,以确保正确的清除。
statement stmt = null; try { stmt = conn.createstatement( ); . . . } catch (sqlexception e) { . . . } finally { stmt.close(); }
preparedstatement 对象
preparedstatement接口扩展了statement接口,让过一个通用的statement对象增加几个高级功能。
statement 提供动态参数的灵活性。
创建preparedstatement 对象:
preparedstatement pstmt = null; try { string sql = "update employees set age = ? where id = ?"; pstmt = conn.preparestatement(sql); . . . } catch (sqlexception e) { . . . } finally { . . . }
在jdbc中所有的参数都被代表?符号,这是已知的参数标记。在执行sql语句之前,必须提供值的每一个参数。
setxxx()方法将值绑定到参数,其中xxx表示希望绑定到输入参数值的java数据类型。如果忘了提供值,将收到一个sqlexception。
每个参数标记是由它的序号位置引用。第一标记表示位置1,下一个位置为2 等等。这种方法不同于java数组索引,以0开始。
所有的statement对象的方法来与数据库交互(a) execute(), (b) executequery(), 及(c) executeupdate() 也与preparedstatement对象的工作。然而,该方法被修改为使用sql语句,可以利用输入的参数。
关闭preparedstatement对象:
正如关闭statement对象,出于同样的原因,也应该关闭的preparedstatement对象。
close()方法简单的调用将完成这项工作。如果关闭了connection对象首先它会关闭preparedstatement对象。然而,应该始终明确关闭preparedstatement对象,以确保正确的清除。
preparedstatement pstmt = null; try { string sql = "update employees set age = ? where id = ?"; pstmt = conn.preparestatement(sql); . . . } catch (sqlexception e) { . . . } finally { pstmt.close(); }
preparedstatement实例
以下是这使得使用preparedstatement以及打开和关闭statments的例子:
复制下面的例子中jdbcexample.java,编译并运行,如下所示:
//step 1. import required packages import java.sql.*; public class jdbcexample { // jdbc driver name and database url static final string jdbc_driver = "com.mysql.jdbc.driver"; static final string db_url = "jdbc:mysql://localhost/emp"; // database credentials static final string user = "username"; static final string pass = "password"; public static void main(string[] args) { connection conn = null; preparedstatement stmt = null; try{ //step 2: register jdbc driver class.forname("com.mysql.jdbc.driver"); //step 3: open a connection system.out.println("connecting to database..."); conn = drivermanager.getconnection(db_url,user,pass); //step 4: execute a query system.out.println("creating statement..."); string sql = "update employees set age=? where id=?"; stmt = conn.preparestatement(sql); //bind values into the parameters. stmt.setint(1, 35); // this would set age stmt.setint(2, 102); // this would set id // let us update age of the record with id = 102; int rows = stmt.executeupdate(); system.out.println("rows impacted : " + rows ); // let us select all the records and display them. sql = "select id, first, last, age from employees"; resultset rs = stmt.executequery(sql); //step 5: extract data from result set while(rs.next()){ //retrieve by column name int id = rs.getint("id"); int age = rs.getint("age"); string first = rs.getstring("first"); string last = rs.getstring("last"); //display values system.out.print("id: " + id); system.out.print(", age: " + age); system.out.print(", first: " + first); system.out.println(", last: " + last); } //step 6: clean-up environment rs.close(); stmt.close(); conn.close(); }catch(sqlexception se){ //handle errors for jdbc se.printstacktrace(); }catch(exception e){ //handle errors for class.forname e.printstacktrace(); }finally{ //finally block used to close resources try{ if(stmt!=null) stmt.close(); }catch(sqlexception se2){ }// nothing we can do try{ if(conn!=null) conn.close(); }catch(sqlexception se){ se.printstacktrace(); }//end finally try }//end try system.out.println("goodbye!"); }//end main }//end jdbcexample
现在来编译上面的例子如下:
c:>javac jdbcexample.java
当运行jdbcexample,它会产生以下结果:
c:>java jdbcexample
connecting to database... creating statement... rows impacted : 1 id: 100, age: 18, first: zara, last: ali id: 101, age: 25, first: mahnaz, last: fatma id: 102, age: 35, first: zaid, last: khan id: 103, age: 30, first: sumit, last: mittal goodbye!
下一篇: Java 垃圾回收机制详解及实例代码