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
随机推荐
- linux常用命令修改权限查看文档
一.>和>>指令 >用于将执行结果写入后面的文件中: 把前方语句的结果存进文件,若文件不存在会自动创建 >:输出重定向 会覆盖原来文件内容 >>:追加重定向 ...
- PanDownload
百度盘下载地址:下载速度很快(链接)
- Redis分布式缓存实现
基于redis分布式缓存实现 第一:Redis是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data S ...
- python语言程序设计基础(第二版)第五章答案随笔
1.实现isOdd()函数,参数为整数,如果整数是奇数,返回True,否则返回False def isOdd(num): if num % 2 == 0: return True ...
- 使用opencv和numpy实现矩阵相乘和按元素相乘 matrix multiplication vs element-wise multiplication
本文首发于个人博客https://kezunlin.me/post/1e37a6/,欢迎阅读最新内容! opencv and numpy matrix multiplication vs elemen ...
- 解决RubyMine中puts中文显示乱码的问题
一个简单的ruby代码,puts一个中文,显示乱码 # -*- coding: utf-8 -*- puts "你好" require_relative 'calc.rb' # r ...
- C#函数(构造函数)的重载
using System; namespace test { class Program { static void Main(string[] args) { Cat cat = new Cat() ...
- echarts 饼图 + 全屏显示
效果图: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 【转载】从使用到原理学习Java线程池
线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收. 所 ...
- kmeans均值聚类算法实现
这个算法中文名为k均值聚类算法,首先我们在二维的特殊条件下讨论其实现的过程,方便大家理解. 第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给 ...