【发布时间】: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);
-
这样对吗?