【发布时间】:2016-03-10 21:02:30
【问题描述】:
这个问题是关于从字符串散列生成preparedstatement并处理一些字符串,包括日期、时间和整数。
我有一个数据库,这个数据库的列名存储在列表“columns”中。
我还有一个哈希图“pdf”,它存储 PDF 文档中的字段名和值。
下面的代码根据 pdf hashmap 从 DB 中查找匹配的列名,如果找到则插入它。
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(日期) 分数(智力) 日期开始(日期) 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。
干杯
-铝
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);
}
【问题讨论】:
标签: java date prepared-statement jodatime