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

目录
  • 如何将ResultSet结果集遍历到List中
  • 使用泛型封装结果集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;
    }

总结

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

(0)

相关推荐

  • java sql ResultSet 之getRow()用法说明

    今天学习到sql中的ResultSet,用到了获取总函数,网上百度说是使用getRow()方法,但是一值返回0. 后台调试才发现getRow()并不是获取总行数,而是返回当前指针所在函数,故在不移动指针时一直为0. 附: 1.判断ResultSet行数是否为0: ResultSet表示select语句的查询结果集.ResultSet对象具有指向其当前数据行的指针, 最初,指针被置于第一行记录之前,通过next()方法可以将指针移动到下一行记录. next()方法在ResultSet对象没有一行记

  • 详解Java如何判断ResultSet结果集是否为空

    目录 问题描述 深究问题 ResultSet 的 Type 属性 解决办法 问题描述 ResultSet 表示 select 语句的查询结果集.ResultSet 对象具有指向其当前数据行的指针, 最初,指针被置于第一行记录之前,通过 next() 方法可以将指针移动到下一行记录. next() 方法在 ResultSet 对象没有一行记录时返回 false ,因此可以在 while 循环中使用它来遍历结果集,也可以利用该方法判断结果集是否为空. 示例代码如下: //此处省略连接数据库的代码..

  • java中ResultSet遍历数据操作

    1.查找数据库中表的列名 <pre name="code" class="html">String sql = "select *from tblmetadatainfo"; ResultSet rs = MySqlHelper.executeQuery(sql, null); String str=""; try { ResultSetMetaData rsmd = rs.getMetaData(); for (

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

    目录 如何将ResultSet结果集遍历到List中 使用泛型封装结果集ResultSet遍历成List集合 总结 如何将ResultSet结果集遍历到List中 今天在使用jstl标签展示查询结果时遇到一个小问题,即如何将ResultSet对象传递给前台页面. 在默认情况中我们在使用数据库查询时 public List selectDataFromJdbc() throws SQLException, ClassNotFoundException {         Class.forName

  • Java使用PreparedStatement接口及ResultSet结果集的方法示例

    本文实例讲述了Java使用PreparedStatement接口及ResultSet结果集的方法.分享给大家供大家参考,具体如下: 说明: 1.PreparedStatement接口继承Statement,它的实例包含已编译的SQL语句,执行速度要快于Statement. 2.PreparedStatement继承了Statement的所有功能,三种方法executeUpdate.executeQuery.execute不再需要参数. 3.在JDBC应用中,一般都用PreparedStateme

  • java实现将结果集封装到List中的方法

    本文实例讲述了java实现将结果集封装到List中的方法.分享给大家供大家参考,具体如下: import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; public class TestResultSet { public stati

  • Java数据结构之并查集的实现

    目录 代码解析 代码应用 实际应用 并查集就是将原本不在一个集合里面的内容合并到一个集合中. 在实际的场景中用处不多. 除了出现在你需要同时去几个集合里面查询,避免出现查询很多次,从而放在一起查询的情况. 下面简单实现一个例子,我们来举例说明一下什么是并查集,以及究竟并查集解决了什么问题. 代码解析 package com.chaojilaji.book.andcheck; public class AndCheckSet { public static Integer getFather(in

  • Java 数据结构进阶二叉树题集下

    目录 1.对称二叉树 2.创建并遍历二叉树 3.二叉树中两节点最近公共祖先 4.二叉搜索树与双向链表 5.根据前序和中序遍历结果创建二叉树 6.二叉树创建字符串 7.非递归实现二叉树前序遍历 8.非递归实现二叉树后序遍历 1.对称二叉树 [OJ链接] 分为以下几种情况: 二叉树为空,是对称二叉树 二叉树不为空,其左子树或者右子树为空,不是对称二叉树 二叉树不为空,左右子树都为空,是对称二叉树 二叉树不为空,左右子树不为空,左右子节点值不同,不是对称二叉树 二叉树不为空,左右子树不为空,左右子节点

  • Java 数据结构进阶二叉树题集上

    目录 1.二叉树的遍历 (1)前.中.后序遍历 (2)层序遍历 2.获取树中子结点的个数 3.获取二叉树的高度 4.判断是不是完全二叉树 5.判断两个树是否相同 6.另一棵树的子树 7.判断平衡二叉树 二叉树操作的代码大多数使用递归来实现,代码会比较简洁,如果使用非递归,代码会比较的繁荣,而且不易理解.(上)中的题偏向于基础,后面(下)中的题机会比较难. 1.二叉树的遍历 (1)前.中.后序遍历 这里写到的遍历是递归遍历,代码比较简单,后续会写非递归的代码.以前序遍历为例: 如果根节点root为

  • java编程实现并查集的路径压缩代码详解

    首先看两张路径压缩的图片: 并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题.一些常见的用途有求连通子图.求最小生成树的 Kruskal 算法和求最近公共祖先(Least Common Ancestors, LCA)等. 使用并查集时,首先会存在一组不相交的动态集合 S={S 1 ,S 2 ,⋯,S k } ,一般都会使用一个整数表示集合中的一个元素. 每个集合可能包含一个或多个元素,并选出集合中的某个元素作为代表.每个集合中具体包含

  • 正确遍历删除List中的元素方法(推荐)

    遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题.下面主要看看以下几种遍历删除List中元素的形式: 1.通过增强的for循环删除符合条件的多个元素 2.通过增强的for循环删除符合条件的一个元素 3.通过普通的for删除删除符合条件的多个元素 4.通过Iterator进行遍历删除符合条件的多个元素 /** * 使用增强的for循环 * 在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException */ public

  • 详解Java读取本地文件并显示在JSP文件中

    详解Java读取本地文件并显示在JSP文件中 当我们初学IMG标签时,我们知道通过设置img标签的src属性,能够在页面中显示想要展示的图片.其中src的值,可以是磁盘目录上的绝对,也可以是项目下的相对路径,还可以是网络上的图片路径.在存取少量图片的情况下,采用相对路径存储图片的情况下最方便,也最实用.但是当图片数量过多时,这种方式就显的有些掣肘了. 当系统的图片数量过多时,如果仍把这些图片当做项目的一部分去发布,势必会大大延长项目的发布时间及更新时间.对于某些对于时限性要求特别高的系统来说,采

随机推荐