oracle學習筆記(八)——結果集元數據ResultSetMetaData以及ResultSet轉為對應的實體類框架

来源:https://www.cnblogs.com/kexing/archive/2019/05/10/10843874.html
-Advertisement-
Play Games

介紹 可用於獲取關於 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;
    }
    
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • --資料庫、模式、表名 "identities"."Test"."tab_test" --修改欄位名 ALTER TABLE "identities"."Test"."tab_test" RENAME "u_name" to realname ; --添加欄位 ALTER TABLE "identi... ...
  • Mysql 索引精講 開門見山,直接上圖,下麵的思維導圖即是現在要講的內容,可以先有個印象~ 常見索引類型(實現層面) 索引種類(應用層面) 聚簇索引與非聚簇索引 覆蓋索引 最佳索引使用策略 1.常見索引類型(實現層面) 首先不談Mysql怎麼實現索引的,先馬後炮一下,如果讓我們來設計資料庫的索引, ...
  • [20190510]rman備份的疑問8.txt--//上午測試rman備份多個文件,探究input memory buffer 的問題.--//補充測試5個文件的情況.--//http://blog.itpub.net/267265/viewspace-2148246/=>[20171204]關於 ...
  • 一、問題 linux下的mysql5.7忘記密碼 二、解決 第一步:打開mysql5.7的配置文件my.cnf,併在裡面增加一行:skip-grant-tables 保存並退出(:wq) 第二步:重啟mysql 第三步:登錄mysql並且修改密碼 用root賬號登錄: [root@iz09a32x1 ...
  • MySQL備份與主備配置 數據備份類型 全量備份:備份整個資料庫 增量備份:備份自上一次備份以來(增量或完全)以來變化的數據 差異備份:備份自上一次完全備份以來變化的數據 全量備份 全量備份的方法有 2 種,一種是利用資料庫管理工具提供的備份恢復和導入導出功能。例如:如果使用 Navicat、PHP ...
  • DATENAME和DATEPART有何區別,Insus.NET寫成一個函數,可以方便查詢與對比: 一個是返回一個字元串,另一個是返回一個整數。 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- -- Author: Insus.NET -- Cr ...
  • Redis 有 string、list、set、zset、hash數據類型。string類型是最基礎的,其他類型都是在string類型上去建立的,所以瞭解熟悉string類型的常用操作對於學習redis非常必要。 APPEND:向鍵的值後面追加字元串,並且返回追加後的值長度 SETBIT:設置或清除 ...
  • sql語句其實不難,尤其對於那些英語稍好一些的人來說! 最最最重要的就是搞清楚sql語句的執行順序!!!數據就像沙子, 語句就是篩子, 沙子按照順序經過給定的篩子,留下來的就是你要的!!! 並不是寫在前面的就先執行!!! 如下: SELECT *, SUM(pnum) '商品總數量' (4) FRO ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...