如果我的数据库 (postgres) 中已经存在用户名,我该如何检查 (java)?
How can I check (java) if an username already exists in my Data Base(postgres)?
我有一个客户端、一个服务器、一个 RMI 服务器和一个 PostgreSQL 数据库。
我正在创建一个新用户,所以我自然想检查该用户名是否已存在于我的数据库中。这就是我正在做的事情:
- SELECT 查询我要创建的用户名
- 如果我的 RequestSet 为空,这意味着数据库 returns 的 table 为空,因此没有任何用户使用该用户名,我可以创建一个新用户。
- 不为空,无法创建新用户
但是,每当我尝试插入一个新用户时,无论它是否存在于数据库中,它总是说该用户已经存在...
这是我在 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;
我不知道我做错了什么。有人能指出我正确的方向吗?
谢谢!
一个查询return是一个结果集。结果集就是……一个集合。即使一个空集仍然是一个集。你想知道的是"did a row return?"。假设 username
列是唯一的(一个合理的假设),您的查询将 return 具有 0 或 1 行的结果集。
rs.next
() 方法前进到下一行(起始位置在第一行之前)。如果有要前进的行,则 return 为真,如果结果集中 运行 行之外,则为假。
由于您只需要知道 1 行是否返回,您的解决方案可以像调用 rs.next()
并检查结果集一样简单。
rs = request.executeQuery(query);
if (!rs.next())
{
// Insert the new user.
我有一个客户端、一个服务器、一个 RMI 服务器和一个 PostgreSQL 数据库。 我正在创建一个新用户,所以我自然想检查该用户名是否已存在于我的数据库中。这就是我正在做的事情:
- SELECT 查询我要创建的用户名
- 如果我的 RequestSet 为空,这意味着数据库 returns 的 table 为空,因此没有任何用户使用该用户名,我可以创建一个新用户。
- 不为空,无法创建新用户
但是,每当我尝试插入一个新用户时,无论它是否存在于数据库中,它总是说该用户已经存在...
这是我在 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;
我不知道我做错了什么。有人能指出我正确的方向吗? 谢谢!
一个查询return是一个结果集。结果集就是……一个集合。即使一个空集仍然是一个集。你想知道的是"did a row return?"。假设 username
列是唯一的(一个合理的假设),您的查询将 return 具有 0 或 1 行的结果集。
rs.next
() 方法前进到下一行(起始位置在第一行之前)。如果有要前进的行,则 return 为真,如果结果集中 运行 行之外,则为假。
由于您只需要知道 1 行是否返回,您的解决方案可以像调用 rs.next()
并检查结果集一样简单。
rs = request.executeQuery(query);
if (!rs.next())
{
// Insert the new user.