一、需求
需求:询所有用户数据,并且封装到一个List
解释:
查询的数据一定有很多行
数据库 -> resultSet -> ResultSet用起来不方便,需要转为java中的数据结构 -> 一行放到一个 map(key=列名,value=列的内容) -> 如果有多个Map,就可以放到 List<Map> list
实现思路:
遍历行数据,一行对应一个map?获取一行的列名和对应的属性,装配即可!
将map装到一个集合就可以了!
难点:
如何获取列的名称?
二、笨方法
//6.发送sql
ResultSet resultSet = preparedStatement.executeQuery();
//7.处理返回结果
List<Map> list = new ArrayList<>();
while(resultSet.next()) {
Map map = new HashMap();
//一行数据对应一个map
//纯手动写值,不推荐!
map.put("id", resultSet.getInt("id"));
map.put("name", resultSet.getString(2));
list.add(map);
list.add(map);
}
System.out.println(list);
二、代码实现
@Test
public void testSelect() throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql:///itcast?user=root&password=123456");
//3.编写sql语句
String sql = "select id, salary from Employee;";
//4.创建preparedStatement对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//5.给占位符赋值
//6.发送sql
ResultSet resultSet = preparedStatement.executeQuery();
//7.处理返回结果
List<Map> list = new ArrayList<>();
//获取列的信息对象
//TODO:metaData 装的当前 结果集 列的信息对象!(他可以获取列的名称 根据下角标,可以获取列的数量)
ResultSetMetaData metaData = resultSet.getMetaData();
//有了它以后,我们可以水平遍历列!
int columnCount = metaData.getColumnCount();
while(resultSet.next()) {
Map map = new HashMap();
//智能一点:自动遍历列,注意,要从1开始,并且小于等于总列数!
for (int i = 1; i <= columnCount; i++) {
// 获取指定列下角标的值都是通过resultSet对象,并且列名我也不知道是什么类型的,因此统一用Object接收
Object value = resultSet.getObject(i);
/**
* 获取指定列下角标的列的名称!如果要获取列中下角标的名称,都要使用ResultSetMetaData对象
* 选的时候会碰到 getColumnLabel 和 getColumnName:但一定要选择 getColumnLabel
* 因为:getColumnLabel:会获取别名,如果没有写别名才是列的名称,而getColumnName:只会获取列的名称!
*/
String columnLabel = metaData.getColumnLabel(i);
map.put(columnLabel, value);
}
list.add(map);
}
System.out.println(list);
//8.关闭资源
connection.close();
preparedStatement.close();
}