我需要找到一种方法将带有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')
由于
答案 0 :(得分:13)
在我回答你的问题之前,我想提一下你应该考虑使用某种类型的ORM解决方案(例如,Hibernate),它包含在数据访问层之后。你在做什么似乎是非常反OO。我承认你不知道你的代码的其余部分是什么样的,但一般来说,如果你开始看到自己使用了很多实用程序类,那么你可能采用过于结构化的方法。
要像其他人提到的那样回答您的问题,请查看java.sql.PreparedStatement
,然后使用java.sql.Date
或java.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
。 (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)
The Answer是正确的,应该是已接受的答案。但现在答案已经过时了。
在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::setObject
和ResultSet::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)
答案 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查询中。