org.springframework.jdbc.core.RowMapper<T>
接口,并且对其T mapRow(ResultSet rs, int rowNum)
方法中传递的java.sql.ResultSet
接口有一些疑问。当我检查
ResultSet
类时,我看到了一堆获取列值的方法:
╔══════════════╦═════════════════════╦══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ ║ 返回类型 ║ 方法 ║ 返回值 (javadoc, se 8) ║ ╠══════════════╬═════════════════════╬════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣ ║ String ║ getString ║ 列的值;如果该值为SQL NULL,则返回null ║ ║ boolean ║ getBoolean ║ 列的值;如果该值为SQL NULL,则返回false ║ ║ byte ║ getByte ║ 列的值;如果该值为SQL NULL,则返回0 ║ ║ short ║ getShort ║ 列的值;如果该值为SQL NULL,则返回0 ║ ║ int ║ getInt ║ 列的值;如果该值为SQL NULL,则返回0 ║ ║ long ║ getLong ║ 列的值;如果该值为SQL NULL,则返回0 ║ ║ float ║ getFloat ║ 列的值;如果该值为SQL NULL,则返回0 ║ ║ double ║ getDouble ║ 列的值;如果该值为SQL NULL,则返回0 ║ ║ BigDecimal ║ getBigDecimal ║ 列的值;如果该值为SQL NULL,则返回null ║ ║ byte[] ║ getBytes ║ 列的值;如果该值为SQL NULL,则返回null ║ ║ Date ║ getDate ║ 列的值;如果该值为SQL NULL,则返回null ║ ║ Time ║ getTime ║ 列的值;如果该值为SQL NULL,则返回null ║ ║ Timestamp ║ getTimestamp ║ 列的值;如果该值为SQL NULL,则返回null ║ ║ InputStream ║ getAsciiStream ║ 一个Java输入流,以一字节ASCII字符流形式提供数据库列值;如果该值为SQL NULL,则返回null ║ ║ Reader ║ getCharacterStream ║ 一个java.io.Reader对象,包含列的值;如果该值为SQL NULL,则在Java编程语言中返回null ║ ║ InputStream ║ getBinaryStream ║ 一个Java输入流,以未解释字节流形式提供数据库列值;如果该值为SQL NULL,则返回null ║ ║ <T> T ║ getObject ║ 类型实例,保持列值 ║ ╚══════════════╩═════════════════════╩══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
一般期望/惯例是调用:
rs.getObject("COLUMN_NAME", Boolean.class);
rs.getObject("COLUMN_NAME", Byte.class);
rs.getObject("COLUMN_NAME", Short.class);
rs.getObject("COLUMN_NAME", Integer.class);
rs.getObject("COLUMN_NAME", Long.class);
所有基本类型都是这样吗?因为其他所有东西都会针对SQL NULL
实例返回null
。
如果是这样的话,当有了类型化对象方法时,拥有所有不同类型方法的意义是什么?
此外,每种方法的优缺点是什么?
Using
getInt(String columnLabel)
:Integer resultingActionId = rs.getInt("RESULTING_ACTION_ID"); if (rs.wasNull) { resultingActionId = null }
Using
getObject(String columnLabel)
and casting toInteger
:Integer resultingActionId = (Integer) rs.getObject("RESULTING_ACTION_ID");
Using
getObject(String columnLabel, Class type)
:Integer resultingActionId = rs.getObject("RESULTING_ACTION_ID", Integer.class);
org.springframework.jdbc.core.JdbcTemplate
曾经有queryForLong
queryForInt
queryForObject
方法。谢谢!
ResultSet.getInt(String columnLabel)
中提取值并立即检查ResultSet.wasNull()
。我想知道从最佳实践/已知实践/效率/执行代码的角度来看,Integer awesomeness =(Integer)rs.getObject(“awesomeness”);
和Integer awesomeness = rs.getObject(“awesomeness”,Integer.class);
的区别是什么。 - anonymous