如何在Java中将日期插入MySQL数据库表?

3

如何将日期(不带时间)插入到MySQL数据库表中? 我尝试了以下代码,但是出现以下异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Mar 05 00:00:00 GMT-08:00 2014,1,1)' at line 1

注意:在MySQL表中,我选择了日期数据类型作为此列的数据类型。

String Date = "\\d\\d\\d\\d\\D[0-1][0-9]\\D[0-3][0-9]";
while (DateMatcher.find())  {   
    String date = DateMatcher.group().trim();

    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    Date myDate = formatter.parse(date);

    db.insert_date(myDate,2,1);           
}

我遇到的问题只涉及日期部分 插入日期的查询语句:

// insert DATE
public void insert_date(Date  date_str, int sentence_id ,int document_id ){
       // Statements allow to issue SQL queries to the database

    try {
        statement = connect.createStatement();

        System.out.println(  "insert into Date(date_Str,Sen_id,doc_id) " +
                 " values(" + date_str + "," +  sentence_id + "," + document_id +  ")"
                 );


        statement.executeUpdate(

         "insert into test.Date(date,Sen_id,doc_id)" +
         " values(" + date_str + "," +  sentence_id + "," + document_id + ")"
          );
    }
    catch(Exception e ){System.out.println(e);};
    // Result set get the result of the SQL query

}

为什么不使用MySQL日期数据类型(http://dev.mysql.com/doc/refman/5.0/en/date-and-time-types.html),并将列配置为默认值呢? - Micha Wiedenmann
检查你的查询语法,有些地方出错了。发布你的查询代码。 - Lakshmi
亲爱的N.B,我已经阅读并尝试了,但是没有得到正确的结果。 - Freeman
1
还可以尝试用单引号将日期字符串“date_str”括起来。 - Raza
亲爱的 Raza,现在我可以将'Thu Feb 02 00:00:00 GMT-08:00 2012'插入到MSQL表中,但是我该如何将这种类型转换为类似于05-05-2012的格式? - Freeman
显示剩余4条评论
2个回答

11
首先,在Java中将java.util.Date持久化到数据库中,您需要将其转换为java.sql.Date。有利的是,JDBC SQL Date是Java Date的子类。
因此,要从java.util.Date创建java.sql.Date,您需要执行以下操作:
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date myDate = formatter.parse(date);
java.sql.Date sqlDate = new java.sql.Date(myDate.getTime());

db.insert_date(sqlDate);

确保db.insert_date仅接受java.sql.Date

在调用PreparedStatement.setDate()函数时需要注意。

请参阅相关问题:java.util.Date vs java.sql.Date


我该如何转换这种日期格式(Wed Mar 05 00:00:00 GMT-08:00 2014),因为在读取日期时它会被转换为它们的类型,我该如何避免这种情况。 - Freeman
插入日期时,它将转换为上述类型:insert into Date(date_Str,Sen_id,doc_id) values(Wed Mar 05 00:00:00 GMT-08:00 2014,1,1) - Freeman
这是一个完全不同的问题。只需提示,使用PreparedStatement.getDate()检索java.sql.Date并将其强制转换为java.util.Date - Buhake Sindi

0

永远不要使用java.sql.Statement来插入数据。始终使用java.sql.PreparedStatment。这是因为这是避免SQL注入的更好方法(请参见this进行解释)。因此,在您的情况下,您可以以这种方式插入日期:

statement = connect.prepareStatement("INSERT INTO test.Date(date, Sen_id, doc_id) VALUES(?, ?, ?)");
statement.setDate(1, new java.sql.Date(date_str.getTime());
statement.setInt(2, sentence_id);
statement.setInt(3, document_id);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接