2017-03-06 169 views
0

我想驗證電話號碼是否存在於數據庫列(TelephoneNumber)中。如果存在,我將返回true否則false 此代碼不僅驗證TelephoneNumber列,它可以驗證像FirstNameLastName其他數據庫列,EmailAddressetcJava - 循環訪問數據庫記錄的有效方法

public boolean executeDBQuery(String tableName, String columnName, 
     String columnValue) { 
    try { 
     PreparedStatement ps = null; 
     String query = "SELECT TOP 1 " + columnName + "FROM" + tableName 
       + "WHERE" + columnName + "=" + '?'; 
     ps = conn.prepareStatement(query); 
     ps.setString(1, columnValue); 
     ResultSet rs = ps.executeQuery(); 
     if (rs.next()) { 
      return true; 
     } else { 
      return false; 
     } 
    } catch (SQLException ex) { 

    } 

    return false; 
} 

主要方法:

public static void main(String[] args) { 
Database db = new Database(); 
boolean result = db.executeDBQuery("Application","FirstName","asd"); 
System.out.println(result); 
} 

即使在數據庫中找不到值,上述代碼也會返回真值。不知道我在這裏做錯了什麼。任何人都可以幫助我

+1

首先,使用「*」不是一個好主意。第二:爲什麼不使用「WHERE」並讓db執行查找。使用索引可能會更高效。 – Fildor

+0

我沒有看到你如何使用迄今給出的代碼來驗證其他列。這是否意味着,你會使用相同的只是另一個col名稱?在這種情況下,所有的列都必須是字符串列。數字的呢?另外請注意,您可以通過選擇適當的排序規則來控制數據庫中的區分大小寫。 – Fildor

+0

是的,我將整數轉換爲字符串,同時將它傳遞給參數 – Aishu

回答

2

我想你沒有在這裏正確使用你的數據庫。數據庫旨在有效地遍歷給定表中的所有記錄並回答業務問題。另一方面,Java並不是真正爲此設計的。目前,您正在遍歷Java中搜索匹配的整個整個表。這有以下問題:

  • 數據的潛在的巨大的量在整個網絡數據庫和Java應用程序之間傳遞
  • 沒有助劑,如指數,可以在此搜索過程中使用,這可能是效率低下
  • Java並不是真正爲低級別數據庫操作構建的,因此,在您的應用程序中花費的計算時間可能輕鬆超過數據庫對同一查詢所需的資源。這個操作是一個確定的資源。


在你的情況,因爲你正在使用SQL Server,以下單查詢要做到同樣的事情,你當前的代碼:

SELECT TOP 1 TelephoneNumber FROM Application WHERE TelephoneNumber = '6553438888'; 

下面的代碼片段,您可以試試:

try { 
    PreparedStatement ps = null; 
    String sql = "SELECT TOP 1 TelephoneNumber FROM Application "; 
      sql += "WHERE TelephoneNumber = ?;"; 
    ps = conn.prepareStatement(sql); 
    ps.setString(1, "6553438888"); 
    ResultSet rs = ps.executeQuery(); 
    if (rs.next()) { 
     System.out.println("Found the phone number"); 
    } 
    else { 
     System.out.println("Did not find the phone number"); 
    } 
} catch (SQLException e) { 
    // handle exception 
} finally { 
    // cleanup, close connections, etc. 
} 

如果沒有發現的數量,那麼上述結果集是空的,調用rs.next()將返回false。這使您可以確定是否找到有問題的記錄。

+1

@Aishu請注意,Tim在查詢中使用了硬編碼值,使用PreparedStatements當然可以使用置換參數值 – Fildor

+1

@Fildor好主意 –

+0

@Tim - 上面的代碼仍然返回如果在db中找不到值 – Aishu

0

您可能不想在您的Java應用程序中通過查詢獲取數百萬行。你很可能會用盡空間。因此,不建議這種查詢。

您可以做的是,將所需的電話號碼發送到where子句中的數據庫查詢。如果返回的行數爲零,那麼您可能會返回false否則您可能會返回true。您也可以嘗試僅使用toplimit從數據庫獲取第一行。

注意:您可以在表格的TelephoneNumber列上創建index。索引提高了搜索性能。如果您保留number類型的TelephoneNumber列而不是varchar,那麼使用索引會更快,因爲數字比較比文本比較快。另請注意,使用索引會在數據庫上佔用更多空間,因此請小心使用它們。