JavaBean類中的基本類型屬性

衆所周知,我們在使用Hibernate、Mybatis等框架一系列的ORM框架的時候,我們都需要定義JavaBean類,用來和數據庫的字段一一對應。但是當我們定義數值或者小數等能用基本類型表示的數據的時候,我們往往會將其定義爲基本類型的包裝類。例如下圖
 

很多程序員,都知道這樣去做,但是並不知道具體的原因。下面我從業務和技術層面去分析原因。
首先從業務層面來看
           以基本類型的int來舉例。 Integer比較明顯的一個好處就是 Integer比int可以多表示一個null, 你工作時可能遇到類似的情況,當一個用戶註冊時沒有輸入自己的年齡,用戶註冊成功後,個人中心顯示年齡爲0歲,隨即用戶打來電話進行投訴,說這是在侮辱他的人格。 當然案例雖然誇張了一些,但是這就是使用int的後果,因爲當我們創建一個用戶對象的時候,int類型的屬性是有默認值0的,當用戶輸入了年齡生日籍貫唯獨不想告訴年齡的時候,其他屬性都設置進入了用戶對象,而年齡這個int類型屬性則變成了0。對應到數據庫中則是0 。所以用戶會看到自己的年齡是0歲, 當然這樣的情況我們也可以寫一些額外的邏輯判斷處理一下。但是如果年齡是Integer呢,則Integer的默認值爲null,對應到數據庫中則爲空,即沒有數據。
還有一種情況是,對於很多ORM框架來說,邏輯是這樣的,如果你的這個屬性是主鍵,屬性有值,框架則認爲數據庫裏面有記錄,則執行修改操作。屬性沒值,框架則認爲數據庫裏面沒有記錄,則執行插入操作。而int永遠有值,Integer則是可以爲空的。當然你也可以寫額外的邏輯判斷處理一下,就是比較麻煩一些哦。
從技術層面上來說
       框架的底層都是調用JavaBean類的set方法進行賦值的。而基本類型屬性的set方法則需要使用反射技術特殊處理。我們先從圖片上查看爲什麼需要特殊處理。(圖片中利用的Student類是上圖的Student 類)
根據錯誤,我們的處理方向轉變到了如何把Integer.class轉變爲int.class。
思路如下:
1 : 首先捕獲NoSuchMethodException ,
2截取異常信息裏面的Integer的全路徑 比如“java.lang.Integer”
3然後把其改爲int.class,
4重新獲取Student的setAge方法,執行即可。
具體做法如下圖:
          經過上面的代碼我們可以看到,其實這種特殊處理還是比較麻煩的,更重要的是浪費程序的執行效率,一些非常小型的ORM工具比如DBUtils,都是沒有做特殊判斷的,如果JavaBean類裏面的屬性是基本類型的,那麼使用類似這種工具開發的代碼很有可能是會報錯的。但是像hibernate mybatis這些偏大型的ORM框架都做了完善的處理,但是剛纔也說到了這種處理的執行過程也是比較浪費程序效率的。這也就是爲什麼我們日常開發的時候JavaBean類裏面的基本類型屬性都會定義爲包裝類的類型。
提取碼:vsd5
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章