qq_24394225
自由000
采纳率0%
2018-11-09 10:45

JDBC查询一条记录,为什么要将列别名和值先存到Map对象中,而不是直接给实体类对象的字段赋值呢?

初学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对象中,然后再遍历将键和值赋值给实体类的对象,我感觉有些冗余,获取到列别名和值直接赋值给实体类对象不是更好吗?是不是我代码写的少见的少不知道这样写有其他的特殊作用啊,求大神指点~
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • u014074697 张大教主 3年前
     按照上面的逻辑,将数值先存放在Map中确实是多余的,可在for循环中,直接 BeanUtils.setProperty(entity, columnLable,columnValue ));
    
    点赞 评论 复制链接分享
  • devmiao devmiao 3年前
    点赞 评论 复制链接分享

相关推荐