至今,小菜用java快兩年了,有些事,也該有個總結。 基本類型和包裝類型的概念在本文不作贅述。 如果這兩種類型直接使用,倒沒什麼值得討論的,無非就是自動裝箱拆箱,java可以讓你感覺不到他們的存在,但如果我們在資料庫映射實體(下文簡稱bo,即business object)中使用,就得註意了! 比如
至今,小菜用java快兩年了,有些事,也該有個總結。
基本類型和包裝類型的概念在本文不作贅述。
如果這兩種類型直接使用,倒沒什麼值得討論的,無非就是自動裝箱拆箱,java可以讓你感覺不到他們的存在,但如果我們在資料庫映射實體(下文簡稱bo,即business object)中使用,就得註意了!
比如有一個評定表,裡邊有個評分欄位,在寫bo時,定義評分屬性,是用int還是Integer呢?
假如用Integer,在做數據插入時,先實例化一個bo,此時bo中的Integer類型欄位,預設是null值,如果我們一不留神忘了給它一個初始值0,那麼插入到資料庫中的值也是null,再查詢出來,當然也是null。
試想,作為評分而言,下限也就是0分,怎麼可能是null?於情說不通;讀者平時可能不太註意,以下代碼會拋出空指針異常:
1 Integer i = null; 2 3 if(i == 0){ 4 5 }
為啥?因為java會對i進行自動拆箱,null怎麼拆,當然會空指針了,於理說不通。
既然於情於理都不通,看來我們只能用基本類型int,而int恰好解決了上述問題,因為int是基本類型,天生就有初始值0。
有些時候,我們會直接把bo放在controller層,用來封裝參數,客戶端提交的參數,直接用一個bo來接受,就不用反覆定義一堆變數,而且方便插入到資料庫。
那麼問題來了,如果我們的bo中是用基本類型int定義的屬性,那麼天生就會有預設值0,就算客戶端不提交這個參數,也會有值,這樣就無法區分值0是客戶端提交的,還是預設的。
小菜以為,解決這個問題也不難,最簡單的方法就是把0看作非法值,或者空值。如果檢查到某個值為0,就認為沒有提交該參數,或者提交的參數非法。
當然,不能一概而論,一棒子打死所有的0。在經典的設計中,有個概念叫軟刪除,就是加個欄位(比如:status)標記一下,0表示該條記錄正常,1表示已刪除。這裡依然可以用0,因為這是對內的參數,作為系統內部運作使用,不涉及與客戶的交互。