我正在尝试将数据插入到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()处抛出错误,说该方法未定义。 我可以在此代码中进行任何更正,还是有其他方法可以将当前日期输入数据库?
提前致谢。
答案 0 :(得分: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();
答案 1 :(得分:1)
您确实在调用未定义的Java方法NOW()
,并将此Java方法的结果传递给查询。您想要的是调用名为NOW()
的数据库函数的查询。因此,对NOW()
的调用必须是查询本身的一部分:
String query = "insert into browse values(?, ?, NOW(), ?, ?, ?)";
你会问,这些问号是什么?这些是占位符,允许使用prepared statement传递参数安全。如果你坚持使用字符串连接来传递参数,你的代码将受到SQL injection攻击,一旦任何参数包含单引号就会失败,你将争取插入除字符串和数字之外的任何东西(即日期,二进制数据等)。所以学习使用准备好的陈述。
此外,executeQuery()
用于执行select查询,返回ResultSet中的数据。要执行插入查询,您必须使用executeUpdate()
。
答案 2 :(得分:0)
java.util.Date now = new java.util.Date();
请记住变量'现在'是Date类型。 你必须修改它以适应你的DB->列类型
答案 3 :(得分:0)
如果使用TIMESTAMP类型,则在更新表时将自动插入日期。这当然是惰性时间和日期,如果您只需要日期,那么只需创建一个新的Date对象。您还应该使用PreparedStatements来防止基于MySQL注入的攻击。