Prepared Statement to DB设置变量类型处理

Prepared Statement to DB setting variable type handling

这道题是关于从字符串的散列生成准备语句并处理一些日期、时间和 Int 的字符串。

我有一个数据库,这个数据库的列名存储在列表"columns"。

我还有一个 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 和 Date, Time:

年龄(国际) 出生日期(日期) 得分(国际) 日期开始(日期) 时间开始(时间)

我还想将数据库修改为只有一个 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" 让我头疼。

如有任何帮助,我们将不胜感激。我已经在使用 Joda,因为它 Java7.

干杯

-铝

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

标准 JDBC 仅接受 date/time 作为

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

您必须将您的 Joda 对象转换为其中之一,并在 PreparedStatement.[=15 上使用正确的方法(setDatesetTimesetTimestamp) =]