Java如何将ResultSet结果集遍历到List中

 更新时间:2023年02月28日 09:40:51   作者:gblfy  
这篇文章主要介绍了Java如何将ResultSet结果集遍历到List中问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

如何将ResultSet结果集遍历到List中

今天在使用jstl标签展示查询结果时遇到一个小问题,即如何将ResultSet对象传递给前台页面。

在默认情况中我们在使用数据库查询时

public List selectDataFromJdbc() throws SQLException, ClassNotFoundException {

        Class.forName("oracle.jdbc.driver.OracleDriver"); //加载MYSQL JDBC驱动程序
        String url = "jdbc:oracle:thin:@192.168.x.222:1521:orcl";
        Connection conn = DriverManager.getConnection(url, "username", "passwd");
        Statement stat = conn.createStatement();
        String sql = "select u.user_id ,u.account,u.name from " + "sys_user u";
         // 格式: String sql = "select * from " + TableName where 1=1;
        ResultSet rs = stat.executeQuery(sql);
        List list = convertList(rs);
        stat.close();
        conn.close();
        return list;
    }

在正常情况下,我们是不能直接将 ResultSet 记录集 rs 直接传递给前台的,因为 ResultSet 不仅无法进行循环遍历 (即只能每行遍历,从0至end ,执行一次),而且在实际应用中,它还必须被关闭。

当关闭后,rs为null ,结果不再存在。

在这时我们就需要将 ResultSet 对象进行遍历到 list 中,代码如下:

private static List convertList(ResultSet rs) throws SQLException {
        List list = new ArrayList();
        ResultSetMetaData md = rs.getMetaData();//获取键名
        int columnCount = md.getColumnCount();//获取行的数量
        while (rs.next()) {
            Map rowData = new HashMap();//声明Map
            for (int i = 1; i <= columnCount; i++) {
                rowData.put(md.getColumnName(i), rs.getObject(i));//获取键名及值
            }
            list.add(rowData);
        }
        return list;
    }

查看以上代码,可以看出我们使用 Map 与 MetaDate 使 ResultSet 储存到 list 中的,因为 list 只能存放元素的索引而不能存放元素的值,所以我们要用到 Map 。

使用这种方法的好处就是可以创建高复用性的代码 ,因为我们不需要每次通过指定键名取值。

实际工作间接,与君共勉。

代码

package com.example.demo.test;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *JAVA将ResultSet结果集遍历到List中
 * @author gblfy
 * @date 2020-10-14
 */
public class getColumnName {

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        getColumnName getColumnName = new getColumnName();
        List list = getColumnName.selectDataFromJdbc();
        for (Object o : list) {
            System.out.println("ddd:" + o);
        }

    }

    public List selectDataFromJdbc() throws SQLException, ClassNotFoundException {

        Class.forName("oracle.jdbc.driver.OracleDriver"); //加载MYSQL JDBC驱动程序
        String url = "jdbc:oracle:thin:@10.5.6.222:1521:lisdb";
        Connection conn = DriverManager.getConnection(url, "fisknow", "fisknow");
        Statement stat = conn.createStatement();
        String sql = "select u.user_id ,u.account,u.name from " + "sys_user u";
        // 格式: String sql = "select * from " + TableName where 1=1;
        ResultSet rs = stat.executeQuery(sql);
        List list = convertList(rs);
        stat.close();
        conn.close();
        return list;
    }

    private static List convertList(ResultSet rs) throws SQLException {
        List list = new ArrayList();
        ResultSetMetaData md = rs.getMetaData();//获取键名
        int columnCount = md.getColumnCount();//获取行的数量
        while (rs.next()) {
            Map rowData = new HashMap();//声明Map
            for (int i = 1; i <= columnCount; i++) {
                rowData.put(md.getColumnName(i), rs.getObject(i));//获取键名及值
            }
            list.add(rowData);
        }
        return list;
    }
}

使用泛型封装结果集ResultSet遍历成List集合

public  <T> List<T>  findModelListBySqlAndParam(String sql,List<Object> param,T t) throws Exception{
        //定义一个集合来存放需要转成的对象集合
        List<T> list=new ArrayList<T>();
        //获取当前类
        Class<?> c=t.getClass();//泛型的反射机制(?问号可写可不写)java.lang.reflect
        //遍历结果集,封装成外界用户所需要的对象集合
        //1>获取结果集
        ResultSet rs=executeQuery(sql, param);
        //2>开始遍历
        while(rs.next()){
            //初始化对象
            @SuppressWarnings("unchecked")
            T obj= (T)c.newInstance();
            //获取当前类一共多少个属性啊
            Field[] fields=c.getDeclaredFields();
            for(Field f:fields){
                //获取当前属性的属性名子
                String fname=f.getName();
                //获取当前的属性的类型(简称)  java.lang.String
                String type=f.getType().getSimpleName();

                //*****************  取出来当前属性对应的数据库的值了 ****************
                //在此方法名中要求类的属性名和数据库的字段名相同
                Object value=null;
                if(type.equalsIgnoreCase("string")){
                    value=rs.getString(fname);
                }else if(type.equalsIgnoreCase("int")){
                    value=rs.getInt(fname);
                }else if(type.equalsIgnoreCase("Integer")){
                    value=rs.getInt(fname);
                }else if(type.equalsIgnoreCase("Double")){
                    value=rs.getDouble(fname);
                }else if(type.equalsIgnoreCase("Float")){
                    value=rs.getFloat(fname);
                }else if(type.equalsIgnoreCase("date")){
                    value=rs.getDate(fname);
                }else if(type.equalsIgnoreCase("long")){
                    value=rs.getLong(fname);
                }
                //*****************  将取出来当前属性的值设置给当前对象obj****************
                //1>获取当前对象的所有set方法,并找到当前取出来的属性对应的set方法
                Method[] methods=c.getDeclaredMethods();//获取所有的方法
                for(Method m:methods){
                    //获取当前方法名
                    String methodName=m.getName();
                    //判断是不是当前属性
                    if(methodName.equalsIgnoreCase("set"+fname)){
                        //执行该方法
                        m.invoke(obj, value);
                    }
                }
            }
            list.add(obj);
        }
        return list;
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring bean生命周期配置过程解析

    Spring bean生命周期配置过程解析

    这篇文章主要介绍了Spring bean生命周期配置过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • java File类重要方法以及如何操作文件详解

    java File类重要方法以及如何操作文件详解

    这篇文章主要为大家介绍了java File类重要方法以及如何操作文件详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Spring boot测试找不到SpringRunner.class的问题

    Spring boot测试找不到SpringRunner.class的问题

    这篇文章主要介绍了Spring boot测试找不到SpringRunner.class的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 详解Java集合类之List篇

    详解Java集合类之List篇

    这篇文章主要为大家详细介绍一下Java集合类中List的用法,文中的示例代码讲解详细,对我们学习Java有一定帮助,感兴趣的可以了解一下
    2022-07-07
  • SpringBoot集成FastDFS实现防盗链功能

    SpringBoot集成FastDFS实现防盗链功能

    FastDFS是一个高性能的分布式⽂件系统,本文将为大家详细介绍一下SpringBoot如何集成FastDFS实现防盗链功能,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-04-04
  • Java中ArrayList和SubList的坑面试题

    Java中ArrayList和SubList的坑面试题

    集合是Java开发日常开发中经常会使用到的,下面这篇文章主要给大家介绍了关于Java中ArrayList和SubList的坑面试题,需要的朋友可以参考下
    2022-05-05
  • Java中LocalCache本地缓存实现代码

    Java中LocalCache本地缓存实现代码

    本篇文章主要介绍了Java中LocalCache本地缓存实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Intellij IDEA 的maven项目通过Java代码实现Jetty的Http服务器(推荐)

    Intellij IDEA 的maven项目通过Java代码实现Jetty的Http服务器(推荐)

    Jetty是一个轻量级的高度可扩展的基于 java的web服务器和servlet引擎,这篇文章主要介绍了Intellij IDEA 的maven项目通过Java代码实现 Jetty 的 Http服务器从而获取到 Http 的 Get 和 Post 请求,需要的朋友可以参考下
    2022-07-07
  • Java Swing中的JButton、JComboBox、JList和JColorChooser组件使用案例

    Java Swing中的JButton、JComboBox、JList和JColorChooser组件使用案例

    这篇文章主要介绍了Java Swing中的按钮(JButton)、组合框(JComboBox)、下拉列表(JList)和颜色选择器(JColorChooser)组件使用案例,需要的朋友可以参考下
    2014-10-10
  • Java使用Apache POI操作Excel详解

    Java使用Apache POI操作Excel详解

    在Java中操作Excel是日常工作中经常遇到的问题,而Apache Poi是一种流行且广泛使用的方式,它提供了各种库和工具,所以本文就来详细如何使用Apache Poi来进行Excel文件操作吧
    2023-06-06

最新评论