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

作者:gblfy 时间:2022-07-01 06:30:46 

如何将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;
   }

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

来源:https://blog.csdn.net/weixin_40816738/article/details/109068872

标签:Java,ResultSet,结果集,遍历,List
0
投稿

猜你喜欢

  • 分享两种实现Winform程序的多语言支持的多种解决方案

    2023-10-17 21:24:17
  • Java C++ 算法题解拓展leetcode670最大交换示例

    2022-05-18 23:31:51
  • 基于springmvc之常用注解,操作传入参数

    2023-03-17 20:49:52
  • C#中实现Json序列化与反序列化的几种方式

    2021-11-06 01:31:07
  • Java中instanceof关键字实例讲解

    2023-08-04 07:48:31
  • Java基础之位运算知识总结

    2022-09-10 17:48:43
  • 通过Java带你了解网络IO模型

    2022-12-25 10:59:22
  • Java Socket实现多人聊天系统

    2023-08-08 04:44:35
  • Mybatis配置错误:java.lang.ExceptionInInitializerError

    2021-12-31 16:58:59
  • MyBatis学习教程(四)-如何快速解决字段名与实体类属性名不相同的冲突问题

    2023-11-25 05:43:49
  • C# winform 模拟键盘输入自动接入访问网络的实例

    2022-01-01 19:20:10
  • 详解Spring Boot Profiles 配置和使用

    2021-10-05 22:54:57
  • Java实现图形界面计算器

    2023-06-05 11:53:23
  • Java 8实现图片BASE64编解码

    2022-08-22 05:35:05
  • 简单谈谈java自定义注解

    2021-07-21 18:40:53
  • 如何在Spring Boot中使用MQTT

    2023-10-08 20:39:13
  • 解决问题:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources

    2023-11-23 23:40:39
  • java集合继承关系图分享

    2023-04-25 17:17:23
  • SpringBoot统一功能处理实现的全过程

    2021-06-12 11:14:49
  • C#构造函数在基类和父类中的执行顺序

    2021-10-24 06:58:03
  • asp之家 软件编程 m.aspxhome.com