Java如何将ResultSet结果集遍历到List中
作者:gblfy 发布时间:2022-07-01 06:30:46
标签: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;
}
来源:https://blog.csdn.net/weixin_40816738/article/details/109068872


猜你喜欢
- 1、问题起因最近做项目时遇到了需要多用户之间通信的问题,涉及到了WebSocket握手请求,以及集群中WebSocket Session共享
- jvm虚拟机栈的作用jvm虚拟机栈栈帧的组成jvm虚拟机栈,也叫java栈,它由一个个的栈帧组成,而栈帖由以下几个部分组成局部变量表-存储方
- 先来看问题纠结了几个小时终于找到了问题所在,因为shiro的realm属于Filter,简单说就是初始化realm时,spring还未加载相
- 在popupWindow里面再弹出popupWindow的时候会报这样的错误ERROR/AndroidRuntime(888): andro
- 一、前言之前介绍了JMeter engine启动原理,但是里面涉及到HashTree这个类结构没有给大家详细介绍,这边文章就详细介绍JMet
- 在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Ac
- 本文实例为大家分享了Java实现简单贪吃蛇游戏的具体代码,供大家参考,具体内容如下贪吃蛇小游戏制作方法首先需要的准备有:1、掌握Java基础
- 前言老规矩,还是从最简单粗暴的开始。那么多简单算简单?多粗暴算粗暴?我告诉你可以不写一句代码,你信吗?直接把一个文件往IIS服务器上一扔,就
- 本文实例讲述了Java使用Preference类保存上一次记录的方法。分享给大家供大家参考。具体分析如下:在使用java中JFileChoo
- let 和 var(a): let 声明的变量只在 let 命令所在的代码块内有效(b): let 是在代码块内有效,var 是在全局范围内
- 在Flutter中实现整个App变为灰色是非常简单的,只需要在最外层的控件上包裹ColorFiltered,用法如下:@overrideWi
- SpringBoot默认的页面映射路径(即模板文件存放的位置)为“classpath:/templates/*.html”。静态文件路径为“
- 一、准备工作和传统 CRUD 一样,实现对员工信息的增删改查。①搭建环境添加相关依赖web.xmlspringmvc.xml②准备实体类pu
- 在上一篇Android RecylerView入门教程中提到,RecyclerView不再负责Item视图的布局及显示,所以Recycler
- 背景产品想对多次快速点击做一下优化,想要的效果就是双击不会打开多次但是从开发角度来说,我可以用kotlin的拓展方法来调整这个,但是之前的历
- WebView是Android中一个非常实用的组件,它和Safai、Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数
- 本文实例讲述了C#使用HtmlAgilityPack抓取糗事百科内容的方法。分享给大家供大家参考。具体实现方法如下:Console.Writ
- 一:本文使用范围此文不仅仅局限于spring boot,普通的spring工程,甚至是servlet工程,都是一样的,只不过配置一些 * 的
- 1:在 Visual Studio Code 中打开扩展视图(Ctrl+Shift+X),输入关键词java、spring分别下载Java开
- Controller @RequestMapping作用@RequestMapping是一个用来处理请求地址映射的注解,可用于类或者方法上。