ResultSetMetaData是描述ResultSet的元数据对象,即从中可以获取到结果集中有多少列,列名是什么。
1.得到ResultSetMetaData对象,调用ResultSet的getMetaData()方法
2.ResultSetMetaData的方法:
int getColumnCount():sql语句中包含哪些列
String getColumnLabel(int column):获取指定的列的别名,其中索引从1开始。
public static <T>T select(Class<T> clazz,String sql,Object...args) {
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
T entity=null;
try {
connection=getConnection();
preparedStatement=connection.prepareStatement(sql);
for(int i=0;i<args.length;i++) {
preparedStatement.setObject(i, args[i]);
}
//1.得到ResultSet对象
resultSet=preparedStatement.executeQuery();
//2.得到ResultSetMetaData对象
ResultSetMetaData rsmd=resultSet.getMetaData();
//3.创建一个Map<String,Object>对象
if(resultSet.next()) {
Map<String,Object>map=new HashMap<>();
//4.处理结果集,利用ResultSetMetaData填充对应Map对象
for(int i=0;i<rsmd.getColumnCount();i++) {
String columnLabel=rsmd.getColumnLabel(i+1);
Object columnValue=resultSet.getObject(columnLabel);
map.put(columnLabel, columnValue);
}
//5.若Map不为空,利用反射创建clazz对应的对象
if(map.size()>0){
//利用反射创建对象
entity=clazz.newInstance();
//6.遍历Map,利用反射为clazz对象的属性赋值
for(Map.Entry<String, Object> entry:map.entrySet()) {
String fieldName=entry.getKey();
Object value=entry.getValue();
ReflectionUtils.setFieldValue(entity,fieldName, value);
}
}
}
}catch(Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
release(resultSet,preparedStatement,connection);
}
return entity;
}