初学JDBC,想把一些通用的方法封装到DAO中,从网上找的视频看了一下,发现老师的代码是这样写的:
/**
* 查询一条记录,返回对应的对象
* @param clazz:实体类对应的Class对象
* @param sql:sql语句
* @param objects:对sql语句中占位符赋值的可变参数
* @return
*/
public T get(Class clazz, String sql, Object...objects){
T entity = null;
try {
//1.获取结果集对象
Connection conn = JDBCUtils.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
for (int i = 0; i < objects.length; i++) {
ps.setObject(i + 1, objects[i]);
}
ResultSet rs = ps.executeQuery();
if(rs.next()){
//2.将结果集对象转换为Map对象,键:列的别名,值:列中的数据
Map<String, Object> values = new HashMap<String, Object>();
ResultSetMetaData rsmd = rs.getMetaData();
//循环将列的别名和值赋给Map对象
for (int i = 0; i < rsmd.getColumnCount(); i++) {
String columnLabel = rsmd.getColumnLabel(i + 1);
Object columnValue = rs.getObject(i + 1);
values.put(columnLabel, columnValue);
}
//3.将Map对象中的数据赋值给实体类对象
entity = (T) clazz.newInstance();
//遍历Map对象,对实体类对象中的字段进行赋值
for (String columnLable : values.keySet()) {
BeanUtils.setProperty(entity, columnLable, values.get(columnLable));
}
}
JDBCUtils.close(conn, ps, rs);
} catch (Exception e) {
e.printStackTrace();
}
return entity;
}
想问问各位大神为什么要将列的别名和值先存到Map对象中,然后再遍历将键和值赋值给实体类的对象,我感觉有些冗余,获取到列别名和值直接赋值给实体类对象不是更好吗?是不是我代码写的少见的少不知道这样写有其他的特殊作用啊,求大神指点~