Java - 循环访问数据库记录的有效方法

Java - 循环访问数据库记录的有效方法

问题描述:

我想验证电话号码是否存在于数据库列(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

我想你没有在这里正确使用你的数据库。数据库旨在有效地遍历给定表中的所有记录并回答业务问题。另一方面,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

您可能不想在您的Java应用程序中通过查询获取数百万行。你很可能会用尽空间。因此,不建议这种查询。

您可以做的是,将所需的电话号码发送到where子句中的数据库查询。如果返回的行数为零,那么您可能会返回false否则您可能会返回true。您也可以尝试仅使用toplimit从数据库获取第一行。

注意:您可以在表格的TelephoneNumber列上创建index。索引提高了搜索性能。如果您保留number类型的TelephoneNumber列而不是varchar,那么使用索引会更快,因为数字比较比文本比较快。另请注意,使用索引会在数据库上占用更多空间,因此请小心使用它们。