2012-06-01 102 views
4

典型情況:我們有一些類型爲Integer的可爲空的列,它可能是null或某些int值。因此,我們使用以下命令:將null設置爲PreparedStatement

private static void setIntOrNull(PreparedStatement stmt, int col, Integer i) 
    throws SQLException 
    { 
     if (i == null) 
      stmt.setNull(col, java.sql.Types.INTEGER); 
     else 
      stmt.setInt(col, i); 
    } 

但對於我這種情況是怎麼樣的壞習慣 - 到內部空隙更改方法中的外部對象(reffering到Robert Martin's "Clean Code"第17章:氣味和啓發,功能,F2)。我儘量避免這種情況,但是這次我找不到更好的解決方案。也許有人可以幫我一個嗎?

+1

+1。我從來沒有理解爲什麼PreparedStatement中沒有'setInteger(int position,Integer valueOrNull)'方法。爲什麼ResultSet中沒有'Integer getNullableInteger(int position)'。 –

回答

5

我不認爲它特別糟糕,真的。讓我們來看看:

  • 這是void,所以必須有副作用,或者是無用
  • 它是靜態的,所以也沒有對的「這就是所謂的對象」的任何影響;沒有一個!

所以副作用將是一個全球性的一個(例如外部諸如文件系統,內部如靜態變量,或時間例如睡眠)就會影響的所述一個由參數引用的對象。

int不是一個對象,Integer對象是不可改變的,所以只事情可以影響是PreparedStatement。由於準備好的陳述的目的之一是收集參數數據,所以該方法將這樣做是完全合理的。這個方法的名稱使得它更加清晰 - 除非準備好的語句上,否則會在哪裏「設置」一個int或null?

基本上是:不要擔心:)

可能想將它移動到一個公共的「助手」類,如PreparedStatementHelper,使這個更加清晰 - 這使得它有可能很明顯,你真的會像這些方法在PreparedStatement,但他們不是這樣,你必須有一個靜態方法,而不是作用於 a PreparedStatement

一種選擇是創建你自己的包裝類,它會保持一個PreparedStatement本身,有一個實例setIntOrNull方法......但是從長遠來看,我相信這將是一個複雜多了,對於沒有什麼好處。