【问题标题】:How to insert date into a mysql database from a jsp page?如何从jsp页面将日期插入mysql数据库?
【发布时间】:2015-07-12 09:47:36
【问题描述】:

我正在尝试将数据插入 MySQL 数据库,其中一列获取当前日期。

代码是

unit=request.getParameter("unit");
name=request.getParameter("name");
article=request.getParameter("article");
String user=request.getParameter("username");
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/newsletter?", "root", "pooja");
Statement st = conn.createStatement();

String query="insert into browse values('"+0+"','"+name+"', '"+NOW()+"', '"+article+"', '"+unit+"', '"+user+"' );";
ResultSet rs = st.executeQuery(query);

代码在 NOW() 处引发错误,说明方法未定义。 我可以在此代码本身中进行任何更正,还是有其他方法可以将当前日期输入数据库?

提前致谢。

【问题讨论】:

    标签: java mysql database jsp date


    【解决方案1】:

    now() 函数是 MySQL 函数,而不是 Java 方法调用。因此它应该是 SQL 文本的一部分,而不是字符串。

    something 是返回字符串的Java 表达式 时,添加类似"'" + something + "'" 的内容是正确的。如果something 包含“foo”,则结果为'foo',这是一个有效的 SQL 字符串。

    但是NOW() 不是Java 表达式。它也不意味着是 SQL 中的文字字符串。所以你不需要引号。相反,你应该有类似+",NOW(),"+ 的东西。

    String query="insert into browse values('0','"+name+"', NOW(), '"+article+"', '"+unit+"', '"+user+"' );";
    

    建议使用PreparedStatement 而不是语句,并且不要以这种方式嵌入字符串。然后 NOW() 将成为 SQL 语句的一部分,字符串将被替换为 ?

    String query="insert into browse values('0',?,NOW(),?,?,?)";
    PreparedStatement stmt = conn.prepareStatement(query);
    stmt.setString(1, name);
    stmt.setString(2, article);
    stmt.setString(3, unit);
    stmt.setString(4, user);
    int inserted = stmt.executeUpdate();
    

    【讨论】:

    • 谢谢 :) 这对 xD 有帮助
    【解决方案2】:

    您确实在调用未定义的 Java 方法 NOW(),并将此 Java 方法的结果传递给查询。您想要的是调用名为NOW()数据库函数 的查询。所以对NOW() 的调用必须是查询本身的一部分:

    String query = "insert into browse values(?, ?, NOW(), ?, ?, ?)";
    

    你会问这些问号是什么。这些是允许使用prepared statement安全传递参数的占位符。如果您坚持使用字符串连接来传递参数,您的代码将受到SQL injection 攻击,只要任何参数包含单引号,它就会失败,并且您将努力插入字符串和数字以外的任何内容(即日期、二进制数据等)。所以学习使用准备好的语句。

    另外,executeQuery() 用于执行选择查询,在 ResultSet 中返回数据。要执行插入查询,您必须使用executeUpdate()

    【讨论】:

      【解决方案3】:

      java.util.Date now = new java.util.Date();

      请记住,变量 'now' 的类型是 Date。 您必须对其进行修改以适应您的 DB-> 列类型

      【讨论】:

        【解决方案4】:

        如果您使用 TIMESTAMP 类型,则在您更新表时会自动插入日期。这当然会使时间和日期无效,如果您只需要日期,那么只需创建一个新的 Date 对象。此外,您应该真正使用 PreparedStatements 来防止基于 MySQL 注入的攻击。

        【讨论】:

          猜你喜欢
          • 2021-08-31
          • 2016-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-29
          • 2013-04-27
          相关资源
          最近更新 更多