黑马程序员技术交流社区
标题:
利用结果集元数据将查询结果封装为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