JAVA反射的使用之ResultSet的自动转换

来源:互联网 发布:mysql affected rows 编辑:程序博客网 时间:2024/06/06 02:38

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;    }

这是通过反射和泛型来将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;    }

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

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

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

//将查询结果所有数据转换为指定类型的对象    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;    }

其实就是从ResultSet中获取内容的时候,不再单一的通过属性名称获取了,而是先使用注解的名称来获取,以此来达到名称不一致的情况。
我们还可以通过反射实现对象的保存等。
如对此有任何的疑问,都可以进行评论留言。
源码下载地址:http://download.csdn.net/detail/u014332200/9851115

原创粉丝点击