詳解如何獲取PreparedStatement參數(shù)示例詳解
序
本文主要研究一下如何獲取PreparedStatement的參數(shù)
PreparedStatement
java/sql/PreparedStatement.java
public interface PreparedStatement extends Statement {
void setNull(int parameterIndex, int sqlType) throws SQLException;
void setBoolean(int parameterIndex, boolean x) throws SQLException;
void setInt(int parameterIndex, int x) throws SQLException;
void setLong(int parameterIndex, long x) throws SQLException;
//......
default void setObject(int parameterIndex, Object x, SQLType targetSqlType,
int scaleOrLength) throws SQLException {
throw new SQLFeatureNotSupportedException("setObject not implemented");
}
default void setObject(int parameterIndex, Object x, SQLType targetSqlType)
throws SQLException {
throw new SQLFeatureNotSupportedException("setObject not implemented");
}
/**
* Retrieves the number, types and properties of this
* <code>PreparedStatement</code> object's parameters.
*
* @return a <code>ParameterMetaData</code> object that contains information
* about the number, types and properties for each
* parameter marker of this <code>PreparedStatement</code> object
* @exception SQLException if a database access error occurs or
* this method is called on a closed <code>PreparedStatement</code>
* @see ParameterMetaData
* @since 1.4
*/
ParameterMetaData getParameterMetaData() throws SQLException;
}PreparedStatement繼承了Statement接口,它主要是多定義了一系列的set方法,但是沒有定義get方法,只是定義了getParameterMetaData方法返回ParameterMetaData
ParameterMetaData
java/sql/ParameterMetaData.java
public interface ParameterMetaData extends Wrapper {
/**
* Retrieves the number of parameters in the <code>PreparedStatement</code>
* object for which this <code>ParameterMetaData</code> object contains
* information.
*
* @return the number of parameters
* @exception SQLException if a database access error occurs
* @since 1.4
*/
int getParameterCount() throws SQLException;
/**
* Retrieves whether null values are allowed in the designated parameter.
*
* @param param the first parameter is 1, the second is 2, ...
* @return the nullability status of the given parameter; one of
* <code>ParameterMetaData.parameterNoNulls</code>,
* <code>ParameterMetaData.parameterNullable</code>, or
* <code>ParameterMetaData.parameterNullableUnknown</code>
* @exception SQLException if a database access error occurs
* @since 1.4
*/
int isNullable(int param) throws SQLException;
/**
* The constant indicating that a
* parameter will not allow <code>NULL</code> values.
*/
int parameterNoNulls = 0;
/**
* The constant indicating that a
* parameter will allow <code>NULL</code> values.
*/
int parameterNullable = 1;
/**
* The constant indicating that the
* nullability of a parameter is unknown.
*/
int parameterNullableUnknown = 2;
/**
* Retrieves whether values for the designated parameter can be signed numbers.
*
* @param param the first parameter is 1, the second is 2, ...
* @return <code>true</code> if so; <code>false</code> otherwise
* @exception SQLException if a database access error occurs
* @since 1.4
*/
boolean isSigned(int param) throws SQLException;
/**
* Retrieves the designated parameter's specified column size.
*
* <P>The returned value represents the maximum column size for the given parameter.
* For numeric data, this is the maximum precision. For character data, this is the length in characters.
* For datetime datatypes, this is the length in characters of the String representation (assuming the
* maximum allowed precision of the fractional seconds component). For binary data, this is the length in bytes. For the ROWID datatype,
* this is the length in bytes. 0 is returned for data types where the
* column size is not applicable.
*
* @param param the first parameter is 1, the second is 2, ...
* @return precision
* @exception SQLException if a database access error occurs
* @since 1.4
*/
int getPrecision(int param) throws SQLException;
/**
* Retrieves the designated parameter's number of digits to right of the decimal point.
* 0 is returned for data types where the scale is not applicable.
*
* @param param the first parameter is 1, the second is 2, ...
* @return scale
* @exception SQLException if a database access error occurs
* @since 1.4
*/
int getScale(int param) throws SQLException;
/**
* Retrieves the designated parameter's SQL type.
*
* @param param the first parameter is 1, the second is 2, ...
* @return SQL type from <code>java.sql.Types</code>
* @exception SQLException if a database access error occurs
* @since 1.4
* @see Types
*/
int getParameterType(int param) throws SQLException;
/**
* Retrieves the designated parameter's database-specific type name.
*
* @param param the first parameter is 1, the second is 2, ...
* @return type the name used by the database. If the parameter type is
* a user-defined type, then a fully-qualified type name is returned.
* @exception SQLException if a database access error occurs
* @since 1.4
*/
String getParameterTypeName(int param) throws SQLException;
/**
* Retrieves the fully-qualified name of the Java class whose instances
* should be passed to the method <code>PreparedStatement.setObject</code>.
*
* @param param the first parameter is 1, the second is 2, ...
* @return the fully-qualified name of the class in the Java programming
* language that would be used by the method
* <code>PreparedStatement.setObject</code> to set the value
* in the specified parameter. This is the class name used
* for custom mapping.
* @exception SQLException if a database access error occurs
* @since 1.4
*/
String getParameterClassName(int param) throws SQLException;
/**
* The constant indicating that the mode of the parameter is unknown.
*/
int parameterModeUnknown = 0;
/**
* The constant indicating that the parameter's mode is IN.
*/
int parameterModeIn = 1;
/**
* The constant indicating that the parameter's mode is INOUT.
*/
int parameterModeInOut = 2;
/**
* The constant indicating that the parameter's mode is OUT.
*/
int parameterModeOut = 4;
/**
* Retrieves the designated parameter's mode.
*
* @param param the first parameter is 1, the second is 2, ...
* @return mode of the parameter; one of
* <code>ParameterMetaData.parameterModeIn</code>,
* <code>ParameterMetaData.parameterModeOut</code>, or
* <code>ParameterMetaData.parameterModeInOut</code>
* <code>ParameterMetaData.parameterModeUnknown</code>.
* @exception SQLException if a database access error occurs
* @since 1.4
*/
int getParameterMode(int param) throws SQLException;
}ParameterMetaDatat提供了getParameterCount、getParameterType、getParameterTypeName、getParameterClassName、getParameterMode
com.mysql.jdbc.PreparedStatement
com/mysql/jdbc/PreparedStatement.java
public class PreparedStatement extends com.mysql.jdbc.StatementImpl implements
java.sql.PreparedStatement {
//......
protected int parameterCount;
protected MysqlParameterMetadata parameterMetaData;
private InputStream[] parameterStreams = null;
private byte[][] parameterValues = null;
/**
* Only used by statement interceptors at the moment to
* provide introspection of bound values
*/
protected int[] parameterTypes = null;
public ParameterBindings getParameterBindings() throws SQLException {
synchronized (checkClosed()) {
return new EmulatedPreparedStatementBindings();
}
}
//......
}mysql的PreparedStatement實(shí)現(xiàn)定義了parameterCount、parameterMetaData、parameterStreams、parameterValues、parameterTypes屬性,提供了getParameterBindings方法,返回的是EmulatedPreparedStatementBindings
ParameterBindings
com/mysql/jdbc/ParameterBindings.java
public interface ParameterBindings {
public abstract Array getArray(int parameterIndex) throws SQLException;
public abstract InputStream getAsciiStream(int parameterIndex) throws SQLException;
public abstract BigDecimal getBigDecimal(int parameterIndex) throws SQLException;
public abstract InputStream getBinaryStream(int parameterIndex) throws SQLException;
public abstract java.sql.Blob getBlob(int parameterIndex) throws SQLException;
public abstract boolean getBoolean(int parameterIndex) throws SQLException;
public abstract byte getByte(int parameterIndex) throws SQLException;
public abstract byte[] getBytes(int parameterIndex) throws SQLException;
public abstract Reader getCharacterStream(int parameterIndex) throws SQLException;
public abstract Clob getClob(int parameterIndex) throws SQLException;
public abstract Date getDate(int parameterIndex) throws SQLException;
public abstract double getDouble(int parameterIndex) throws SQLException;
public abstract float getFloat(int parameterIndex) throws SQLException;
public abstract int getInt(int parameterIndex) throws SQLException;
public abstract long getLong(int parameterIndex) throws SQLException;
public abstract Reader getNCharacterStream(int parameterIndex) throws SQLException;
public abstract Reader getNClob(int parameterIndex) throws SQLException;
public abstract Object getObject(int parameterIndex) throws SQLException;
public abstract Ref getRef(int parameterIndex) throws SQLException;
public abstract short getShort(int parameterIndex) throws SQLException;
public abstract String getString(int parameterIndex) throws SQLException;
public abstract Time getTime(int parameterIndex) throws SQLException;
public abstract Timestamp getTimestamp(int parameterIndex) throws SQLException;
public abstract URL getURL(int parameterIndex) throws SQLException;
public abstract boolean isNull(int parameterIndex) throws SQLException;
}ParameterBindings定義了一系列的get方法
EmulatedPreparedStatementBindings
class EmulatedPreparedStatementBindings implements ParameterBindings {
private ResultSetImpl bindingsAsRs;
private boolean[] parameterIsNull;
EmulatedPreparedStatementBindings() throws SQLException {
List<ResultSetRow> rows = new ArrayList<ResultSetRow>();
parameterIsNull = new boolean[parameterCount];
System
.arraycopy(isNull, 0, this.parameterIsNull, 0,
parameterCount);
byte[][] rowData = new byte[parameterCount][];
Field[] typeMetadata = new Field[parameterCount];
for (int i = 0; i < parameterCount; i++) {
if (batchCommandIndex == -1)
rowData[i] = getBytesRepresentation(i);
else
rowData[i] = getBytesRepresentationForBatch(i, batchCommandIndex);
int charsetIndex = 0;
if (parameterTypes[i] == Types.BINARY
|| parameterTypes[i] == Types.BLOB) {
charsetIndex = 63;
} else {
try {
String mysqlEncodingName = CharsetMapping
.getMysqlEncodingForJavaEncoding(connection
.getEncoding(), connection);
charsetIndex = CharsetMapping
.getCharsetIndexForMysqlEncodingName(mysqlEncodingName);
} catch (SQLException ex) {
throw ex;
} catch (RuntimeException ex) {
SQLException sqlEx = SQLError.createSQLException(ex.toString(), SQLError.SQL_STATE_ILLEGAL_ARGUMENT, null);
sqlEx.initCause(ex);
throw sqlEx;
}
}
Field parameterMetadata = new Field(null, "parameter_"
+ (i + 1), charsetIndex, parameterTypes[i],
rowData[i].length);
parameterMetadata.setConnection(connection);
typeMetadata[i] = parameterMetadata;
}
rows.add(new ByteArrayRow(rowData, getExceptionInterceptor()));
this.bindingsAsRs = new ResultSetImpl(connection.getCatalog(),
typeMetadata, new RowDataStatic(rows), connection, null);
this.bindingsAsRs.next();
}
//......
}EmulatedPreparedStatementBindings實(shí)現(xiàn)了ParameterBindings接口,它主要是把參數(shù)組裝到rowData,然后創(chuàng)建了RowDataStatic,構(gòu)造ResultSetImpl這個對象來實(shí)現(xiàn)
小結(jié)
jdbc的PreparedStatement并未提供相應(yīng)的get參數(shù)的方法,只能從driver的實(shí)現(xiàn)類去找,比如mysql的PreparedStatement實(shí)現(xiàn)提供了getParameterBindings方法,返回的是EmulatedPreparedStatementBindings,可以獲取參數(shù)
以上就是詳解如何獲取PreparedStatement參數(shù)示例詳解的詳細(xì)內(nèi)容,更多關(guān)于PreparedStatement參數(shù)獲取的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
VSCode高效配置Maven開發(fā)Java項目全過程
之前一直使用VSCode開發(fā)C、Go兩種語言,現(xiàn)在需要對java進(jìn)行學(xué)習(xí),這篇文章主要介紹了VSCode高效配置Maven開發(fā)Java項目的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-08-08
將springboot項目生成可依賴的jar并引入到項目中的方法
SpringBoot項目默認(rèn)打包的是可運(yùn)行jar包,也可以打包成不可運(yùn)行的jar包,本文給大家介紹將springboot項目生成可依賴的jar并引入到項目中的方法,感興趣的朋友一起看看吧2023-11-11
SpringMVC域?qū)ο蠊蚕頂?shù)據(jù)示例詳解
這篇文章主要為大家介紹了SpringMVC域?qū)ο蠊蚕頂?shù)據(jù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Java數(shù)據(jù)結(jié)構(gòu)之最小堆和最大堆的原理及實(shí)現(xiàn)詳解
在計算機(jī)科學(xué)中,堆(heap)?的實(shí)現(xiàn)是一種基于樹的特殊的數(shù)據(jù)結(jié)構(gòu),它可以在數(shù)組上構(gòu)建出樹的結(jié)構(gòu)體,并滿足堆的屬性。本文就來和大家詳細(xì)聊聊Java數(shù)據(jù)結(jié)構(gòu)中的堆,感興趣的可以了解一下2022-09-09
form表單數(shù)據(jù)通過@RequestBody解析成java實(shí)體類的實(shí)現(xiàn)過程
解決@RequestBody請求無法接收前端數(shù)據(jù)問題:前端通過axios提交數(shù)據(jù),后端使用fastJSON解析時出現(xiàn)NULL,通過在實(shí)體類上添加@JSONField注解指定屬性對應(yīng)關(guān)系,可以成功接收數(shù)據(jù)2025-12-12
java 實(shí)現(xiàn)圖片像素質(zhì)量壓縮與圖片長寬縮放
這篇文章主要介紹了java 實(shí)現(xiàn)圖片像素質(zhì)量壓縮與圖片長寬縮放,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
淺談Redis在微服務(wù)架構(gòu)中的幾種應(yīng)用場景
本文介紹在SpringCloud中使用Redis作為Pub/Sub異步通信、緩存或主數(shù)據(jù)庫和配置服務(wù)器的三種場景應(yīng)用。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05

