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;
	}
	
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM