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.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
这种方法的另外一个好处是,它会自动为你自动转义你的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::setObject
和ResultSet::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 -
txtdate
是txtdate
的名称
你可以使用这个代码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查询中。