JDBC:UserID作为主键,在Java代码中增加

时间:2014-06-21 02:19:55

标签: java mysql sql jdbc

与我的上一个问题相关:Java SQL (JDBC) : how to move to the next column?

我有一个包含少量列的SQL表,其中一列是" UserID"这是PK和AI

代码是做什么的? : 1.从用户那里获取用户名,电子邮件和密码。 2.检查表中是否已存在用户名或电子邮件。 3.如果表中没有用户和电子邮件,我会在表格中插入用户名,电子邮件和密码。

然而,当我进行插入时,我仍然需要插入UserID

因为我现在无法运行我的代码,因为我遇到了Workbench MySQL的问题,我只是想知道这段代码是否有效:

        /* checks that last UserID in the Table */
        String command = "SELECT UserID FROM users";
        resultSet = statement.executeQuery(command);

        resultSet.last();
        id = resultSet.getInt("UserID") + 1;

然后当我使用 INSERT 查询时:

command = "INSERT users SET UserID = '" + id + "', UserName = '" + usr.toString()
                    + "',Email = '" + eml.toString()
                    + "',Password = '" + pwd.toString()
                    + "',Status = '0' ,Connected = '1';";
            statement.executeUpdate(command);
你觉得怎么样?

这是我的整个班级:

    import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

公共类DB {

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;
}

}

2 个答案:

答案 0 :(得分:1)

此代码存在许多问题:

  1. 您的SELECT语句正在选择整个用户表。可能不是一个好主意。 如果您从用户的表中进行选择,您可能应该有一个" WHERE"或者"限制"某处。
  2. 目前还不清楚为什么要在用户名中加1(应该添加评论)。
  3. 您的INSERT语句似乎在语法上略有偏差(参见文档......" SET"用于" UPDATE&#34 ;, INSERT语句看起来更像" INSERT INTO ...&#34)
  4. 创建新用户条目时,您可能不应显式设置UserID。相反,您应该使该列自动递增,然后在INSERT语句中省略它,依赖于表的声明来使值自动计算和设置。
  5. 您将密码直接存储在用户的表格中。如果您要存储密码,至少要对其进行加密(或者,更好的是,只存储密码的盐渍哈希,不能从中重建密码)。然而,更好的是,如果你使用OAuth,那就更好了。
  6. 您需要转义用户提供的字段(如某些评论中所述,准备好的语句是这样的方法)。

答案 1 :(得分:1)

您可以更改表格结构以自动增加UserID。

否则,您可以将ID值设为 SELECT max(UserID)+1 FROM users

由于它是用户凭据,而不是以纯文本形式建议在DB中加密它们