黑马程序员技术交流社区

标题: 利用结果集元数据将查询结果封装为map [打印本页]

作者: 谭立文    时间: 2012-10-8 11:32
标题: 利用结果集元数据将查询结果封装为map
1.需求分析:
将查询结果封装到Map集合当中,字段名称作为key,值作为value,如有多个查询结果,即用List集合再将Map封装
2.主要涉及到的知识点:
        1.数据库的连接
        2.查询语句的写法
3.对查询结果进行遍历,以及根据ResultSet获取到字段的信息,可以按列号,也可以根据字段的名称,推荐用字段的名称,这样比较直观,程序的可读性更好。
4.根据结果集ResultSet获取到封装结果集信息,即ResultSetMetaData接口(具体的实现,各个数据库的实现可能都不太一样,这里不需关心)。
        5.了解ResultSetMetaData的几个方法: getColumnName(获取字段的名称)、getColumnLabel(获取字段的别称),其他的都大同小异,等有需求时在去查询API,不需要去死记这些方法,但若遇到有类似需求时,一定要去主动查询API。
        6.对List集合、和Map集合的迭代(这里只是为了演示封装的效果,没有再进一步用Bean来包装,只是进行了打印到控制台的操作,其实用Bean封装也比较容易,用BeanUtils可以很容易的实现)
3.以下是其实现的代码:
package com.wenfengkeji.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.wenfengkeji.jdbc.utils.JdbcUtils;
public class ResultSetToMap {
public static void main(String[] args) {
  List<Map<String, Object>> list = resultSetToMap("select password,money,id from user where id <= 3");
  /*
   13.用增强for对list和map进行迭代
  */
  for(Map<String,Object> map: list)
  {
   Set<Map.Entry<String,Object>> set = map.entrySet();
   for(Map.Entry<String, Object> entry: set)
   {
    System.out.println(entry.getKey() + ":  " + entry.getValue());
   }
   System.out.println("--------------------------");
  }
}
public static List<Map<String, Object>> resultSetToMap(String sql)
{
  /*
   1.与数据库建立连接
  */
  Connection con = JdbcUtils.getConnection();
  Statement st = null;
  ResultSet rs = null;
  ResultSetMetaData rsmtd;
  List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
  try
  {
                 /*
         2.根据连接创建该条连接上的SQL语句的封装
   */
   st = con.createStatement();
                 /*
         3.执行查询操作,并得到结果集
   */
   rs = st.executeQuery(sql);
                 /*
         4.对结果集进行迭代
          */
   while(rs.next())
   {
    /*
     5.获取当前结果集中的结果信息
    */
    rsmtd = rs.getMetaData();
     /*
     6.新建一个用来存放结果、即数据库中表中的行的数据信息
     key是字段名称,value是改行数据对应的字段值
    */
    Map<String,Object> map = new LinkedHashMap<String,Object>();
    /*
     7.按列号对结果集进行迭代
    */
    for(int i  = 1; i <= rsmtd.getColumnCount(); i++)
    {
     /*
        8.获取到字段的名称
     */
     String columnLabel = rsmtd.getColumnLabel(i);
     /*
        9.根据字段名称获取结果集中的数据信息并添加到map集合中
     */
            map.put(columnLabel, rs.getObject(columnLabel));
    }
    /*
     10.将一行数据再封装到List集合中
    */
    list.add(map);
   }
  }
  catch(SQLException e)
  {
   throw new RuntimeException(e);
  }finally
  {
   /*
       11.关闭资源
   */
   JdbcUtils.free(rs, st, con);
  }
  /*
   12.返回结果list集合
  */
  return list;
}
}


作者: 徐传任    时间: 2012-10-9 00:15
看看..........顶




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2