1

假设我有一个表(登录),其中包含用户名(唯一密钥)和密码,用于登录目的。

现在,在注册模块中(通过在登录表中添加一个新行来创建一个新帐户),如果我只执行插入并在 SQLException() 引发时检查用户名是否已经在表中,可以吗? . 这是一个好习惯吗???

这是注册模块的示例:

enter code here
String uname = request.getParameter("username");
String passwd = request.getParameter("password");
try
{
  statement.executeUpdate("insert into login(username,password) values (" + uname + "," + passwd + ")");
}
catch(SQLException e)
{
   if((e.getErrorCode())==1) //error code when primary key violated
   {
      // username already exists....
   }    
   //some other code
 }

 //username is available....rest of the code goes here

首先,我想到了一个选择查询来检查用户名(用户在注册时输入)是否已经在表中......但这对我来说似乎是多余的

因为我认为,即使这样做也不会阻止 DBMS 检查唯一性违规,对吗????

提前致谢。

4

2 回答 2

1

我建议在插入之前进行验证,以防您更改底层数据库,从而更改SQLException.getErrorCode()中的错误代码。这也使您能够在用户提交表单之前进行验证。您可以创建一个自定义异常,通知您的服务调用者用户名已在使用中。

检索此 SQLException 对象的特定于供应商的异常代码。

SELECT COUNT(*) FROM LOGIN WHERE USERNAME = :username

通过服务方法,例如:

public class UserService {

    public boolean isValidUsername(String username) {
        //validate
    }
    public void registerUser(User user) throws UsernameInUseException {
        if(!isValidUsername(user.getUsername()) {
            throw new UsernameInUseException("Usernaame " + user.getUsername() + " is already in use.");
        }
        // continue
    }

}
于 2012-05-17T06:03:39.997 回答
0

如果您可以在提交表单之前使用 AJAX 调用告诉用户用户名已经存在,那将会很酷。

于 2012-05-17T06:05:15.550 回答