大可制作:QQ群:31564239(asp|jsp|php|mysql)

Java Gossip: PreparedStatement

Statement主要用于执行静态的SQL陈述,也就是在执行 executeQuery()、executeUpdate()等方法时,指定内容固定不变的SQL语句字符串,每一句SQL只适用于当时的执行,如果您有 些操作只是SQL语句当中某些参数会有所不同,其余的SQL子句皆相同,则您可以使用java.sql.PreparedStatement。

您可以使用Connection的prepareStatement()方法建立好一个预先编译(precompile)的SQL语句,当中参数会变动的部份,先指定"?"这个占位字节,例如:
PreparedStatement stmt = conn.prepareStatement(
    "INSERT INTO message VALUES(?, ?, ?, ?, ?)");
 

要将参数指定给每一个栏位,我们可以使用setInt()、setString()等等方法,例如:
stmt.setString(1, "米小狗");
stmt.setString(2, "dog@mail.com");
stmt.setString(3, "留言吧");
stmt.setString(4, "2004-5-26");
stmt.setString(5, "到此一游");
stmt.executeUpdate();
stmt.clearParameters();
 

setXXX()方法的第一个参数指定 ? 的位置,而第二个参数为要加入至数据表栏位的值,要让SQL执行生效,要执行executeQuery()或executeUpdate()方法,使用 setXXX()来设定的参数会一直有效,可以于下一次使用,如果想要清除设定好的参数,可以执行clearParameters()方法。

使用PreparedStatement也可以进行批次处理,直接来看个例子就知道如何使用:
PreparedStatement stmt = conn.prepareStatement(
    "INSERT INTO Users VALUES(?,?, ?)");
 
User[] users = ...;

for(int i=0; i<users.length; i++) {
     stmt.setInt(1, users[i].getID());
     stmt.setString(2, users[i].getName());
     stmt.setString(3, users[i].getPassword());
     stmt.addBatch( );
}
 
stmt.executeBatch();