2016-03-10 20 views
0

這個問題是關於從字符串的散列生成預處理語句並處理一些Date,Times和Int字符串。準備好聲明到數據庫設置變量類型處理

我有一個數據庫,這個數據庫的列名存儲在列「列」。

我也有一個hashmap「pdf」,它存儲PDF文檔的字段名和值。

下面的代碼從數據庫中查找與PDF哈希映射相匹配的列名,如果找到,則插入它。

StringJoiner col = new StringJoiner(","); 
StringJoiner val = new StringJoiner(","); 
//First Iteration: Create the Statement 
for(String c : columns) { 
//Your PDF has a matching formfield 
    if(pdf.hasKey(c)) { 
    col.add(c); 
    val.add("?"); 
    } 
} 
String sql = String.format("INSERT INTO table (%s) VALUES (%s)",  col.toString(), val.toString()); 
try(PreparedStatement insert = con.prepareStatement(sql)) { 
    //Insert position in statement 
    int pos = 0; 
    //Second iterations: Bind the values to the statement 
    for(String c : columns) { 
    //Your PDF has a matching formfield 
    if(pdf.hasKey(c)) { 
     insert.setString(++pos, pdf.get(c)); 
    } 
} 
    insert.executeUpdate(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
} 

這很好,但我需要處理一些情況。 PDF格式具有以下字段這是int和日期,時間:

年齡(INT) DOB(日期) 分數(INT) DateStart(日期) TimeStart(時間)

我也想修改數據庫只需要一個單獨的DateTimeStart字段,它可以同時擁有這兩個字段。

現在我也有在用像處理此一展身手:

   if (c.toLowerCase().contains("date")) { 
       System.out.println("A Date field has been found: " +c); 
       DateTimeFormatter formatter = DateTimeFormat.forPattern ("dd/mm/yyyy"); 
       DateTime startdt = formatter.parseDateTime(pdf.get(c)); 
       insert.setDate(++pos, startdt); 
      } 
      if (pdf.containsKey(c) && !c.toLowerCase().contains("date")) { 
       insert.setString(++pos, pdf.get(c)); 
      } 

但是,這並不工作。對於初學者,setDate不接受DateTime對象,即使它們只包含日期。同時試圖讓我的頭腦與數據庫現在只包含「DateTimeStart」而不是「DateStart」和「TimeStart」的新預備聲明讓我頭疼。

任何幫助在這裏將不勝感激。自從Java7以來,我已經在使用Joda了。

乾杯

-Al

   if (c.toLowerCase().contains("date")) { 
        System.out.println("A Date field has been found: " +c); 
        DateTimeFormatter formatter = DateTimeFormat.forPattern("dd/mm/yyyy kk:mm"); 
        long millis = formatter.parseMillis(pdf.get("DateStart") +" " +pdf.get("TimeStart")); 
        Timestamp timeStamp = new Timestamp(millis); 
        insert.setTimestamp(++pos, timeStamp); 
      } 

回答

1

標準JDBC接受日期/時間只是作爲

java.sql.Date  (date only) 
java.sql.Time  (date/time with 1 second resolution) 
java.sql.Timestamp (date/time with fractional second resolution) 

情況下,你必須轉換喬達對象到其中的一個,並使用正確的方法(setDatesetTimesetTimestampPreparedStatement

+0

謝謝@Jim所以它會出現我需要使用setTimestamp做插入? –

+1

我認爲這就是我在我的答案中所說的......您可以選擇您想要的精度,將您的時間戳轉換爲'java.sql'類之一,並在PreparedStatement上使用正確的'set'方法。 –

+0

感謝@Jim所以我最終會將我的DateTime作爲毫秒時間值存儲在數據庫(MS Access)中。 這是漂亮的用戶不友好嗎? 仍在研究如何將我的日期字符串轉換爲JDBC接受的毫秒值。 –