介绍

可用于获取关于 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转为对应的实体类框架的更多相关文章

  1. Redis学习笔记八:集群模式

    作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...

  2. Oracle学习笔记(八)

    十一.子查询 1.子查询概述 学习子查询的原因 事例:查询工资比SCOTT高的员工信息 思路:1.scott的工资 select sal from emp where ename='SCOTT'; 2 ...

  3. Oracle学习笔记八 表空间

    表空间 表空间是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间 .   分区表 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下 ...

  4. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  5. Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  6. oracle学习笔记第一天

    oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字   1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...

  7. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...

  8. Go语言学习笔记八: 数组

    Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...

  9. Oracle学习笔记——点滴汇总

    Oracle学习笔记——点滴汇总 http://www.botangdb.com/ Oracle GI = Grid Infrastructure = ASM + Cluster

随机推荐

  1. ubuntu 18.04多应用窗口切换的快捷键使用指南

    前记 使用ubuntu时间长了,很厌烦用鼠标来点来点去.重复操作的,还是快捷键比较方便.在多窗口切换方面,熟悉了几个快捷键之后,顿时感觉神清气爽.这里就推荐给大家学习一下,提高工作效率啊. 常用快捷键 ...

  2. IT兄弟连 HTML5教程 HTML5文字版面和编辑标签 使用HTML表格

    表格在网站中应用得非常广泛,使用它可以方便.灵活地排版,很多动态大型网站也都是借助表格排版的,但现在都使用DIV+CSS进行页面布局.表格可以把相互关联的信息元素集中定位,使浏览页面的人一目了然.在H ...

  3. 2019年全国高校计算机能力挑战赛初赛C++语言解答

    1; 题目一 16.电商促销某种商品时,希望通过打折鼓励消费者组团消费.已知,团队消费金额=该团的人数和*商品单价.打折规则如下:当组团消费者数量不满50人时,商品消费金额没有折扣:消费者数量大于等于 ...

  4. 使用VBA从工作表中读图片,以及给工作表中写文件

    因为工作的原因,需要用到VBA,碰到读图片和写图片: Sub Macro01() '从工作表中保存图片 Application.ScreenUpdating = False Dim pth, shp, ...

  5. PHP发送短信

    1.要拼接接收的手机号和短信 public function sendcode() { $parpm = input(); $valist = $this->validate($parpm, [ ...

  6. pecl安装和卸载示例

    比如安装MongoDB扩展 命令行下输入: [#] /usr/local/php/bin/pecl install mongodb ......嗒吧嗒吧一大堆输出后 Build process com ...

  7. JAVAEE学期总结

         声明:除第一张思维导图为博主所制作,其他思维导图皆来自网络,若侵权,望告知,必删除.                                                      ...

  8. 用两种以上的 方式实现一个方法或者对象,调用时打印"你好xx",已定义的代码不能做修改,自己编译的不能出现"你好"? (Javasctript)

    先上代码 const obj = { say(){ Array.from(arguments).forEach(item=>{ console.log(`${this.str} ${item}` ...

  9. boostrap 学习笔记

    bootstrap : 是全球最受欢迎的前端组件库,用于开发响应式布局.移动设备优先的 WEB 项目. 用于项目样式的快速搭建,真的是..特别快.. 随便找两个cdn引用就能使用了. https:// ...

  10. [20191113]oracle共享连接模式端口2.txt

    [20191113]oracle共享连接模式端口2.txt --//昨天的测试链接:http://blog.itpub.net/267265/viewspace-2663651/=>[20191 ...