TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
使用基本的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[0]);
pstmt.setInt(2, Orders[1]);
pstmt.setInt(3, Orders[2]);
pstmt.executeUpdate();
}
con.close();
}catch(ClassNotFoundException e1){
System.err.println(e1.getMessage());
}catch(SQLException e2){
System.err.println(e2.getMessage());
}
}
}
function TempSave(ElementID)
{
CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value);
CommentsPersistDiv.save("CommentXMLStore");
}
function Restore(ElementID)
{
CommentsPersistDiv.load("CommentXMLStore");
document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent");
} |
|