准备语句到DB设置变量类型处理

时间:2016-03-10 21:02:31

标签: java date prepared-statement jodatime

这个问题与从字符串散列生成预备语句并处理Date,Times和Int的一些字符串有关。

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

我也有一个hashmap" pdf"它存储PDF文档中的字段名和值。

下面的代码根据pdf hashmap查找数据库中匹配的列名,如果找到则插入它。

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:

年龄(国际) 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"和#34; 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 个答案:

答案 0 :(得分: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)

您必须将您的Joda对象转换为其中之一,并在setDate上使用正确的方法(setTimesetTimestampPreparedStatement)。