溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java怎么將ResultSet結(jié)果集遍歷到List中

發(fā)布時間:2023-02-28 10:43:05 來源:億速云 閱讀:107 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下Java怎么將ResultSet結(jié)果集遍歷到List中的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

如何將ResultSet結(jié)果集遍歷到List中

今天在使用jstl標(biāo)簽展示查詢結(jié)果時遇到一個小問題,即如何將ResultSet對象傳遞給前臺頁面。

在默認(rèn)情況中我們在使用數(shù)據(jù)庫查詢時

public List selectDataFromJdbc() throws SQLException, ClassNotFoundException {

        Class.forName("oracle.jdbc.driver.OracleDriver"); //加載MYSQL JDBC驅(qū)動程序
        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 直接傳遞給前臺的,因?yàn)?ResultSet 不僅無法進(jìn)行循環(huán)遍歷 (即只能每行遍歷,從0至end ,執(zhí)行一次),而且在實(shí)際應(yīng)用中,它還必須被關(guān)閉。

當(dāng)關(guān)閉后,rs為null ,結(jié)果不再存在。

在這時我們就需要將 ResultSet 對象進(jìn)行遍歷到 list 中,代碼如下:

private static List convertList(ResultSet rs) throws SQLException {
        List list = new ArrayList();
        ResultSetMetaData md = rs.getMetaData();//獲取鍵名
        int columnCount = md.getColumnCount();//獲取行的數(shù)量
        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 中的,因?yàn)?list 只能存放元素的索引而不能存放元素的值,所以我們要用到 Map 。

使用這種方法的好處就是可以創(chuàng)建高復(fù)用性的代碼 ,因?yàn)槲覀儾恍枰看瓮ㄟ^指定鍵名取值。

實(shí)際工作間接,與君共勉。

代碼

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結(jié)果集遍歷到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驅(qū)動程序
        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();//獲取行的數(shù)量
        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;
    }
}

使用泛型封裝結(jié)果集ResultSet遍歷成List集合

public  <T> List<T>  findModelListBySqlAndParam(String sql,List<Object> param,T t) throws Exception{
        //定義一個集合來存放需要轉(zhuǎn)成的對象集合
        List<T> list=new ArrayList<T>();
        //獲取當(dāng)前類
        Class<?> c=t.getClass();//泛型的反射機(jī)制(?問號可寫可不寫)java.lang.reflect
        //遍歷結(jié)果集,封裝成外界用戶所需要的對象集合
        //1>獲取結(jié)果集
        ResultSet rs=executeQuery(sql, param);
        //2>開始遍歷
        while(rs.next()){
            //初始化對象
            @SuppressWarnings("unchecked")
            T obj= (T)c.newInstance();
            //獲取當(dāng)前類一共多少個屬性啊
            Field[] fields=c.getDeclaredFields();
            for(Field f:fields){
                //獲取當(dāng)前屬性的屬性名子
                String fname=f.getName();
                //獲取當(dāng)前的屬性的類型(簡稱)  java.lang.String
                String type=f.getType().getSimpleName();

                //*****************  取出來當(dāng)前屬性對應(yīng)的數(shù)據(jù)庫的值了 ****************
                //在此方法名中要求類的屬性名和數(shù)據(jù)庫的字段名相同
                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);
                }
                //*****************  將取出來當(dāng)前屬性的值設(shè)置給當(dāng)前對象obj****************
                //1>獲取當(dāng)前對象的所有set方法,并找到當(dāng)前取出來的屬性對應(yīng)的set方法
                Method[] methods=c.getDeclaredMethods();//獲取所有的方法
                for(Method m:methods){
                    //獲取當(dāng)前方法名
                    String methodName=m.getName();
                    //判斷是不是當(dāng)前屬性
                    if(methodName.equalsIgnoreCase("set"+fname)){
                        //執(zhí)行該方法
                        m.invoke(obj, value);
                    }
                }
            }
            list.add(obj);
        }
        return list;
    }

Java怎么將ResultSet結(jié)果集遍歷到List中

以上就是“Java怎么將ResultSet結(jié)果集遍歷到List中”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI