2017-03-06 2 views
0

Ich möchte überprüfen, ob die Telefonnummer in der Datenbankspalte (TelephoneNumber) existiert. Wenn vorhanden will ich wieder true oder sonst false Dieser Code wird nicht nur die TelephoneNumber Spalt, um zu überprüfen, kann es andere DB Spalten validieren wie FirstName, LastName, EmailAddressetcJava - Effiziente Methode zum Durchlaufen der Datenbankeinträge

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; 
} 

Haupt Methode:

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

Der obige Code gibt einen wahren Wert zurück, auch wenn die Werte nicht im DB gefunden werden. Ich bin mir nicht sicher, was ich hier falsch mache. Kann mir jemand helfen

+1

Zunächst ist die Verwendung von "*" keine gute Idee. Zweitens: warum nicht "WHERE" verwenden und die db die Suche durchführen lassen. Mit Indizes ist dies wahrscheinlich viel effizienter. – Fildor

+0

Ich sehe nicht, wie Sie andere Spalten mithilfe des angegebenen Codes validieren würden. Heißt das, du benutzt das selbe nur für einen anderen Kolumnennamen? In diesem Fall müssten alle Spalten Stringspalten sein. Was ist mit numerischen? Beachten Sie auch, dass Sie die Groß-/Kleinschreibung in Ihrer Datenbank steuern können, indem Sie die entsprechende Sortierung auswählen. – Fildor

+0

Ja, ich werde Integer in String umwandeln, während Sie es an die Argumente übergeben – Aishu

Antwort

2

Ich denke, dass Sie nicht Ihre Datenbank hier richtig verwenden. Datenbanken wurden entwickelt, um effizient über alle Datensätze in einer gegebenen Tabelle zu iterieren und eine Geschäftsfrage zu beantworten. Java dagegen war nicht wirklich dafür gedacht. Derzeit durchlaufen Sie die gesamte Tabelle in Java, die nach einer Übereinstimmung sucht. Dies hat folgende Probleme:

  • Eine potenziell enorme Menge an Daten über das Netzwerk wird zwischen der Datenbank und Java-Anwendung übergibt
  • keine Hilfsmittel, wie Indizes, kann während dieser Suche verwendet werden, die sein kann, ineffizient
  • Java wurde nicht wirklich niedriges Niveau Datenbank-Operationen zu tun gebaut, so dass die Menge an Rechenzeit in Ihrer Anwendung ausgegeben leicht die Ressourcen übersteigen könnte, die durch die Datenbank für die gleiche Abfrage benötigt würde. Diese Operation ist eine Ressource Schwein um sicher zu sein.


In Ihrem Fall, da Sie SQL Server verwenden, wird die folgende einzelne Abfrage das gleiche wie Ihre aktuellen Code erreichen sollte:

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

Hier ist ein Code-Schnipsel, die Sie ausprobieren können:

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. 
} 

Wenn die Nummer nicht gefunden, dann der obige Ergebnis Satz wäre leer, und der Anruf an rs.next() würde return false. Auf diese Weise können Sie feststellen, ob Sie den fraglichen Datensatz gefunden haben.

+1

@Aishu Beachten Sie, dass Tim hart codierte Werte in der Abfrage verwendet.Mit PreparedStatements können Sie natürlich verwenden Ersetzungen, um Argumentwerte zu setzen – Fildor

+1

@Fildor Gute Idee –

+0

@Tim - Der obige Code kehrt immer noch zurück true, wenn nicht einmal die Werte in der db gefunden werden – Aishu

0

Sie möchten möglicherweise nicht einige Millionen Zeilen durch eine Abfrage in Ihrer Java-Anwendung abrufen. Ihnen wird wahrscheinlich der Platz ausgehen. Daher wird diese Art der Abfrage nicht empfohlen.

Was können Sie tun, ist, um die gewünschte Telefonnummer senden an die Datenbank-Abfrage in der where Klausel zu finden. Wenn die Anzahl der zurückgegebenen Zeilen Null ist, können Sie false zurückgeben, andernfalls können Sie true zurückgeben. Sie können auch versuchen, nur die erste Zeile aus der Datenbank mit top oder limit abrufen.

Hinweis: Sie können index auf der Telephone Spalte der Tabelle erstellen. Indizes verbessern die Suchleistung. Wenn Sie die TelephoneNumber-Spalte vom Typ number anstelle von varchar beibehalten haben, ist die Verwendung von index noch schneller, da Zahlenvergleiche schneller sind als Textvergleiche. Beachten Sie auch, dass die Verwendung von Indizes mehr Speicherplatz in Ihrer Datenbank beansprucht, also seien Sie vorsichtig bei deren Verwendung.

Verwandte Themen