【问题标题】:Java - Efficient way to loop through the database recordsJava - 循环遍历数据库记录的有效方法
【发布时间】:2017-03-06 09:02:40
【问题描述】:

我想验证电话号码是否存在于数据库列中(TelephoneNumber)。如果存在,我将返回 truefalse 此代码不仅用于验证TelephoneNumber 列,还可以验证其他数据库列,例如FirstNameLastNameEmailAddressetc

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

即使在数据库中找不到值,上面的代码也会返回一个真值。不知道我在这里做错了什么。谁能帮帮我

【问题讨论】:

  • 首先,使用“*”不是一个好主意。第二:为什么不使用“WHERE”并让数据库进行查找。使用索引这可能更有效。
  • 我看不出您将如何使用目前给出的代码验证其他列。这是否意味着,您将只为另一个 col 名称使用相同的名称?在这种情况下,所有列都必须是字符串列。数字的呢?另请注意,您可以通过选择适当的排序规则来控制数据库中的区分大小写。
  • 是的,我会将整数转换为字符串,同时将它传递给参数
  • @Fildor:是的,你当然是对的。我只是想强调,不使用“WHERE”不仅是一个坏主意,更像是一场等待发生的灾难。
  • 我猜你必须这样做... + columnName + " = ?;";

标签: java sql-server


【解决方案1】:

我认为您在这里没有正确使用您的数据库。数据库旨在有效地迭代给定表中的所有记录并回答业务问题。另一方面,Java 并不是为此而设计的。目前,您正在 Java 中遍历 整个 表以搜索匹配项。这有以下问题:

  • 可能有大量数据在您的数据库和 Java 应用程序之间通过网络传递
  • 在此搜索过程中不能使用任何辅助工具,例如索引,这可能效率低下
  • Java 并不是真正为执行低级数据库操作而构建的,因此在您的应用程序中花费的计算时间很容易超过数据库执行相同查询所需的资源。可以肯定,此操作会占用大量资源。


在您的情况下,由于您使用的是 SQL Server,因此以下单个查询应该与您当前的代码完成相同的事情:

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

这是一个代码 sn-p,你可以试试:

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。这使您可以确定是否找到了相关记录。

【讨论】:

  • @Aishu 请注意,蒂姆在查询中使用了硬编码值。使用 PreparedStatements,您当然可以使用替换来设置参数值。
  • @Fildor 好主意
  • @Tim - 如果在 db 中找不到值,上述代码仍然返回 true
  • @ Tim - 你能告诉我我在这里做错了什么......不确定
  • 这不是在这里获得帮助的方式。如果你想改变你的方法,尝试一些东西,然后提出一个新问题。我不能/不会像这样通过 cmets 调试您的代码。
【解决方案2】:

您可能不想通过 Java 应用程序中的查询获取数百万行。你很可能会用完空间。所以不推荐这种查询方式。

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

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

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2019-04-27
    • 2021-01-27
    相关资源
    最近更新 更多