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
随机推荐
- [译]Vulkan教程(03)开发环境
[译]Vulkan教程(03)开发环境 这是我翻译(https://vulkan-tutorial.com)上的Vulkan教程的第3篇. In this chapter we'll set up y ...
- Java连载54-两种单例模式、接口详解
一.单例模式分为两种: (1)饿汉式单例:在类加载阶段就创建了一个对象. (2)懒汉式单例:用对对象的时候才会创建对象.(连载53中例子就是懒汉式) 饿汉式举例: package com.bjpowe ...
- 如何用css实现太极图
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>太 ...
- SpringBoot源码学习系列之@PropertySource不支持yaml读取原因
然后,为什么@PropertySource注解默认不支持?可以简单跟一下源码 @PropertySource源码: 根据注释,默认使用DefaultPropertySourceFactory类作为资源 ...
- PHP收集一些常用函数与好用的自定义函数
.自定义打印函数P //自定义打印function pp($data,$exit=0){// 定义样式 $str='<pre style="display: block;padding ...
- Linux系统文件属性知识
---------------------------------------------------------------------------------------------------- ...
- SpringBoot无法访问webapp目录下的文件
springboot version:2.1.9-RELEASE 解决方案: 在pom中添加此段 完美解决,代码的作用是让src/main/webapp在编译的时候在resoureces路径下也生成w ...
- (六十三)c#Winform自定义控件-箭头(工业)-HZHControls
官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...
- Java操作数据库——使用连接池连接数据库
Java操作数据库——使用连接池连接数据库 摘要:本文主要学习了如何使用JDBC连接池连接数据库. 传统方式和连接池方式 传统方式的步骤 使用传统方式在Java中使用JDBC连接数据库,完成一次数据库 ...
- Reuse Implemented Functionality 重用实现功能
A default XAF solution contains one platform-agnostic (shared) module and platform-dependent modules ...