ITEEDU

Java Gossip: PreparedStatement

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

您可以使用Connection的preparedStatement()方法建立好一个预先编译(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();