在java中向表插入值

在java中向表插入值,java,database,postgresql,sql-insert,psql,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,

我正在尝试将值插入我的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);
注意-我尝试了以下操作,但没有帮助:

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

    org.postgresql.util.psqleexception:启用自动提交时无法提交


    • 我马上阻止你。永远不要使用简单的字符串连接生成任何数据操作SQL语句。即使在练习中也不行,因为如果你习惯了,你会遇到一些棘手的问题,从SQL注入开始。使用相应的方法。在您的情况下,如下所示:

      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()
      
      请注意,我实际上并没有编译代码,您可能需要修改某些内容。另外,我假设您只处理文本数据。 另见:

      除了防止SQL注入攻击和一些更安全的类型之外,您可能不会像现在这样经常遇到bug。通过手动创建语句,您可以轻松地生成一条语句,该语句将执行某些操作,但不是您所期望的。在最好的情况下,它将是什么,在最坏的情况下,您只是删除了一个生产数据库

      我甚至连表演都不碰。准备好的语句(取决于数据库,但通常)包括某种预编译


      编辑:事实上,我延迟了一段时间才注意到(在编辑我自己的错误时,因为在阅读代码时计算错误),您在原始代码中将
      “value4”
      “value5”
      写成了文字,而不是变量(注意双引号)。其他人也注意到了
      value1
      value2
      的类似问题。这只是为了说明手动连接任何东西(而不仅仅是SQL)是多么麻烦和容易出错

      我马上阻止你。永远不要使用简单的字符串连接生成任何数据操作SQL语句。即使在练习中也不行,因为如果你习惯了,你会遇到一些棘手的问题,从SQL注入开始。使用相应的方法。在您的情况下,如下所示:

      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()
      
      请注意,我实际上并没有编译代码,您可能需要修改某些内容。另外,我假设您只处理文本数据。 另见:

      除了防止SQL注入攻击和一些更安全的类型之外,您可能不会像现在这样经常遇到bug。通过手动创建语句,您可以轻松地生成一条语句,该语句将执行某些操作,但不是您所期望的。在最好的情况下,它将是什么,在最坏的情况下,您只是删除了一个生产数据库

      我甚至连表演都不碰。准备好的语句(取决于数据库,但通常)包括某种预编译


      编辑:事实上,我延迟了一段时间才注意到(在编辑我自己的错误时,因为在阅读代码时计算错误),您在原始代码中将
      “value4”
      “value5”
      写成了文字,而不是变量(注意双引号)。其他人也注意到了
      value1
      value2
      的类似问题。这只是为了说明手动连接任何东西(而不仅仅是SQL)是多么麻烦和容易出错

      它可能正在抛出一个异常,而您正在
      捕获中忽略它。请显示更多的代码。我不知道值的类型是什么,但是时间戳值,因为您使用的是普通语句而不是准备好的语句,应该被引用,但不是。SQL中的引号是单引号-双引号仅放在区分大小写的标识符周围。因此,
      value1
      value2
      的引号也不正确。SQL对字符串文本使用单引号,对标识符(如表名和列名)使用双引号。但实际上,
      PreparedStatement
      是唯一明智的方法。我当然想知道我的回答是否有任何积极影响:)。它可能引发了异常,而您在
      捕获中忽略了它。请显示更多的代码。我不知道值的类型是什么,但是时间戳值,因为您使用的是普通语句而不是准备好的语句,应该被引用,但不是。SQL中的引号是单引号-双引号仅放在区分大小写的标识符周围。因此,
      value1
      value2
      的引号也不正确。SQL对字符串文本使用单引号,对标识符(如表名和列名)使用双引号。但实际上,
      PreparedStatement
      是唯一明智的方法。我当然想知道我的回答是否有积极的影响:)。是的。我更注重实质而不是形式。谢谢,真的。我更注重实质而不是形式。谢谢