Hello,大家好,上篇文章我们说了下反射的基本情况和简单使用,那么本篇文章我们就使用反射写一个工具类。用来将数据库查询结果的ResultSet转换为指定类型的对象。
使用反射来实现ResultSet内容的转换:

//将查询结果的第一条数据转换为指定类型的对象
    public static <T> T parseResultSet(ResultSet rs,Class<T> cls) {
        try {
            //只会将查询的第一天数据转换为对象
            if(rs.next()){
                //实例化对象
                T obj=cls.newInstance();
                //获取类中所有的属性
                Field[] arrf=cls.getDeclaredFields();
                //遍历属性
                for(Field f:arrf){
                    //设置忽略访问校验
                    f.setAccessible(true);
                    //为属性设置内容
                    f.set(obj, rs.getObject(f.getName()));
                }
                return obj;
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25

这是通过反射和泛型来将ResultSet中的第一条数据转换为对象
我们还可以将查询结果的全部内容转换为集合对象
代码如下:

//将查询结果所有数据转换为指定类型的对象
    public static <T> List<T> parseResultSetAll(ResultSet rs,Class<T> cls) {
        try {
            List<T> list=new ArrayList<>();
            //将查询的所有数据转换为对象添加到集合
            while(rs.next()){
                //实例化对象
                T obj=cls.newInstance();
                //获取类中所有的属性
                Field[] arrf=cls.getDeclaredFields();
                //遍历属性
                for(Field f:arrf){
                    //设置忽略访问校验
                    f.setAccessible(true);
                    //为属性设置内容
                    f.set(obj, rs.getObject(f.getName()));
                }
                list.add(obj);//添加到集合
            }
            return list;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26

上述的方法只能用来解决类中的属性名称和数据库表中的字段名称完全一样的情况,可是实际开发中会不会遇到类中属性名称和数据库字段名称不一致的情况呢?那么又该如何解决呢?
我们可以通过注解来解决这一问题,不清楚注解的同学可以自行去学习下。
下面我们先定义一个自定义注解,用来标记不一样的名称

/**
* 作者:老邢
* 时间:2017年5月24日
* 版本:v1.0
* 说明:自定义注解,主要解决不一致的名称
*/
@Target(ElementType.FIELD)//标记注解的使用范围
@Retention(RetentionPolicy.RUNTIME)//标记主键的有效期
public @interface FieldName {
    public String value();//记录数据库表重的字段名称
}

1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

在实际中类中不一样的属性上面使用我们自定义的注解就可以了,我们还需将解析方法再进行改变,代码如下:

//将查询结果所有数据转换为指定类型的对象
    public static <T> List<T> parseRSAll(ResultSet rs,Class<T> cls) {
        try {
            List<T> list=new ArrayList<>();
            //将查询的所有数据转换为对象添加到集合
            while(rs.next()){
                //实例化对象
                T obj=cls.newInstance();
                //获取类中所有的属性
                Field[] arrf=cls.getDeclaredFields();
                //遍历属性
                for(Field f:arrf){
                    //记录属性名称
                    String name=f.getName();
                    //获取当前属性上面的注解对象
                    FieldName fn=f.getAnnotation(FieldName.class);
                    if(fn!=null){
                        name=fn.value();//获取注解的内容
                    }
                    //设置忽略访问校验
                    f.setAccessible(true);
                    //为属性设置内容
                    f.set(obj, rs.getObject(name));
                }
                list.add(obj);//添加到集合
            }
            return list;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33

其实就是从ResultSet中获取内容的时候,不再单一的通过属性名称获取了,而是先使用注解的名称来获取,以此来达到名称不一致的情况。
我们还可以通过反射实现对象的保存等。
如对此有任何的疑问,都可以进行评论留言。
源码下载地址:http://download.csdn.net/detail/u014332200/9851115
---------------------
作者:feri
来源:CSDN
原文:https://blog.csdn.net/xingfei_work/article/details/72677442?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!

JAVA反射的使用之ResultSet的自动转换的更多相关文章

  1. 不使用BeanUtils,利用Java反射机制:表单数据自动封装到JavaBean

    在百度搜“java反射 将表单数据自动封装到javabean ”,第一页显示的都是一样的代码,都是利用导入第三方jar包<commons-beanutils>和<commons-lo ...

  2. java jdbc ResultSet结果通过java反射赋值给java对象

    在不整合框架的情况下,使用jdbc从数据库读取数据时都得一个个的get和set,不仅累代码还显得不简洁,所以利用java的反射机制写了一个工具类,这样用jdbc从数据库拿数据的时候就不用那么麻烦了. ...

  3. 基于Java反射的map自动装配JavaBean工具类设计

    我们平时在用Myabtis时不是常常需要用map来传递参数,大体是如下的步骤: public List<Role> findRoles(Map<String,Object> p ...

  4. [转]java反射机制

    原文地址:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html 一.什么是反射机制         简单的来说,反射机制指的是程序在运 ...

  5. java反射的理解与应用(某大神博客中看到的博文,写的真的太好了,果断转载作为笔记)

    原文地址:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html#undefined 一.什么是反射机制 简单的来说,反射机制指的是程序 ...

  6. java反射 概念

    一.什么是反射机制         简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,     那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...

  7. Java进阶(六)Java反射机制可恶问题NoSuchFieldException

    作为一种重要特性,Java反射机制在很多地方会用到.在此做一小结,供朋友们参考. 首先从一个问题开始着手. 可恶的问题又来了,NoSuchFieldException,如下图所示: 完全不知道这个qu ...

  8. java反射知识点总结

    一.java反射基础 1.1 什么叫java反射? 答:程序运行期间,动态的获取类的基本信息.比如:创建对象,调用类的方法,获得类的基本结构.这样给程序设计提供了很大的灵活性.个人总结就是:根据动态需 ...

  9. java反射机制(转)

    一.什么是反射机制         简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,     那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...

随机推荐

  1. 内存问题排查工具 --- valgrind

    1. 概述 2. Valgrind 3. 内存泄漏监测 3.1. 示例代码 3.2. 编译它 3.3. 用Valgrind监测进程的内存泄漏 4. 悬挂指针 4.1. 示例代码 4.2. Valgri ...

  2. 浅析iOS中的触摸事件

    一.什么是响应者对象? 在 iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象”.UIApplication.UIViewControl ...

  3. XSS安全处理

    Security.class.php文件 <?php class Security { public $filename_bad_chars = array( '../', '<!--', ...

  4. TripleDES之C#和PHP之间加密解密

    在C#常用加密解密一文中,介绍了几个加密解密方法,其中有个如何使用对称加密算法DES,此次说下DES的升级版,TripleDES. DES和TripleDES之间的关系可以参考下面的博文. 对称加密D ...

  5. C# 编写Windows Service(windows服务程序)

    C# 编写Windows Service(windows服务程序)   Windows Service简介: 一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序.W ...

  6. Android应用截图方法

    在Android应用开发过程中,可能会遇到需要对整个界面或者某一部分进行截图的需求.Android中对View的截图也有很多中方式: 使用DrawingCache 直接调用View.draw Draw ...

  7. /proc 目录详细说明

    /proc路径详细: Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以 ...

  8. Linux伙伴算法

    Linux内存管理伙伴算法 伙伴算法 Linux内核内存管理的任务包括: 遵从CPU的MMU(Memory Management Unit)机制 合理.有效.快速地管理内存 实现内存保护机制 实现虚拟 ...

  9. tomcat服务器配置字符集为utf-8-彻底解决中文乱码问题

    <Connector port="8070" protocol="HTTP/1.1" connectionTimeout="20000" ...

  10. ElementUI 按需引入坑爹的点记录

    官网说的是这样的: 但实际上,应该是这样修改: { "presets": [ ["env", { "targets": { "br ...