JDBC:用户ID作为主键,在Java代码中增加
关于我的最后一个问题: 我有一个SQL表,包含几个列,其中一列是UserID,它是PK和AI 代码的作用是什么 1.从用户处获取用户名、电子邮件和密码。 2.检查表中是否已存在用户名或电子邮件。 3.如果表中既不存在用户也不存在电子邮件,我将在表中插入用户名、电子邮件和密码 但是,当我插入时,我仍然需要插入一个用户ID 因为工作台MySQL有问题,所以我现在无法运行代码,所以我只想知道这段代码是否有效: 然后当我使用INSERT查询时: 你觉得怎么样 这是我的全班:JDBC:用户ID作为主键,在Java代码中增加,java,mysql,sql,jdbc,Java,Mysql,Sql,Jdbc,关于我的最后一个问题: 我有一个SQL表,包含几个列,其中一列是UserID,它是PK和AI 代码的作用是什么 1.从用户处获取用户名、电子邮件和密码。 2.检查表中是否已存在用户名或电子邮件。 3.如果表中既不存在用户也不存在电子邮件,我将在表中插入用户名、电子邮件和密码 但是,当我插入时,我仍然需要插入一个用户ID 因为工作台MySQL有问题,所以我现在无法运行代码,所以我只想知道这段代码是否有效: 然后当我使用INSERT查询时: 你觉得怎么样 这是我的全班: import jav
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
公共类数据库{
private String usr;
private String eml;
private String pwd;
private int id = 0;
private ResultSet resultSet;
private Statement statement;
private Connection connection;
String jdbcUrl = "jdbc:mysql://localhost:3306/registered";
String jdbcUser = "...";
String jdbcPassword = "...";
int flag = 0;
public boolean checkSignUp(String usr, String eml, String pwd) {
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(jdbcUrl, jdbcUser,
jdbcPassword);
statement = connection.createStatement();
/* checks that last UserID in the Table */
String command = "SELECT UserID FROM users";
resultSet = statement.executeQuery(command);
resultSet.last();
id = resultSet.getInt("UserID") + 1;
/* runs over the UserName column */
command = "SELECT UserName FROM users WHERE UserName LIKE '"
+ usr.toString() + "';";
resultSet = statement.executeQuery(command);
while (resultSet.next()) {
if (usr.equalsIgnoreCase(resultSet.getString("UserName"))) {
System.out.println("UserName : " + usr.toString() + " is taken!");
flag++;
}
}
/* runs over the Email column */
command = "SELECT Email FROM users WHERE UserName LIKE '"
+ usr.toString() + "';";
resultSet = statement.executeQuery(command);
while (resultSet.next()) {
if (eml.equalsIgnoreCase(resultSet.getString("Email"))) {
System.out.println("Email : " + this.eml + " is taken!");
flag +=2;
}
}
/* if user\email exists or not */
if (flag == 0) {
System.out.println("Email : " + this.eml + " and UserName : "
+ usr + " are AVAILABLE!");
command = "INSERT users SET UserID = '" + id + "', UserName = '" + usr.toString()
+ "',Email = '" + eml.toString()
+ "',Password = '" + pwd.toString()
+ "',Status = '0' ,Connected = '1';";
statement.executeUpdate(command);
return true;
}
else if (flag == 1) {
//show error message
}
else if (flag == 2) {
//show error message
}
else if (flag == 3) {
}
} catch (SQLException e) {
System.out.println("SQLException: " + e.getMessage());
System.out.println("Vendor error: " + e.getErrorCode());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
flag = 0;
return false;
}
}此代码存在许多问题: SELECT语句正在选择整个users表。可能不是个好主意。 如果您是从用户表中选择的,您可能应该在某个地方有一个WHERE或LIMIT。 不清楚为什么要在用户ID中添加1,可能需要添加注释。 您的INSERT语句在语法上似乎有点偏离。请参阅文档。。。SET用于更新,INSERT语句看起来更像INSERT INTO。。。。 创建新用户条目时,可能不应该显式设置UserID。相反,您应该使该列自动递增,然后在INSERT语句中忽略它,这依赖于表的声明,从而导致自动计算和设置该值。 您正在将密码直接存储到用户的表中。如果要存储密码,至少要对其进行加密,或者更好的是,只存储密码的salt散列,而不存储任何可以重构密码的内容。然而,如果您使用OAuth,则更好。 您需要转义一些注释中提到的用户提供的字段,准备好的语句就是这样做的方法。 您可以更改表结构以自动增加用户ID 否则,您可以从用户处获取id值为SELECT maxUserID+1
由于它是用户凭据,而不是纯文本,建议在DB中加密它们从用户中选择用户ID按用户ID顺序描述限制1将确保从数据库返回最大的用户ID,不需要从数据库中查询每个用户ID并获取最大的用户ID。而且SQL很容易受到注入攻击。尝试使用for update。如果是自动递增列,则不需要为该列提供值。这可能导致两个相互竞争的线程为PK插入相同的值。Insert应该更多地采用Insert into[table]{column{,column…}}values…@SAIEMAHMED的格式,在SELECT UserID from users ORDER BY UserID DESC LIMIT 1 int id=resultSet.getIntUserID+1@所以它应该是,。。。在用户中插入用户名、用户名、电子邮件,。。值id,usr,eml,pwd,…我将1添加到UserID中,因为当我插入新行时,我希望它在最后一行之后有一个新的UserIDUserID@user3651124使用4,在声明表时,可以将某些列配置为在插入时自动设置。例如,数值可以自动递增,也就是说,每次插入都会将该值设置为比先前插入的记录的值多一个值。类似地,日期可以配置为在插入时初始化为当前时间,也可以配置为在更新时再次更新,这对于跟踪上次修改的时间很有用。@user3651124和5,基本上存储密码是不安全的。最好不要存储它们,甚至不要向用户索要它们。相反,您应该使用OAuth,它允许用户使用自己选择的身份提供商(如Google)登录。然后,您将存储一个OAuth标识符而不是密码,。。值id、usr、eml、pwd等,。。。必须没有用户ID。。身份证件
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
private String usr;
private String eml;
private String pwd;
private int id = 0;
private ResultSet resultSet;
private Statement statement;
private Connection connection;
String jdbcUrl = "jdbc:mysql://localhost:3306/registered";
String jdbcUser = "...";
String jdbcPassword = "...";
int flag = 0;
public boolean checkSignUp(String usr, String eml, String pwd) {
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(jdbcUrl, jdbcUser,
jdbcPassword);
statement = connection.createStatement();
/* checks that last UserID in the Table */
String command = "SELECT UserID FROM users";
resultSet = statement.executeQuery(command);
resultSet.last();
id = resultSet.getInt("UserID") + 1;
/* runs over the UserName column */
command = "SELECT UserName FROM users WHERE UserName LIKE '"
+ usr.toString() + "';";
resultSet = statement.executeQuery(command);
while (resultSet.next()) {
if (usr.equalsIgnoreCase(resultSet.getString("UserName"))) {
System.out.println("UserName : " + usr.toString() + " is taken!");
flag++;
}
}
/* runs over the Email column */
command = "SELECT Email FROM users WHERE UserName LIKE '"
+ usr.toString() + "';";
resultSet = statement.executeQuery(command);
while (resultSet.next()) {
if (eml.equalsIgnoreCase(resultSet.getString("Email"))) {
System.out.println("Email : " + this.eml + " is taken!");
flag +=2;
}
}
/* if user\email exists or not */
if (flag == 0) {
System.out.println("Email : " + this.eml + " and UserName : "
+ usr + " are AVAILABLE!");
command = "INSERT users SET UserID = '" + id + "', UserName = '" + usr.toString()
+ "',Email = '" + eml.toString()
+ "',Password = '" + pwd.toString()
+ "',Status = '0' ,Connected = '1';";
statement.executeUpdate(command);
return true;
}
else if (flag == 1) {
//show error message
}
else if (flag == 2) {
//show error message
}
else if (flag == 3) {
}
} catch (SQLException e) {
System.out.println("SQLException: " + e.getMessage());
System.out.println("Vendor error: " + e.getErrorCode());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
flag = 0;
return false;
}