当前位置: 移动技术网 > IT编程>开发语言>Java > 详解Java的JDBC中Statement与PreparedStatement对象

详解Java的JDBC中Statement与PreparedStatement对象

2019年07月22日  | 移动技术网IT编程  | 我要评论
一旦获得一个连接,我们可以与数据库进行交互。在jdbc statement, callablestatement 和 preparedstatement 接口定义的方法和属

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

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

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

2015122585343394.png (571×206)

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!

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网