import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.LinkedHashMap;
import java.util.Map;
import com.huawei.widget.commons.dao.RowMapper;
import com.huawei.widget.commons.dao.util.JdbcUtils;
/**
* 将每行映射为MAP对象的RowMapper实现。
*
* @author g00106664
* @version C02 2009-4-27
* @since OpenEye WIDGET_SRV V100R001C02
*/
@SuppressWarnings("unchecked")
public class ColumnMapRowMapper implements RowMapper<Map>
{
/**
* 此方法用于将每行数据映射为实体类。
*
* @param rs
* ResultSet
* @param rowNum
* the row num
* @return the t
* @throws java.sql.SQLException
* the SQL exception
* @see com.huawei.widget.db.RowMapper#mapRow(ResultSet, int)
*/
public Map mapRow(ResultSet rs, int rowNum) throws SQLException
{
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
Map mapOfColValues = createColumnMap(columnCount);
for (int i = 1; i <= columnCount; i++)
{
String key = getColumnKey(rsmd.getColumnName(i));
Object obj = getColumnValue(rs, i);
mapOfColValues.put(key.toLowerCase(), obj);
}
return mapOfColValues;
}
/**
* Create a Map instance to be used as column map.
* <p>
* By default, a linked case-insensitive Map will be created if possible,
* else a plain HashMap (see Spring's CollectionFactory).
*
* @param columnCount
* the column count, to be used as initial capacity for the Map
* @return the new Map instance
* @see org.springframework.core.CollectionFactory#createLinkedCaseInsensitiveMapIfPossible
*/
protected Map createColumnMap(int columnCount)
{
return new LinkedHashMap(columnCount);
}
/**
* Determine the key to use for the given column in the column Map.
*
* @param columnName
* the column name as returned by the ResultSet
* @return the column key to use
* @see java.sql.ResultSetMetaData#getColumnName
*/
protected String getColumnKey(String columnName)
{
return columnName;
}
/**
* Retrieve a JDBC object value for the specified column.
* <p>
* The default implementation uses the <code>getObject</code> method.
* Additionally, this implementation includes a "hack" to get around Oracle
* returning a non standard object for their TIMESTAMP datatype.
*
* @param rs
* is the ResultSet holding the data
* @param index
* is the column index
* @return the Object returned
* @throws java.sql.SQLException
* 如有异常,抛出。
* @see org.springframework.jdbc.support.JdbcUtils#getResultSetValue
*/
protected Object getColumnValue(ResultSet rs, int index)
throws SQLException
{
return JdbcUtils.getResultSetValue(rs, index);
}
}