oracle学习笔记(八)——结果集元数据ResultSetMetaData以及ResultSet转为对应的实体类框架
介绍
可用于获取关于 ResultSet 对象中列的类型和属性信息的对象,在持久框层框架(如:mybatis, hibernate)中被广泛的应用。
常用方法
int getColumnCount()
返回此 ResultSet 对象中的列数String getColumnLabel(int column)
获取用于打印输出和显示的指定列的建议标题。建议标题通常由 SQL AS 子句来指定。String getColumnName(int column)
获取指定列的名称Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select ename,job,hiredate from employee");
ResultSetMetaData resultSetMetaData = rs.getMetaData();
int colCount = resultSetMetaData.getColumnCount();
System.out.println("共有多少列:" + colCount); for (int i = 1; i <= colCount; i++) {
//得到列名
String colLabel = resultSetMetaData.getColumnLabel(i);
//通过列名得到该列的值
Object value = rs.getObject(colLabel);
System.out.println("第" + i + "列的值:" + value);
}
一个简单的框架例子代码
以下是一个类,主要是讲数据库返回的ResultSet转为对应的实体类,要注意,实体类的属性名要与数据库中的列名保持一致
可以直接拿来用
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 将查询结果集的数据组装成相应的POJO(简单的Java对象)实体
*
* @author StarsOne
* @date Create in 2019-4-27 0027 09:43:40
* @description
*/
public class ResultSetHandler<T> {
private List<T> beanList;
private Class<T> type;
private ResultSetMetaData metaData;
private ResultSet resultSet;
public ResultSetHandler(ResultSet resultSet, Class<T> type) {
//初始化beanList
beanList = new ArrayList<>();
this.resultSet = resultSet;
try {
//获得数据集元数据
this.metaData = resultSet.getMetaData();
} catch (SQLException e) {
e.printStackTrace();
}
this.type = type;
handlerData();
}
private void handlerData() {
/*
思路分析:
1. 首先获得实体类中的所有属性:Class.getDeclareFields(),存放在Map<属性名,Field> 中
2. 通过ResultSetMetaData结果集元数据中的列名,将查询结果相应的列的值取出来resultset.getObject()
3. 将实体类的属性的名与结果集中相应的列进行反射赋值*/
Field[] declaredFields = type.getDeclaredFields();
Map<String, Field> fieldMap = new HashMap<>();
for (Field declaredField : declaredFields) {
//Map<"NUM",NUm属性对象>
fieldMap.put(declaredField.getName().toUpperCase(), declaredField);
}
try {
// while循环,遍历结果集ResultSet中的全部数据
while (resultSet.next()) {
//将一条数据对应的实体类对象添加到list中
beanList.add(getT(fieldMap));
}
} catch (SQLException | IllegalAccessException | InstantiationException e) {
e.printStackTrace();
}
}
/**
* 获得每一条数据所对应的一个实体类对象
* @param fieldMap 存放属性field的Map集合
* @return 一个实体类对象
* @throws InstantiationException
* @throws IllegalAccessException
* @throws SQLException
*/
private T getT(Map<String, Field> fieldMap) throws InstantiationException, IllegalAccessException, SQLException {
// 获得查询结果中的列数
int columnCount = metaData.getColumnCount();
T target = type.newInstance();
// 一次循环代表一列
for (int i = 1; i <= columnCount; i++) {
// 获得列的标题(列名)
String columnLabel = metaData.getColumnLabel(i);
// 检查此列是否有对应的属性存在
if (fieldMap.containsKey(columnLabel)) {
// 通过列名从Map中获得对应的Field对象
Field field = fieldMap.get(columnLabel);
field.setAccessible(true);
//根据此属性的类型来调用相应的结果集方法,
// 如:String ename --> resultSet.getString()
Object value = null;
Class<?> fieldType = field.getType();
if (fieldType == String.class) { //Character
value = resultSet.getString(columnLabel);
} else if (fieldType == Byte.class || fieldType == Byte.TYPE) { // int
value = resultSet.getByte(columnLabel);
} else if (fieldType == Short.class || fieldType == Short.TYPE) { //
value = resultSet.getShort(columnLabel);
} else if (fieldType == Integer.class || fieldType == Integer.TYPE) { //
value = resultSet.getInt(columnLabel);
} else if (fieldType == Long.class || fieldType == Long.TYPE) { //
value = resultSet.getLong(columnLabel);
} else if (fieldType == Double.class || fieldType == Double.TYPE) { //
value = resultSet.getDouble(columnLabel);
} else if (fieldType == Float.class || fieldType == Float.TYPE) { //
value = resultSet.getFloat(columnLabel);
} else if (fieldType == java.util.Date.class || fieldType == java.sql.Date.class) { //
value = resultSet.getDate(columnLabel);
} else if (fieldType == java.sql.Time.class) { //
value = resultSet.getTime(columnLabel);
} else if (fieldType == Boolean.class || fieldType == Boolean.TYPE) { //
value = resultSet.getBoolean(columnLabel);
}
field.set(target, value);
} // end if
} // end for
return target;
}
/**
* 获得list
*
* @return
*/
public List<T> getBeanList() {
return beanList;
}
public T getBean(){
beanList!=null && beanList.size()>0?beanList.remove(0):null;
}
}
oracle学习笔记(八)——结果集元数据ResultSetMetaData以及ResultSet转为对应的实体类框架的更多相关文章
- Redis学习笔记八:集群模式
作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...
- Oracle学习笔记(八)
十一.子查询 1.子查询概述 学习子查询的原因 事例:查询工资比SCOTT高的员工信息 思路:1.scott的工资 select sal from emp where ename='SCOTT'; 2 ...
- Oracle学习笔记八 表空间
表空间 表空间是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间 . 分区表 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- oracle学习笔记第一天
oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字 1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...
- python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑
python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...
- Go语言学习笔记八: 数组
Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...
- Oracle学习笔记——点滴汇总
Oracle学习笔记——点滴汇总 http://www.botangdb.com/ Oracle GI = Grid Infrastructure = ASM + Cluster
随机推荐
- MyBatis的ResultMapping和ResultMap
MyBatis的ResultMapping和ResultMap Effective java 第3版中描述的Builder模式 Java设计模式14:建造者模式 2个类都使用了Builder来构建对象 ...
- 图解SynchronousQueue原理-公平模式
SynchronousQueue原理详解-公平模式 一.介绍 SynchronousQueue是一个双栈双队列算法,无空间的队列或栈,任何一个对SynchronousQueue写需要等到一个对Sync ...
- 如何获取JVM堆转储文件
堆转储是诊断与内存相关的问题(例如内存泄漏缓慢,垃圾回收问题和 java.lang.OutOfMemoryError.它们也是优化内存消耗的重要工具. 有很多很不错的的工具,例如Eclipse MAT ...
- spring boot项目记录--日志处理
微信点餐用到的日志框架:slf4j(门面)+logback(框架) @RunWith(SpringRunner.class) @SpringBootTest @Slf4j public class L ...
- 3D开发基础知识和简单示例
引言 现在物联网概念这么火,如果监控的信息能够实时在手机的客服端中以3D形式展示给我们,那种体验大家可以发挥自己的想象. 那生活中我们还有很多地方用到这些,如上图所示的Kinect 在医疗上的应用,当 ...
- PHP简单判断当前使用的是什么浏览器
PHP简单判断当前使用的是什么浏览器,判断浏览器类型的方法,方便统计网站访问用户使用浏览器的比例. 判断浏览器类型方法 function userBrowser() { $user_OSagent = ...
- JMeter压测“java.net.SocketException: Socket closed”解决方法
报错详情: java.net.SocketException: Socket closed at java.net.SocketInputStream.socketRead0(Native Metho ...
- JQuery iframe宽高度自适应浏览器窗口大小的解决方法
iframe宽高度自适应浏览器窗口大小的解决方法 by:授客 QQ:1033553122 1. 测试环境 JQuery-3.2.1.min.js 下载地址: https://gitee.com ...
- Playbook剧本初识
目录 1.Playbook剧本初识 2.Playbook变量使用 3.Playbook变量注册 4.Playbook条件语句 5.Playbook循环语句 6.Playbook异常处理 7.Playb ...
- bay——安装_Oracle 12C-单实例-Centos7 -DG.txt
用户和密码: root/bayaimbayaim/064286BAIbayoracle/oracleSID:orclsys/oraclesystem/oraclempay/mpaydx/dx ---- ...