如何从SQL查询中获取结果大小并检查大小

时间:2012-03-28 23:27:21

标签: java jdbc resultset

您好我正在尝试为一个简单的验证方法编写一段代码作为MVC的一部分。

目前SQL并不是作为预处理语句编写的,所以显然它存在SQL注入的风险,因此任何有关将SQL编写为预准备语句的帮助都会非常有用。

用户模型中的方法。

public boolean getInfo() {

    try {
        DBAccess dbAccess = new DBAccess();

        String sql = "SELECT username, password FROM owner WHERE username = '" + this.username
                + "'AND password = '" + this.password + "';";

        dbAccess.close();dbAccess.executeQuery(sql);
        dbAccess.close();


        return true;
    } catch (Exception e) {
        return false;
    }
}

我想得到SQL查询生成的结果集的大小,如果它的大小为1则返回true,否则为false。

如果您需要更多关于MVC其余部分的信息,我会在这里发布。

4 个答案:

答案 0 :(得分:1)

而是选择字段用户名和密码,您可以选择它们的计数,然后引用该值。

所以你的SQL查询是:

SELECT count(*) FROM owner WHERE username = '" + this.username
            + "'AND password = '" + this.password + "';

这将返回匹配记录的数量,如果number大于0或等于1,则验证它们。

答案 1 :(得分:1)

在不知道DBAccess类的详细信息的情况下,我们无法告诉您如何执行此操作。我猜它会返回一个List(但这只是一个猜测,仅此而已)。如果是这种情况,您可以通过list.size()检查列表的大小,或查看它是否至少返回了!list.isEmpty()的1个结果。当然,如果它不是一个列表,那么这将不起作用。

你肯定需要切换到准备好的语句。有关示例,请参阅this SO post

旁注:如果此方法返回一个指示用户是否存在的布尔值,则不应将其称为getInfo()!像userExists()这样的东西会更有意义。

答案 2 :(得分:1)

只需返回ResultSet#next()的结果,假设UNIQUE上存在username约束。如果没有下一条记录,则返回false

这是一个具体的启动示例,稍微重写以修复潜在的SQL注入攻击漏洞,资源泄漏和线程安全问题,如代码所示。此外,更改的SQL查询应该强制您在保存到DB之前对密码进行MD5哈希(您不希望将密码明文存储在DB中)。

public boolean exist(String username, String password) throws SQLException {
    Connection connection = null;
    PreparedStatement statement = null;
    ResultSet resultSet = null;
    boolean exist = false;

    try {
        connection = database.getConnection();
        statement = connection.prepareStatement("SELECT id FROM owner WHERE username = ? AND password = MD5(?)");
        statement.setString(1, username);
        statement.setString(2, password);
        resultSet = statement.executeQuery();
        exist = resultSet.next();
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
        if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
        if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
    }

    return exist;
}

答案 3 :(得分:0)

关于防止sql注入的问题,如果你想开始使用“ORM like”库,你可以使用myibatis创建预准备语句。 Myibatis是一个数据映射器,您可以从中创建一个相对简单的ORM。随着你越来越勇敢,你可以转向休眠或JPA。

http://www.mybatis.org/