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
随机推荐
- 20.never give up
- Java学习笔记之面向对象、static关键字
一周Java学习总结 今天就总结理清一下关于面向对象和面向过程的程序设计的一些不同特点,以及讲下static关键字. 面向对象 现在接触的Java是面向对象的,现在的程序开发几乎都是以面向对象为基础的 ...
- .net core 2.1 基于Jwt的登录认证
1.新建一个.net core2.1 基于 api 的工程,引用Microsoft.AspNetCore.Authentication.JwtBearer 包 2.新建一个Token的实体类,一个Jw ...
- jvm虚拟机笔记<二> 垃圾回收与内存分配
确定对象已废弃需要两步: 利用可达性分析算法(与GC roots有关联——虚拟机栈中的对象,方法区静态对象,方法区常量对象,本地方法引用的对象)判断是否需要回收. 是否覆盖过finalize方法并执行 ...
- Monday
ssm项目 设计模式:上周(观察者模式,策略模式)
- windows平台多网卡设置路由
添加路由命令: route add 192.168.4.0 mask 255.255.255.0 192.168.4.1 metric 20 if 11 -p 其中192.168.4.0 是网络目标, ...
- PostgreSQL 常用函数
类似Oracle ,PostgreSQL也有强大的类型转换函数, 下面仅举两个类型转换例子. --1 例子 postgres; ?column? ---------- ( row) 在PG里如果想做除 ...
- textarea中文本高亮选中
最近在实现原文/译文句段高亮对比显示,和有道翻译类似,如下图所示: 最初的解决方案是采用富文本编辑器,把所有句段信息都用HTML标签包裹,操作空间比较大,页面上需要的功能几乎都可以实现,但是由此带来了 ...
- vue-awesome-swiper中的数据异步加载
<template> <div> //第一个轮播 加了v-if 判断,可以实现 loop 轮循 <swiper v-if="gglist.length>1 ...
- js实现防抖函数和节流函数
防抖函数(debounce) 含义:防抖函数指的是在特定的时间内没有再次触发,才得以进行接下来的函数运行: 用途:当window.onresize不断的调整大小的时候,为了避免不断的重排与重绘,可以用 ...