Java Date - 插入数据库

时间:2009-07-04 00:54:24

标签: java sql date

我需要找到一种方法将带有java.util.Date字段的记录插入到数据库中,然后我就卡住了。

有谁知道我怎么做到这一点? 现在我有类似的东西。

        java.util.Date myDate = new java.util.Date("01/01/2009");

        sb.append("INSERT INTO USERS");
        sb.append("(USER_ID, FIRST_NAME, LAST_NAME, SEX, DATE) ");
        sb.append("VALUES ( ");
        sb.append("  '" + userId + "'");
        sb.append(", '" + myUser.GetFirstname() + "' ");
        sb.append(", '" + myUser.GetLastname() + "' ");
        sb.append(", '" + myUser.GetSex() + "' ");
        sb.append(", '" + myDate  + "'");
        sb.append(")");

        Util.executeUpdate(sb.toString());

但是当我运行这样的东西时,我得到错误:     日期时间值的字符串表示的语法不正确。

下面是sql语句的内容:

INSERT INTO USERS (USER_ID
    , FIRST_NAME
    , LAST_NAME
    , SEX
    , CRDATE) 
VALUES (   
    'user'
    , 'FirstTest' 
    , 'LastTest' 
    , 'M'
    , 'Thu Jan 01 00:00:00 CST 2009')

由于

10 个答案:

答案 0 :(得分:13)

在我回答你的问题之前,我想提一下你应该考虑使用某种类型的ORM解决方案(例如,Hibernate),它包含在数据访问层之后。你在做什么似乎是非常反OO。我承认你不知道你的代码的其余部分是什么样的,但一般来说,如果你开始看到自己使用了很多实用程序类,那么你可能采用过于结构化的方法。

要像其他人提到的那样回答您的问题,请查看java.sql.PreparedStatement,然后使用java.sql.Datejava.sql.Timestamp。类似的东西(尽可能多地使用原始代码,你可能想要更改它):

java.util.Date myDate = new java.util.Date("10/10/2009");
java.sql.Date sqlDate = new java.sql.Date(myDate.getTime());

sb.append("INSERT INTO USERS");
sb.append("(USER_ID, FIRST_NAME, LAST_NAME, SEX, DATE) ");
sb.append("VALUES ( ");
sb.append("?, ?, ?, ?, ?");
sb.append(")");

Connection conn = ...;// you'll have to get this connection somehow
PreparedStatement stmt = conn.prepareStatement(sb.toString());
stmt.setString(1, userId);
stmt.setString(2, myUser.GetFirstName());
stmt.setString(3, myUser.GetLastName());
stmt.setString(4, myUser.GetSex());
stmt.setDate(5, sqlDate);

stmt.executeUpdate(); // optionally check the return value of this call

这种方法的另一个好处是它会自动为你的字符串转义(例如,如果要插入姓氏为“O'Brien”的人,你的原始实现就会出现问题)。

答案 1 :(得分:8)

的PreparedStatement

你绝对应该使用PreparedStatement。 (Tutorial

这样你可以调用:

pstmt.setDate( 1, aDate );

JDBC driver将执行适合您特定数据库的日期时间处理。

此外,PreparedStatement会停止任何SQL injection黑客攻击 - 非常重要!humor

它应该是这样的:

SimpleDateFormat format = new SimpleDateFormat( "MM/dd/yyyy" );  // United States style of format.
java.util.Date myDate = format.parse( "10/10/2009" );  // Notice the ".util." of package name.

PreparedStatement pstmt = connection.prepareStatement(
"INSERT INTO USERS ( USER_ID, FIRST_NAME, LAST_NAME, SEX, DATE ) " +
" values (?, ?, ?, ?, ? )");

pstmt.setString( 1, userId );
pstmt.setString( 3, myUser.getLastName() ); 
pstmt.setString( 2, myUser.getFirstName() ); // please use "getFir…" instead of "GetFir…", per Java conventions.
pstmt.setString( 4, myUser.getSex() );
java.sql.Date sqlDate = new java.sql.Date( myDate.getTime() ); // Notice the ".sql." (not "util") in package name.
pstmt.setDate( 5, sqlDate ); 

就是这样,JDBC驱动程序将为您创建正确的SQL语法。

检索

检索Date对象时,可以使用SimpleDateFormat创建日期时间值的格式化字符串表示形式。

这是一个快速示例行,但搜索StackOverflow 许多更多。

String s = new SimpleDateFormat("dd/MM/yyyy").format( aDate ); 

答案 2 :(得分:7)

当然,PreparedStatement会使您的代码更好,但要回答您的问题,您需要告诉DBMS您的字符串表示形式的日期。在Oracle中(您没有为数据库供应商命名),使用Date函数将字符串日期转换为TO_DATE()

INSERT INTO TABLE_NAME(
  date_column
)values(
  TO_DATE('06/06/2006', 'mm/dd/yyyy')
)

答案 3 :(得分:2)

OscarRyz的

The Answer是正确的,应该是已接受的答案。但现在答案已经过时了。

java.time

在Java 8及更高版本中,我们有新的java.time package(由Joda-Time启发,由JSR 310定义,tutorial,由ThreeTen-Extra项目扩展)。

避免旧的日期时间类

旧的java.util.Date/.Calendar,SimpleDateFormat和java.sql.Date类是一个令人困惑的混乱。首先,j.u.Date的日期为,而j.s.Date仅为日期,不含时间。哦,除了j.s.Date只有假装没有时间。作为j.u.Date的子类,j.s.Date继承了时间,但会自动将该时间调整为午夜(00:00:00.000)。混乱?是。坦白说,这是一个糟糕的黑客。

由于这个以及更多的原因,应该避免使用那些旧类,只能使用最后的手段。尽可能使用java.time,Joda-Time作为后备。

LocalDate

在java.time中,LocalDate类干净地表示没有任何时间或时区的仅日期值。这就是本课题解决方案所需要的。

要获取LocalDate对象,我们解析输入字符串。但是,而不是使用旧的SimpleDateFormat类,java.time在DateTimeFormatter中提供了一个新的java.time.format package类。

String input = "01/01/2009" ;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MM/dd/yyyy" ) ;
LocalDate localDate = LocalDate.parse( input, formatter ) ;

符合JDBC 4.2或更高版本的JDBC驱动程序可以通过PreparedStatement::setObjectResultSet::getObject方法直接使用java.time类型。

PreparedStatement pstmt = connection.prepareStatement(
    "INSERT INTO USERS ( USER_ID, FIRST_NAME, LAST_NAME, SEX, DATE ) " +
    " VALUES (?, ?, ?, ?, ? )");

pstmt.setString( 1, userId );
pstmt.setString( 3, myUser.getLastName() ); 
pstmt.setString( 2, myUser.getFirstName() ); // please use "getFir…" instead of "GetFir…", per Java conventions.
pstmt.setString( 4, myUser.getSex() );
pstmt.setObject( 5, localDate ) ;  // Pass java.time object directly, without any need for java.sql.*. 

但是在你有这样一个更新的JDBC驱动程序之前,请使用java.sql.Date类。幸运的是,旧的java.sql.Date类已经被Java 8赋予了一个新的方便的转换静态方法valueOf( LocalDate )

the sibling Answer by OscarRyz的示例代码中,将其“sqlDate =”替换为此行:

java.sql.Date sqlDate = java.sql.Date.valueOf( localDate ) ;

答案 4 :(得分:1)

如果你使用的是mysql,你可以将日期保存为“2009-12-31”。

更新人设置birthday_date ='2009-12-31'

但我更喜欢使用jdbc,尽管你必须创建java.sql.Date ...

*日期在这个世界上是一种邪恶......:)

答案 5 :(得分:0)

使用预准备语句,它们具有为每种本机Java类型设置正确参数的方法。

查看setDateexamples

的API

答案 6 :(得分:0)

您应该使用java.sql.Timestamp而不是java.util.Date。 使用PreparedStatement也可以避免担心格式化问题。

答案 7 :(得分:0)

pst.setDate(6, new java.sql.Date(txtDate.getDate().getTime()));

这是我用来将日期保存到数据库中的代码,使用jdbc可以正常使用

  • pst是preparedstatement的变量
  • txtdate是JDateChooser的名称

答案 8 :(得分:0)

你可以使用这段代码的日期和时间是24小时

INSERT INTO TABLE_NAME(
  date_column
)values(
  TO_DATE('2016-10-05 10:53:56', 'SYYYY-MM-DD HH24:MI:SS')
)

答案 9 :(得分:-1)

VALUES ('"+user+"' , '"+FirstTest+"'  , '"+LastTest+"'..............etc)

您可以使用它将变量插入到sql查询中。