在java中将值INSERT到TABLE

时间:2016-08-11 21:05:04

标签: java database postgresql sql-insert psql

我正在尝试将值插入我的postgres数据库

url:"jdbc:postgresql://"+SERVER_NAME+":"+PORT_NUMBER+"/"+DATABSE_NAME,DATABASE_UN,DATABASE_PASS

我能够从数据库中读取。 但是当我写入数据库(没有例外)时,没有向postgres数据库插入行:

                sqlQuery = "INSERT INTO tmp_recommend (id, v1, v2, v3, timestamp, v4, v5) VALUES("
                        + "\""+ID+"\", "
                                + "\""+value1+"\", "
                                + "\""+value2+"\", "
                                + value3+", "
                                + new Timestamp((new Date().getTime()))+", "
                                + "\"value4\", "
                                + "\"value5\" "
                                + ")";
                st.executeUpdate(sqlQuery);

注意 - 我尝试了以下但没有帮助:

  • 更改数据库的autocommit设置
  • 如果我尝试通过conn.commit()进行手动提交,则会抛出异常

    org.postgresql.util.PSQLException:启用autoCommit时无法提交

1 个答案:

答案 0 :(得分:3)

我马上就会阻止你。永远不会使用简单的字符串连接生成任何数据操作SQL语句。甚至在运动中也没有,因为如果你习惯它,你会有一些讨厌的问题,从SQL注入开始。相应地使用PreparedStatement。在你的情况下,像这样:

PreparedStatement st = conn.prepareStatement("INSERT INTO tmp_recommend (id, v1, v2, v3, timestamp, v4, v5) VALUES(?, ?, ?, ?, ?, ?, ?)");
st.setString(1, ID);
st.setString(2, value1);
st.setString(3, value2);
st.setString(4, value3);
st.setDate(5, new Timestamp((new Date().getTime())));
st.setString(6, value4);
st.setString(7, value5);
st.executeUpdate()

请注意,我实际上并没有编译代码,您可能需要修改一些内容。另外,我假设你只使用文本数据。 另请参阅:How does a PreparedStatement avoid or prevent SQL injection?

除了防止SQL注入攻击和更多类型安全之外,您可能不会遇到像现在这样经常出现的错误。通过手动创建语句,您可以轻松地创建一个可以执行某些操作但不符合您预期的语句。在最好的情况下,没有什么,最糟糕的是,你只是放弃了一个生产数据库。

我甚至没有触及表演。准备好的语句(取决于数据库,但通常)包括某种预编译。

修改:我实际注意到你在原版中写了"value4""value5"时出现延迟(编辑我自己的错误,因为在阅读代码时计算错误)代码作为文字,而不是变量(注意双引号)。其他人注意到value1value2存在类似问题。这只表明手动连接任何东西是多么麻烦和容易出错,而不仅仅是SQL。