PreparedStatement接口
Statement接口封装了JDBC执行SQL语句的方法,虽然可以完成Java程序执行SQL语句的操作,但是在实际开发过程中往往需要将程序中的变量作为SQL语句的查询条件,而使用Statement接口操作这些SQL语句会过于繁琐,并且存在安全方面的问题。针对这一问题,JDBC API 中提供了扩展的PreparedStatement接口。
PreparedStatement是Statement的子接口,用于执行预编译的SQL语句。该接口扩展了带有参数SQL语句的执行操作,应用接口中的SQL语句可以使用占位符“?”来代替其参数,然后通过setXxx()方法为SQL语句的参数赋值。
在PreparedStatement接口中,提供了一些常用方法,具体如表1所示。
表1 PreparedStatement 接口中的常用方法
方法声明 | 功能描述 |
---|---|
int executeUpdate() | 在此PreparedStatement对象中执行 SQL 语句,该语句必须是一个DML语句或者是无返回内容的SQL 语句,如 DDL 语句 |
ResultSet executeQuery() | 在此PreparedStatement对象中执行 SQL 查询,该方法返回的是ResultSet对象 |
void setInt(int parameterIndex, int x) | 将指定参数设置为给定的int值 |
void setFloat(int parameterIndex, float x) | 将指定参数设置为给定的float值 |
void setString(int parameterIndex, String x) | 将指定参数设置为给定的String值 |
void setDate(int parameterIndex, Date x) | 将指定参数设置为给定的Date值 |
void addBatch() | 将一组参数添加到此PreparedStatement对象的批处理命令中 |
void setCharacterStream(int parameterIndex, java.io.Reader reader, int length) | 将指定的输入流写入数据库的文本字段 |
void setBinaryStream(int parameterIndex, java.io.InputStream x, int length) | 将二进制的输入流数据写入到二进制字段中 |
需要注意的是,表9-4中的setDate()方法可以设置日期内容,但参数Date的类型必须是java.sql.Date,而不是java.util.Date。
在为SQL语句中的参数赋值时,可以通过输入参数与SQL类型相匹配的setXxx()方法,例如字段的数据类型为int或Integer,那么应该使用setInt()方法,也可以通过setObject()方法设置多种类型的输入参数。具体如下所示:
// 假设users表中字段id、name、email类型分别是int、varchar、varchar
String sql = "INSERT INTO users(id,name,email) VALUES(?,?,?)";
PreparedStatement preStmt = conn.prepareStatement(sql);
preStmt.setInt(1, 1); //使用参数与SQL类型相匹配的方法
preStmt.setString(2, "zhangsan"); //使用参数与SQL类型相匹配的方法
preStmt.setObject(3, "zs@sina.com"); //使用setObject()方法设置参数
preStmt.executeUpdate();