检查用户是否存在的最佳方法是什么
我已经写了这段代码
try{
PreparedStatment mPre=conn.preparedStatement(INSERT INTO TABLE VALUES(?,?);
}catch(Exception e)
{
if(e.getMessage().contains("Dublicated"))
{
throw new Exception("user is exist");
}
}finally {
mPre.close();
conn.close();
}
我的朋友告诉我这是愚蠢的查询 我应该这样做
Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery("SELECT COUNT(*) AS total FROM .......");
int cnt = rs.getInt("total");
答案 0 :(得分:0)
你的朋友是对的。您可以通过查询检查行是否存在:
SELECT EXISTS(SELECT 1 FROM *table* WHERE *something*)
答案 1 :(得分:0)
当您尝试验证用户表中是否存在给定的用户名和密码时,您应该使用PreparedStatment,因为它可以帮助您保护应用程序免受SQL注入。
<强>但是强>
将新用户插入数据库不是进行用户验证的正确方法。
您可以执行以下示例:
String selectSQL = "SELECT * FROM USER_TABLE WHERE USER_ID = ? AND PASSWORD = ?";
PreparedStatement preparedStatement = dbConnection.prepareStatement(selectSQL);
preparedStatement.setInt(1, 1001);
preparedStatement.setString(2, "1234");
ResultSet rs = preparedStatement.executeQuery(selectSQL );
while (rs.next()) {
//You will need user information to render dashborad of your web application
String userid = rs.getString("USER_ID");
String username = rs.getString("USERNAME");
}
完整代码参考:http://www.mkyong.com/jdbc/jdbc-preparestatement-example-select-list-of-the-records/
答案 2 :(得分:0)
只要您尝试插入一个破坏数据库表的唯一主键约束的行,并且抛出的异常具有包含单词&#34; duplicated&#34;的堆栈跟踪。那么你的代码应该可以正常工作
但是,如果堆栈跟踪发生变化并且不包含该单词,那么您的代码将不再适用。
您更有可能尝试插入具有唯一主键值但具有现有用户名的行,这不会给您带来您希望的错误。这就是为什么检索该用户名的结果并计算有多少结果会更聪明/更安全的原因。