[英]Java Date - Insert into database
我需要找到一種方法將帶有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')
謝謝
在我回答你的問題之前,我想提一下你應該考慮使用某種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”的人,你的原始實現就會出現問題)。
你絕對應該使用PreparedStatement
。 ( 教程 )
這樣你就可以調用:
pstmt.setDate( 1, aDate );
JDBC驅動程序將執行適合您的特定數據庫的日期時間處理。
此外,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驅動程序將為您創建正確的SQL語法。
檢索Date對象時,可以使用SimpleDateFormat創建日期時間值的格式化字符串表示形式。
這是一個快速示例行,但搜索StackOverflow 還有更多。
String s = new SimpleDateFormat("dd/MM/yyyy").format( aDate );
當然, PreparedStatement
會使您的代碼更好,但要回答您的問題,您需要告訴DBMS您的字符串表示形式的日期。 在Oracle(您沒有命名數據庫供應商)中,使用TO_DATE()
函數將字符串日期轉換為Date
:
INSERT INTO TABLE_NAME(
date_column
)values(
TO_DATE('06/06/2006', 'mm/dd/yyyy')
)
OscarRyz 的答案是正確的,應該是已接受的答案。 但現在答案已經過時了。
在Java 8及更高版本中,我們有了新的java.time包 (受Joda-Time的啟發,由JSR 310定義,帶有教程 ,由ThreeTen-Extra項目擴展)。
舊的java.util.Date/.Calendar,SimpleDateFormat和java.sql.Date類是一個令人困惑的混亂。 一方面,juDate有日期和時間,而jsDate只有日期, 沒有時間。 哦,除了jsDate只假裝沒有時間。 作為juDate的子類,jsDate繼承了時間,但會自動將該時間調整為午夜( 00:00:00.000
)。 混亂? 是。 坦白說,這是一個糟糕的黑客。
出於這個原因和更多原因,應該避免使用那些舊類,只能使用最后的手段。 盡可能使用java.time,使用Joda-Time作為后備。
LocalDate
在java.time中, LocalDate
類干凈地表示沒有任何時間或時區的僅日期值。 這就是本課題解決方案所需要的。
要獲取該LocalDate對象,我們解析輸入字符串。 但是,java.time不是使用舊的SimpleDateFormat
類,而是在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.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 )
。
在由OscarRyz兄弟回答的示例代碼中,用這個替換它的“sqlDate =”行:
java.sql.Date sqlDate = java.sql.Date.valueOf( localDate ) ;
如果你使用的是mysql,你可以將日期保存為“2009-12-31”。
更新人設置birthday_date ='2009-12-31'
但我更喜歡使用jdbc,雖然你必須創建java.sql.Date ...
*日期在這個世界上是一種邪惡...... :)
您應該使用java.sql.Timestamp而不是java.util.Date。 使用PreparedStatement還可以避免擔心格式化問題。
pst.setDate(6, new java.sql.Date(txtDate.getDate().getTime()));
這是我用來將日期保存到數據庫中的代碼,使用jdbc對我來說很好
pst
是預備pst
的變量 txtdate
是txtdate
的名稱 你可以使用這段代碼的日期和時間是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)
您可以使用它將變量插入到sql查詢中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.