【问题标题】:Inserting into database with auto increment自动增量插入数据库
【发布时间】:2014-06-09 11:55:59
【问题描述】:

我需要使用准备好的语句将一些值存储到我的表中。

我的表中有一个名为 id 的列,它被设置为自动递增。我不需要用户对此专栏的任何输入。

其他值均来自用户。

编辑:有 2 个 ID。一个来自用户,一个是从数据库自动生成的。数据库自动生成的就是主键。

我这样做对吗?

谢谢。

准备好的声明:

DELIMITER $$

CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_details`(IN id varchar(45),IN username varchar(45),IN name varchar(45)) 

BEGIN insert into details (id,username,name) values (id ,username,name);

END

代码:

PreparedStatement preparedStatement = connect.prepareStatement("CALL INSERT_DETAILS(?,?,?)");
preparedStatement.setLong(1, userID);
preparedStatement.setString(2, username);
preparedStatement.setString(3, name);

preparedStatement .executeUpdate();

【问题讨论】:

  • 这里有使用存储过程的理由吗?你能简单地改用connect.prepareStatement("INSERT INTO details(id, username, name) VALUES (?, ?, ?)"); 吗?
  • 可以,但存储过程不是更安全吗?
  • 并非如此。在这种情况下,通过使用准备好的语句来清理输入数据并防止注入攻击来提供安全性。存储过程通常保留用于整合多个客户端可能使用的逻辑。
  • String sql = "INSERT INTO details (id, username, name)" +"VALUES (?, ?, ?)"; statement.executeUpdate(sql);
  • 这样对吗?

标签: java mysql


【解决方案1】:

从准备好的语句中删除 id 字段。

因为它会与字段数据冲突,所以可能会出现问题。

【讨论】:

  • 对不起,我忘了说,有 2 个 ID。一份来自用户,一份来自数据库。数据库自动生成的就是主键。
【解决方案2】:

您可以简单地从准备好的语句中省略自动生成的字段,因为 MySQL 会为您设置此值。在您的示例中,您的参数名称与表属性名称冲突。我遵循的约定是在参数名称前加上 p_ 或类似的名称修饰。

准备好的语句应该类似于以下内容:

DELIMITER $$
CREATE
  DEFINER=`root`@`localhost`
PROCEDURE `insert_details`(
  IN p_user_id VARCHAR(45),
  IN p_username VARCHAR(45),
  IN p_name VARCHAR(45))
BEGIN
  INSERT
    INTO details(id, username, name)
    VALUES (p_user_id, p_username, p_name);
END $$

【讨论】:

  • 对不起,我忘了说,有 2 个 ID。一份来自用户,一份来自数据库。数据库自动生成的就是主键。
猜你喜欢
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多