2017-02-20 88 views
0

我想知道在運行時檢查變量類型的最佳方法。Java:什麼是在運行時檢查變量類型的最佳方法?

public Iterator<?> read(String entityName, String propertyName, Object propertyValue) { 

    String query = "select * from " + entityName + " where " + propertyName + "="; 

    try { 
     int value = Integer.parseInt((String)propertyValue); 
     query=query+value; 
    } catch (NumberFormatException e) { 
     // failed 
    } 

    try { 
     String value = (String)propertyValue; 
     query=query+"'"+value+"'"; 
    } catch (ClassCastException e) { 
     // failed 
    } 

    try { 
     float value = Float.parseFloat((String)propertyValue); 
     query=query+value; 
    } catch (NumberFormatException e) { 
     // failed 
    } 

    //Creating JDBC connection and execute query 

    Iterator<Element> result=queryConn.execute(); 

    return result; 
} 

我需要在運行時檢查變量類型是int,float還是String。有沒有其他最好的方法來做到這一點?

或者我是否需要爲每個變量類型編寫單獨的方法?

+0

您的代碼不會做你認爲它。例如:如果'propertyValue'爲'「3」',你的代碼將產生一個以'= 3'3'3'結尾的查詢。 – ruakh

+0

此外,請參閱https://en.wikipedia.org/wiki/SQL_injection,瞭解爲什麼你永遠不應該做你現在正在做的事情。 – ruakh

回答

4

試試這個代碼:

if(floatVariable instanceof Float){} 
if(intVariable instanceof Integer){} 
if(stringVariable instanceof String){} 
1

有沒有其他最好的方法來做到這一點?

我建議您在實際查詢中指定要選擇的列。如果採取這種方法,則可以將每列解析爲適當的類型,而不用擔心類型轉換問題。例如,如果選擇的第一列是整數類型,那麼您只需撥打Integer.parseInt()而不必擔心錯誤的類型。

這裏是一個說法,爲什麼使用SELECT *是一個反模式:

如果使用SELECT *作爲查詢的話,我們甚至不知道正在返回多少列。爲了甚至猜測,我們必須分析你的代碼似乎期望有多少列。但是,如果有人要更改模式會發生什麼情況,從而可能會改變RDBMS返回列的順序?那麼你的整個應用程序邏輯可能不得不改變。

+0

但我不知道我會得到整數或浮動或布爾值或字符串值。 –

+0

我認爲你錯過了這裏的觀點:'SELECT *'對應用程序代碼不會很友好,因爲你不知道你得到了什麼。最好命名你想要的列。在任何情況下,您的模式都不會頻繁更改,以致對Java代碼造成滋擾。 –

1

有很多方法可以處理這種情況。

  • 使用函數重載爲不同的數據類型
  • 使用instanceof運算符來確定數據類型
  • 嘗試在任何數字數據類型施放屬性值,如果成功種姓則忽略單引號,否則申請單引號
1

既然你得到的對象作爲輸入,你總是可以使用instanceof keyword.And而不是使用基元嘗試使用像類似(Integer.class)的類。並且還有一件事是你應該使用PreparedStatement always.Your code is prone to SqlInjection

相關問題