设置 PreparedStatement 的参数

需要使用 set*方法设置查询字符串中的占位符:

String sql = "SELECT * FROM EMP WHERE JOB = ? AND SAL > ?";

//Create statement to make your operations
PreparedStatement statement = connection.prepareStatement(sql);

statement.setString(1, "MANAGER"); // String value
statement.setInt(2, 2850);         // int value

特别案例

设置 NULL 值:

使用例如 setIntsetLong 方法无法设置空值,因为这些方法使用原始类型(intlong)而不是对象(IntegerLong),并且会导致 NullPointerException 被抛出:

void setFloat(int parameterIndex, float x) 
void setInt(int parameterIndex, int x) 
void setLong(int parameterIndex, long x)  

这些案例可以使用 setNull 来处理。

setNull(int parameterIndex, int sqlType)

它是键入的,因此必须提供第二个参数,请参阅 java.sql.Types

//setting a NULL for an integer value
statement.setNull(2, java.sql.Types.INTEGER);

设置 LOB

LOB 需要使用特殊对象。

Clob longContent = connection.createClob();
Writer longContentWriter = longContent.setCharacterStream(1); // position: beginning
longContentWriter.write("This will be the content of the CLOB");

pstmt = connection.prepareStatement("INSERT INTO CLOB_TABLE(CLOB_VALUE) VALUES (?)");
pstmt.setClob(1, longContent);

关于 set*方法的例外情况

SQLException - 如果 parameterIndex 与 SQL 语句中的参数标记不对应; 如果发生数据库访问错误或在关闭的 PreparedStatement 上调用此方法

SQLFeatureNotSupportedException - 如果 sqlType 是 ARRAYBLOBCLOBDATALINKJAVA_OBJECTNCHARNCLOBNVARCHARLONGNVARCHARREFROWIDSQLXMLSTRUCT 数据类型且 JDBC 驱动程序不支持此数据类型