欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解Java的JDBC中Statement与PreparedStatement对象

程序员文章站 2024-03-08 17:52:22
一旦获得一个连接,我们可以与数据库进行交互。在jdbc statement, callablestatement 和 preparedstatement 接口定义的方法和属...

一旦获得一个连接,我们可以与数据库进行交互。在jdbc statement, callablestatement 和 preparedstatement 接口定义的方法和属性,使可以发送sql或pl/sql命令和从数据库接收数据。

它们还定义方法,帮助java和数据库使用sql数据类型之间转换数据的差异。

下表提供了每个接口的用途概要,了解决定使用哪个接口

详解Java的JDBC中Statement与PreparedStatement对象

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!