如何检查(java)我的数据库(postgres)中是否已存在用户名?

时间:2015-10-24 17:42:00

标签: java postgresql rmi

我有一个客户端,一个服务器,一个RMI服务器和一个PostgreSQL数据库。 我正在创建一个新用户,所以我自然想检查我的数据库中是否已存在该用户名。所以这就是我在做的事情:

  • 对我想要创建的用户名进行SELECT查询
  • 如果我的RequestSet为null,则表示数据库返回的表为空,因此没有任何具有该用户名的用户,我可以创建新用户。
  • 它不是空的,我无法创建新用户。

但是,每当我尝试插入一个新用户时,无论它是否存在于DB中,它总是说用户已经存在......

这是我在RMI服务器中使用的代码:

String[] userInfo = (String[]) clrqst.getRequest()[1];

    clrqst.setStage(2);
    myRequests.add(clrqst);

    try
    {
        query = "SELECT * FROM utilizador WHERE username= '"+userInfo[2]+"'";
        request = connection.createStatement();
        rs = request.executeQuery(query);

        if (rs == null)
        {
            try {
                query = "INSERT INTO utilizador (nome, apelido, username, pass, saldo) VALUES (?,?,?,?,?)";
                preparedstatement = connection.prepareStatement(query);
                preparedstatement.setString(1, userInfo[0]);
                preparedstatement.setString(2, userInfo[1]);
                preparedstatement.setString(3, userInfo[2]);
                preparedstatement.setString(4, userInfo[3]);
                preparedstatement.setInt(5, 100);
                preparedstatement.executeUpdate();

            } catch (SQLException e) {
                System.err.println("SQLException:" + e);
            }

            try {
                query = "SELECT id FROM utilizador WHERE username='" + userInfo[0] + "'";
                request = connection.createStatement();
                rs = request.executeQuery(query);

                rs.next();
                resposta[0] = "infosave";
                resposta[1] = rs.getInt(1);

                clrqst.setResponse(resposta);
                clrqst.setStage(3);

                updateRequest(clrqst);

            } catch (SQLException ex) {
                System.err.println("Erro:" + ex);
            } finally {
                if (request != null) {
                    try {
                        request.close();
                    } catch (SQLException ex) {
                        Logger.getLogger(RMIServer.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        }

        else{
            resposta[0] = "user_already_exists";
            resposta[1] = userInfo[2];
            clrqst.setResponse(resposta);
            clrqst.setStage(3);
        }

    }  catch (SQLException e) {
        System.err.println("SQLException:" + e);
    }


    return clrqst;

我无法弄清楚我做错了什么。有人能指出我正确的方向吗? 谢谢!

1 个答案:

答案 0 :(得分:3)

查询返回结果集。结果集只是......一组。即使是空集仍然是一套。你想知道的是"连续返回?"。假设username列是唯一的(公平假设),您的查询将返回0或1行的结果集。

rs.next()方法前进到下一行(起始位置在第一行之前)。如果有要前进的行,则返回true;如果结果集中的行用尽,则返回false。

由于您只需要知道是否有1行回来,您的解决方案就像调用rs.next()并检查结果集一样简单。

rs = request.executeQuery(query);
if (!rs.next())
{
    // Insert the new user.