欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

oracle学习笔记(八)——结果集元数据ResultSetMetaData以及ResultSet转为对应的实体类框架

程序员文章站 2022-05-09 08:04:53
介绍 可用于获取关于 ResultSet 对象中列的类型和属性信息的对象,在持久框层框架(如:mybatis, hibernate)中被广泛的应用。 常用方法 int getColumnCount() 返回此 ResultSet 对象中的列数 String getColumnLabel(int co ......

介绍

可用于获取关于 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;
    }
    
}