Javadate – 插入数据库

我需要找出一种方法来插入一个java.util.Date字段的logging到数据库中,我卡住了。

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

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()); 

但是,当我运行这样的东西,我得到错误:date时间值的string表示forms的语法是不正确的。

下面是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') 

谢谢

当然, PreparedStatement会使你的代码更好,但是为了回答你的问题,你需要告诉DBMS你的string表示的date格式。 在Oracle中(您不指定数据库供应商)使用TO_DATE()函数将stringdate转换为Date

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

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

为了回答你的问题,正如其他人所提到的,查看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 

这种方法的另外一个好处是,它会自动为你自动转义你的string(例如,如果要插入姓“O'Brien”的人,那么你的原始实现会遇到问题)。

PreparedStatement的

你一定要使用PreparedStatement 。 ( 教程 )

这样你可以调用:

 pstmt.setDate( 1, aDate ); 

JDBC驱动程序将执行适合您的特定数据库的date时间处理。

另外,PreparedStatement可以阻止任何SQL注入攻击 – 非常重要! ( 幽默 )

它应该是这样的:

 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驱动程序将为您创build正确的SQL语法。

检索

检索Date对象时,可以使用SimpleDateFormat创builddate时间值的格式化string表示forms。

这里是一个简单的示例行,但更多地searchStackOverflow。

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

OscarRyz 的答案是正确的,应该是被接受的答案。 但是现在这个答案已经过时了。

java.time

在Java 8和更高版本中,我们有了新的java.time包 (受Joda-Time的启发,由JSR 310定义,附带教程 ,由ThreeTen-Extra项目扩展)。

避免旧的date时间类

旧的java.util.Date/.Calendar,SimpleDateFormat和java.sql.Date类是一个混乱的混乱。 首先,juDate具有date时间,而jsDate只有date而没有时间。 哦,除了jsDate只假装没有时间。 作为juDate的一个子类,jsDateinheritance了每天的时间,但会自动调整时间到午夜( 00:00:00.000 )。 混乱? 是。 坦率地说,糟糕的黑客攻击。

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

LocalDate

在java.time中, LocalDate类干净地表示只有date的值,没有任何时间或时区。 这就是我们这个问题解决scheme所需要的。

为了获得LocalDate对象,我们parsinginputstring。 但不是使用旧的SimpleDateFormat类,java.time在java.time.format包中提供了一个新的DateTimeFormatter类。

 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.timetypes。

 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 )

在兄弟姐妹的示例代码通过回答OscarRyz ,用它replace它的“sqlDate =”行:

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

如果你正在使用MySQL ..你可以保存date为“2009-12-31”例如。

update person set birthday_date ='2009-12-31'

但我更喜欢使用jdbc,但您必须创buildjava.sql.Date …

*date在这个世界是邪恶的… 🙂

使用预准备的语句,他们有方法来为每个本地Javatypes正确设置参数。

看看setDate的api和例子

您应该使用java.sql.Timestamp而不是java.util.Date。 另外使用PreparedStatement可以节省您对格式化的担心。

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

这是我用来保存date到数据库使用jdbc工作正常的代码

  • pst是一个准备pst的variables
  • txtdatetxtdate的名称

你可以使用这个代码date和时间是24小时

 INSERT INTO TABLE_NAME( date_column )values( TO_DATE('2016-10-05 10:53:56', 'SYYYY-MM-DD HH24:MI:SS') ) 
 VALUES ('"+user+"' , '"+FirstTest+"' , '"+LastTest+"'..............etc) 

您可以使用它来将variables插入到SQL查询中。