Java工具类 通过ResultSet对象返回对应的实体List集合

自从学了JDBC用多了像一下这种代码:

ResultSet rs = this.executeQuery(sql, objs);
List<xxx> list = new Array<xxx>();
if(rs.next()){
xxx x = new xxx();
x.setxxx(rs.getString("xxx"));
x.setsss(rs.getString("sss"));
list.add(x);
}

这类相似的代码每天都在用,每天都在copy,相信大家早就已经烦了

今天!Today!Java程序员的福利来了

最近生病在家闲着无聊写了一个工具类:

  通过传入一个

  ResultSet对象和相应的实体类对象。可返回相应的List集合

  终于不用Ctrl+c  Ctrl+v了!!!!

用到技术:

  Java反射机制

  泛型类

实现思路:

  首先既然是工具类当然要做到 高可用,不然也没什么意义

  既然是通过一个ResultSet对象来返回一个实体集合,是个人都可以想到这个实体类一定是个不确定因素。

  ok , 想到 的是泛型类,定义一个虚拟类型T , 传参进来确切类型后然后通过反射来获得这个类的一系列信息

  然后进入赋值+list.add()操作

我给这个工具类起名叫:DBRsHelp  (发现自己命名水准越来越高了  小小自恋一下下())

废话不多说,上栗子(命名不规范,勿喷):

package cn.news.util;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import cn.news.dao.BaseDAO;
import cn.news.entity.Users;

/**
 * 
 * @author: 房上的猫
 * 
 * @time: 下午3:49:32
 * 
 * @博客地址: https://www.cnblogs.com/lsy131479/
 *
 */

//泛型类,T:虚拟类型
public class DBRsHelp<T> {
    public List<T> util(T t, ResultSet rs) throws Exception {
        // 创建一个对应的空的泛型集合
        List<T> list = new ArrayList<T>();

        // 反射出类类型(方便后续做操作)
        Class c = t.getClass();
        // 获得该类所有自己声明的字段,不问访问权限.所有。所有。所有
        Field[] fs = c.getDeclaredFields();
        // 大家熟悉的操作,不用多说
        if (rs != null) {
            while (rs.next()) {
                // 创建实例
                t = (T) c.newInstance();
                // 赋值
                for (int i = 0; i < fs.length; i++) {
                    /*
                     * fs[i].getName():获得字段名
                     * 
                     * f:获得的字段信息
                     */
                    Field f = t.getClass().getDeclaredField(fs[i].getName());
                    // 参数true 可跨越访问权限进行操作
                    f.setAccessible(true);
                    /*
                     * f.getType().getName():获得字段类型的名字
                     */
                    // 判断其类型进行赋值操作
                    if (f.getType().getName().equals(String.class.getName())) {
                        f.set(t, rs.getString(fs[i].getName()));
                    } else if (f.getType().getName().equals(int.class.getName())) {
                        f.set(t, rs.getInt(fs[i].getName()));
                    }
                }

                list.add(t);
            }
        }
        // 返回结果
        return list;
    }
  


  //测试一下下
    public static void main(String[] args) throws Exception {
        DBRsHelp<Users> util = new DBRsHelp<Users>();
        Users u = new Users();
        String sql = "select * from news_users";
        BaseDAO dao = new BaseDAO();
        dao.rs = dao.executeQuery(sql);
        List<Users> util1 = util.util(u, dao.rs);
        for (Users users : util1) {
            System.out.println("uname:" + users.getUname());
            System.out.println("upwd:" + users.getUpwd());
            System.out.println("ustart:" + users.getUstate());
            System.out.println("usessionid:" + users.getUsessionid());
            System.out.println("================================================");
        }
    }
}

成功!!!哈哈哈

写这个工具类还弄出一个笑话,跟大家分享一下:

因为生病的原因一开始写的时候 t.getClass(); 硬生生写成了 toString().getClass()

运行后控制台一直包这个错:

心里一直想着:是啊老子是没这个字段啊,而且实体类也没啊,,,纠结了一天没出结果,晚上睡了一觉,第二天早上起来拿出来代码一看

卧槽,我他妈真煞笔。。。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博客

编写高质量代码改善C#程序的157个建议[4-9]

  本文首先亦同步到http://www.cnblogs.com/aehyok/p/3624579.html。本文主要来学习记录一下内容:

14650
来自专栏LeoXu的博客

Flex笔记_格式化数据 原

注意:上述代码没有输出结果是因为Flex内部会把XML转换成一组高级对象,既不是Date也不是String,而format函数只接受这两种对象作为参数,因此代码...

8820
来自专栏用户1191492的专栏

物联网平台设计文档:精简GC(垃圾回收)

许多高级编程语言的自动内存管理功能让编程变成了比较容易的一件事。然而,嵌入式平台经常缺少这一部分功能,这是有原因的:现代垃圾收集(GC)系统使用的...

30050
来自专栏walterlv - 吕毅的博客

.NET Core/Framework 创建委托以大幅度提高反射调用的性能

发布于 2018-02-07 09:45 更新于 2018-02...

9710
来自专栏吾爱乐享

java之学习date类的综合案例-算一下你来到这个世界多少天

14040
来自专栏Spark学习技巧

Flink DataStream编程指南

Flink程序是执行分布式集合转换(例如,filtering, mapping, updating state, joining, grouping, defi...

2.1K70
来自专栏ImportSource

是时候忘掉finalize方法了

故事要从jdk11 early access版说起。 近日,发现jdk11发布了一个早鸟版。心想,jdk10刚刚发布没多久(JDK10要来了:下一代 Java...

44780
来自专栏郭霖

Android最佳性能实践(三)——高性能编码优化

在前两篇文章当中,我们主要学习了Android内存方面的相关知识,包括如何合理地使用内存,以及当发生内存泄露时如何定位出问题的原因。那么关于内存的知识就讨论到这...

214100
来自专栏python学习之旅

算法学习笔记(一):插入排序和线性查找

11730
来自专栏生信宝典

Python学习 - 可视化变量赋值、循环、程序运行过程

Python Tutor (http://www.pythontutor.com/)是`Philip Guo`开发的,通过把计算机运行程序代码的过程可视化的展示...

25280

扫码关注云+社区

领取腾讯云代金券