簡體   English   中英

Java Date - 插入數據庫

[英]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.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”的人,你的原始實現就會出現問題)。

PreparedStatement的

你絕對應該使用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.time

在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::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 )

由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類型設置正確參數的方法。

查看setDate示例的api

您應該使用java.sql.Timestamp而不是java.util.Date。 使用PreparedStatement還可以避免擔心格式化問題。

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

這是我用來將日期保存到數據庫中的代碼,使用jdbc對我來說很好

  • pst是預備pst的變量
  • txtdatetxtdate的名稱

你可以使用這段代碼的日期和時間是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM