您的位置:首页 > 数据库

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

2010-11-17 10:08 204 查看
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());
}
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: