JAVA反射的使用之ResultSet的自动转换
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的自动转换的更多相关文章
- 不使用BeanUtils,利用Java反射机制:表单数据自动封装到JavaBean
在百度搜“java反射 将表单数据自动封装到javabean ”,第一页显示的都是一样的代码,都是利用导入第三方jar包<commons-beanutils>和<commons-lo ...
- java jdbc ResultSet结果通过java反射赋值给java对象
在不整合框架的情况下,使用jdbc从数据库读取数据时都得一个个的get和set,不仅累代码还显得不简洁,所以利用java的反射机制写了一个工具类,这样用jdbc从数据库拿数据的时候就不用那么麻烦了. ...
- 基于Java反射的map自动装配JavaBean工具类设计
我们平时在用Myabtis时不是常常需要用map来传递参数,大体是如下的步骤: public List<Role> findRoles(Map<String,Object> p ...
- [转]java反射机制
原文地址:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html 一.什么是反射机制 简单的来说,反射机制指的是程序在运 ...
- java反射的理解与应用(某大神博客中看到的博文,写的真的太好了,果断转载作为笔记)
原文地址:http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html#undefined 一.什么是反射机制 简单的来说,反射机制指的是程序 ...
- java反射 概念
一.什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...
- Java进阶(六)Java反射机制可恶问题NoSuchFieldException
作为一种重要特性,Java反射机制在很多地方会用到.在此做一小结,供朋友们参考. 首先从一个问题开始着手. 可恶的问题又来了,NoSuchFieldException,如下图所示: 完全不知道这个qu ...
- java反射知识点总结
一.java反射基础 1.1 什么叫java反射? 答:程序运行期间,动态的获取类的基本信息.比如:创建对象,调用类的方法,获得类的基本结构.这样给程序设计提供了很大的灵活性.个人总结就是:根据动态需 ...
- java反射机制(转)
一.什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...
随机推荐
- Debug 路漫漫-02
重现标准 BTL Model ,using MATLAB: 1. 错误使用 cat要串联的数组的维度不一致.出错 cell2mat (line 83) m{n} = cat(1,c{:,n}); —— ...
- JAVA中线程池的简单使用
比如现在有10个线程,但每次只想运行3个线程,当这3个线程中的任何一个运行完后,第4个线程接着补上.这种情况可以使用线程池来解决,线程池用起来也相当的简单,不信,你看: package com.dem ...
- block(八)作用域
//闭包 NSString* s =@"123"; void (^block)() = ^() { NSLog(@"%@",s); }; block();// ...
- 例说Linux内核链表(一)
介绍 众所周知,Linux内核大部分是使用GNU C语言写的.C不同于其它的语言,它不具备一个好的数据结构对象或者标准对象库的支持. 所以能够借用Linux内核源代码树的循环双链表是一件非常值得让人高 ...
- win10 标注工具LabelImg 安装使用
安装步骤(默认已经安装了Python3.X ): pip 安装PyQt5 进入cmd(Win键 + R键,输入cmd,enter键入),输入: >>pip install PyQt5 如果 ...
- echarts 认知笔记
0.echarts.setOption的核心认知 请注意,它是合并对象,而不是替换对象. 举个简单的例子,如果你第一次setOption时在series中配置了10个对象. 那么你下一次你意图使用只有 ...
- MySQL设置从库只读模式
常见现象 运维工作中会经常维护MySQL主从服务器,当然Slave我们只是用于读操作. 一般权限开通也只授权只读账号,但是有时候维护工作可能不是一个人在做,你不能保证其他同事都按照这个标准操作. 有同 ...
- 《KAFKA官方文档》入门指南(转)
1.入门指南 1.1简介 Apache的Kafka™是一个分布式流平台(a distributed streaming platform).这到底意味着什么? 我们认为,一个流处理平台应该具有三个关键 ...
- java类中serialversionuid 作用 是什么?举个例子说明(转)
serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的 ...
- Android app启动activity并调用onCreate()方法时都默默地干了什么?
Android app启动activity并调用onCreate() 方法时都默默地干了什么? 在AndroidManifest.xml文件中的<intent-filter>元素中有这 ...