2016-11-17 148 views
0

我在我的數據庫中有一個非常大的表。其中一些字段可能爲空。如何逃避PreparedStatement.setNull?

我只是想從使用逃脫:

PreparedStatement.setNull(index, Type.X) 

像:

if(obj.getSomaData() == null){ 
    insertStmt.setNull(++i, java.sql.Types.VARCHAR); 
}else{ 
    insertStmt.setString(++i, obj.getSomaData()); 
} 

有一個更好的和更清潔的方式做到這一點?

P.S .:我正在使用PostgreSQL。

+0

你的意思是說你不想使用'setNull()'方法?如果您正在INSERT數據,則不需要顯式設置值NULL,因爲缺省值默認爲NULL。 –

+1

我認爲Postgres JDBC驅動程序會處理'setString(index,null)'就好了 –

+0

@MickMnemonic這隻有在這些列沒有包含在insert語句中,如果包含它們,JDBC驅動程序應該爲值沒有明確設置。請參閱JDBC 4.2第13.2.2節:_「如果未爲參數標記提供值,則用於執行」PreparedStatement「對象('executeQuery','executeUpdate'和'execute')的方法將拋出'SQLException'。 「# –

回答

3

setNull的主要用例是將原始類型設置爲null,並處理一些邊界情況,其中驅動程序無法知道參數的數據類型並需要明確指示。

在大多數情況下,您應該可以使用setString(idx, null)(或其他對象類型的setXXX)。

引述JDBC 4.2節13.2.2.4:

如果Java null被傳遞到任何的是採取一個Java對象的setter方法,參數將被設置爲JDBC NULL

時例外(使用setObject EG)的「類型化」 null,它被認爲最大的可移植性,你應該使用由setNull或接受一個類型參數,因爲不是所有的數據庫支持的setObject沒有類型信息。