JAVA数据库编程和预编译语句

来源:互联网 发布:淘宝完整类目数据 编辑:程序博客网 时间:2024/05/16 18:13
JAVA数据库编程和预编译语句
一、首先介绍一下JDBC 
    JDBC API是一系列抽象的接口,应用程序开发人员通过它可以编写访问数据库的Java应用程序。JDBC API中,抽象类的实现是由驱动程序开发商提供的。驱动程序实现了应用程序和某个数据库产品之间的接口,它的治理器则对应用程序和驱动程序之间的交互进行控制。JDBC API主要用来连接数据库和直接调用SQL命令,执行各种SQL语句。利用JDBC API可以执行一般的SQL语句、动态SQL语句,以及带IN和OUT参数的存储过程。
  
  JDBC中的驱动程序必须提供实现方法的接口。JDBC API被定义在java.sql包中,其中定义了JDBC API用到的所有类、接口和方法,主要的类和接口有:
  
  ·DriverManager类——处理驱动程序的装入,为新的数据库连接提供支持。驱动程序要向该类注册后才能被使用。进行连接时,该类根据JDBC URL选择匹配的驱动程序。
  
  ·java.sql.Driver接口——驱动程序接口,负责确认URL与驱动程序的匹配、建立到数据库的连接等,其中的方法需要有相应的驱动程序实现。
  
  ·java.sql.Connection接口——表示到特定数据库的连接,其中的方法需要有相应的驱动程序实现。
  
  ·java.sql.Statement接口——为SQL语句提供一个容器,包括执行SQL语句、取得查询结果等方法。此接口有两个子类型:

  (1)java.sql.PreparedStatement,用于执行预编译的SQL语句;

  (2)java.sql.CallableStatement,用于执行对一个数据库内嵌过程的调用。

  ·java.sql.ResultSet接口——提供对结果集进行处理的手段。
 
二、在数据库编程中使用预编译语句
 
    使用基本的java.sql.Statement的一个主要缺点是,每次执行数据库操作时,都将SQL命令传递给RDBMS,在执行前进行解析和编译。为了消除重复解析和编译SQL命令所产生的开销,JDBC为用户提供了两种使用预编译SQL语句的方式:PreparedStatement对象和CallableStatement对象
    Statement对象三种不同的用法用在截然不同的场合中。当某条语句只想执行一次时,是使用基本java.sql.Statemetn的理想情况。
    如果有一条SQL命令需要在一个循环内重复执行,然后就放弃,最好的方法是使用PreparedStatement,它是由RDBMS解析、编译并临时缓存的。最后,如果有一条语句或语句组需要频繁执行,CallableStatement是最理想的,因为它已经编译并永久地保存在RDBMS中,需要时,使用名字调用即可。 
    可以用Connection.prepareStatement来创建PreparedStatement的实例,如下: 
    String query="String * from Orders where Amount>?"; 
    PreparedStatement pstate; 
      try{ 
          pstate=connection.prepareStatement(query); 
      }catch(SQLException sqlex){ 
          //处理异常 
      } 
在预编译语句中,变量用问号来指定。预编译语句可以包含无限数目的变量。 一旦创建了预编译语句,就可以像常规语句一样来执行它了。例如,上面代码段列出的预编译语句可以这样执行: 
    pstate.setDouble(1,100.00); 
      try{ 
          ResultSet result=pstate.executeQuery(); 
      } 
      catch(SQLException e){ 
          //处理异常 
   } 
PreparedStatement类有许多指定变量的setXXX方法,其中XXX指数据类型。这些方法有两个参数,一个指定变量的位置(第一个变量从1开始),另一个指定变量值。例如,在上面的代码中,使用PredStatement.setDouble在预编译语句中将第一个(也是唯一的一个)变量设置为100.00。 
下面例子演示如何在循环中使用PreparedStatement
 

import java.sql.*;
import javax.sql.*;
public class PStatement {
  private static String dbUserName = "sa";
  private static String dbPassword = "dba";
  public static void main(String args[]){
    int[][] Orders = {{1001,327,2},
                      {1001,412,1},
                      {1001,906,5},
                      {1002,111,7},
                      {1002,112,19}};      
    try {
      Class.forName("com.inet.pool.PoolDriver");
      com.inet.tds.TdsDataSource tds = new com.inet.tds.TdsDataSource();
      tds.setServerName( "JUPITER" );
      tds.setDatabaseName( "MEMBERS" );
      tds.setUser( dbUserName );
      tds.setPassword( dbPassword );
      DataSource ds = tds;
      Connection con = ds.getConnection(dbUserName,dbPassword); 

      String SQLCmd ="INSERT INTO ORDERED_ITEMS (ORDER_NUMBER,ITEM_NUMBER,QTY) VALUES(?,?,?)";
      PreparedStatement pstmt = con.prepareStatement(SQLCmd); 
       for(int i=0;i<5;i++){
        pstmt.setInt(1, Orders[i][0]);
        pstmt.setInt(2, Orders[i][1]);
        pstmt.setInt(3, Orders[i][2]);
        pstmt.executeUpdate();
      }
      con.close();

    }catch(ClassNotFoundException e1){
      System.err.println(e1.getMessage());
    }catch(SQLException e2){
      System.err.println(e2.getMessage());
    }
}
}

原创粉丝点击