1. 程式人生 > >利用反射實現JavaBean的自動賦值(六)

利用反射實現JavaBean的自動賦值(六)

最近開發公司的一個專案,因專案不是很大的專案,所以僅僅採用了spring MVC框架,但是資料庫很多表中的欄位至少15個,這樣當每次將資料庫表中的資料取出來放入javabean中時,寫setXXX方法總是要寫很多遍,而且容易出錯,很是麻煩,所以採用了反射和泛型的方式,自動給javabean賦值。當然有個缺點,就是資料庫中的欄位名要跟javabean中的欄位名相同,並且欄位型別要相同。如果想做成更好的話,可以採用配置檔案的方式,在此就不寫了。程式碼如下:

// 根據傳過來的物件和ResultSet自動給物件賦值
    public static <T> List<T>  getBean(ResultSet rs, T object) throws Exception {
        Class<?> classType = object.getClass();
        ArrayList<T> objList = new ArrayList<T>();
        //SqlRowSet srs = jdbcTemplate.queryForRowSet(sql);
        Field[] fields = classType.getDeclaredFields();//得到物件中的欄位
        while (rs.next()) {
            //每次迴圈時,重新例項化一個與傳過來的物件型別一樣的物件
            T objectCopy = (T) classType.getConstructor(new Class[] {}).newInstance(new Object[] {});
            for (int i = 0; i < fields.length; i++) {
                Field field = fields[i];
                String fieldName = field.getName();
                Object value = null;
                //根據欄位型別決定結果集中使用哪種get方法從資料中取到資料
                if (field.getType().equals(String.class)) {
                    value = rs.getString(fieldName);
                    if(value==null){
                        value="";
                    }
                }
                if (field.getType().equals(int.class)) {
                    value = rs.getInt(fieldName);
                }
                if (field.getType().equals(java.util.Date.class)) {
                    value = rs.getDate(fieldName);
                }
                // 獲得屬性的首字母並轉換為大寫,與setXXX對應
                String firstLetter = fieldName.substring(0, 1).toUpperCase();
                String setMethodName = "set" + firstLetter
                        + fieldName.substring(1);
                Method setMethod = classType.getMethod(setMethodName,
                        new Class[] { field.getType() });
                setMethod.invoke(objectCopy, new Object[] { value });//呼叫物件的setXXX方法
            }
            
            objList.add(objectCopy);
        }
        if(rs != null){
            rs.close();
        }
        return objList;
    }

上面方法的使用如類為User:

User user = new  User();

List<User> list = getgetBean(resultSet , user);//將得到list集合,裡面是有user物件組成的。

相關推薦

利用反射實現JavaBean自動

最近開發公司的一個專案,因專案不是很大的專案,所以僅僅採用了spring MVC框架,但是資料庫很多表中的欄位至少15個,這樣當每次將資料庫表中的資料取出來放入javabean中時,寫setXXX方法總是要寫很多遍,而且容易出錯,很是麻煩,所以採用了反射和泛型的方式,自動

golang-利用反射給結構體

cnblogs logs val valueof blog eof 成員 str byname 由於想給一個結構體的部分成員賦值,但是有不知道具體名字,故將tag的json名字作為索引,按照json名字來一一賦值 //將結構體裏的成員按照json名字來賦值 func

BeanUtils利用反射實現物件間相同屬性的複製

BeanUtils 話不多說直接貼程式碼 下面是測試: 話不多說直接貼程式碼 /** * 利用反射實現物件之間相同屬性複製 * * @param source *

Jsp獲取Java的重定向String

min 404頁 htm pat 代碼 clas mage 獲取 text Jsp獲取Java的重定向賦值(String) Java代碼片段: //傳遞String request.setAttribute("msg", msg); //重定向 request.getRe

C# List --引用類型的和復制

地址 修改 引用 進行 urn ont pre 詳細 理論 最近項目維護中遇到一個問題,確切的說應該是兩個月前的問題也是因為這裏引起的,可惜當時困於業務不熟悉,也沒有更多時間允許查詢根源,導致再次引發了新的問題!!! 問題場景:基礎數據存於List類型的BOMs中,計算過程

前端開發框架總結之利用Jtopo實現網路拓撲功能

                     前端開發框架總結之利用Jtopo實現網路拓撲功能(四) 上文我們講了拓撲容器相關的互動設計和實現思路以及一些關鍵技術細節。至此,我們已經覆蓋了結

前端開發框架總結之利用Jtopo實現網路拓撲功能

                     前端開發框架總結之利用Jtopo實現網路拓撲功能(三) 上文我們講了一些拓撲連線、拓撲文字節點相關的互動設計和實現思路以及一些關鍵技術細節。本文

前端開發框架總結之利用Jtopo實現網路拓撲功能

                    前端開發框架總結之利用Jtopo實現網路拓撲功能(二) 上文我們講了一些拓撲結點生成的實際場景設計和實現思路以及一些關鍵技術細節。本文我們繼續我們的拓撲管理

前端開發框架總結之利用Jtopo實現網路拓撲功能

                      前端開發框架總結之利用Jtopo實現網路拓撲功能(一) 前言:     前段時間由於專案需要實現一個網路裝置拓撲管理的

VS中拒絕在if語句中

以前節選的內容,出處忘記了。 讓Visual C++拒絕在if語句的條件表示式中賦值 一旦不小心把if (c == '+') {}寫成了if (c = '+') {}是多麼地悲劇。 寫成下邊這樣吧if ('+' == c) {}又違揹人的直覺。 解決辦法:設定project的property,在C/C

新手vue爬坑經歷-vue

最近本人一直在學習vue,發現vue的資料繫結比起JQuery使用起來更加方便,不像以前在JQ裡面苦逼的操作DOM節點,每次想要更新檢視模板,都要在js裡面寫好多html,看著那些程式碼,心裡就很是煩躁。 vue的好處就是檢視和資料是繫結在一起的,我們可以通過改

用結構體指標做函式形參實現返回多個fishing_6

        最近在學ST32驅動數字攝像頭OV2640的實驗,無意中遇到了函式返回多個值的情況,決定Mark一下,說不定以後就會用到,因為一般函式都是隻有一個返回值的嘛,具體如下:         首先在標頭檔案定義結構體:                 typed

變數初學者

各類數值型資料之間的混合運算:變數的資料型別是可以相互轉換的。轉換的方法有兩種,一種是自動轉換,一種是強制轉換。 1、自動轉換:自動轉換髮生在不同資料型別的量混合運算時,由編譯系統自動完成的。 自動轉換遵循以下規則:(1)若參與運算量的型別不同,則先轉換成同一型別,然後進行運算。 (2)轉換按資料長度增

利用Tensorflow實現SSD架構model訓練voc2012

一、VOC圖片獲取 VOC資料下載地址:   找到上圖位置,下載training/validation data 和 development kit code and documentation 二、VOC圖片格式轉換為TFRcord 因為tf訓練需要tfreco

es6變數解構1

es6陣列解構賦值: let a = 1; let b = 2; == let [a, b, c] = [1, 2, 3]; let c = 3; console.log(a,b,c) /

Unity3D利用Photon實現實時聯網對戰Photon Server介紹

Photon 是一個實時多人遊戲開發框架,它是快速、精益和靈活的。 Photon伺服器功能強大,能夠滿足一般的中小型網路遊戲的需求,而且開發效率高,所以就稱為了大多數開發者的首選。由於網上關於Photon聯網的介紹內容比較少,現在小義就跟大家分享一下關於Pho

mysql儲存過程之變數建立DECLARESET

    我們都知道,變數是一個命名資料物件,變數的值可以在儲存過程執行期間更改。我們接下來就嘗試使用儲存過程中的變數來儲存直接/間接結果。 這些變數是儲存過程的本地變數,但是我們得注意,變數必須先聲明後

Unity3D利用Photon實現實時聯網對戰PUN SDK介紹

由於這段時間公司的專案有點忙,好久沒有更新啦,在這裡希望得到大家的諒解,好了,廢話不多說啦,直奔主題! 今天的介紹內容是PUN SDK的運用,主要通過官方Demo來一起學習。 1、配置Photon Server伺服器

SQL Server 2017 AlwaysOn AG 自動初始化

toolbar 副本 輔助 AS repl server 自動 too (六) 在現有可用性組上停止某個輔助副本的自動種子設定在主副本上執行ALTER AVAILABILITY GROUP [<availability_group_name>] MODIFY R

.NetCore下使用Prometheus實現系統監控和警報 進階Grafana集成自定義收集指標

之前 技術 bsp (六) com ota 選擇 netcore 面板 Prometheus中包含了很多收集指標,那麽我們怎來在Grafana中來使用呢? 接下來我們還是以之前自定義的來演示如圖:我們在Prometheus中已經可以看到這個之前我們自定義的類型了 關