JavaBean類中的"基本類型屬性"


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

很多程序員,都知道這樣去做,但是並不知道具體的原因。下面我從業務和技術層面去分析原因。
首先從業務層面來看
           以基本類型的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方法,執行即可。
具體做法如下圖:
<ignore_js_op><ignore_js_op>
          經過上面的代碼我們可以看到,其實這種特殊處理還是比較麻煩的,更重要的是浪費程序的執行效率,一些非常小型的ORM工具比如DBUtils,都是沒有做特殊判斷的,如果JavaBean類里面的屬性是基本類型的,那么使用類似這種工具開發的代碼很有可能是會報錯的。但是像hibernate mybatis這些偏大型的ORM框架都做了完善的處理,但是剛才也說到了這種處理的執行過程也是比較浪費程序效率的。這也就是為什么我們日常開發的時候JavaBean類里面的基本類型屬性都會定義為包裝類的類型。
提取碼:vsd5
更多免費技術資料可關注:annalin1203


免責聲明!

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



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